20169210《Linux内核原理与分析》第十一周作业
第17章 設(shè)備與模塊
關(guān)于設(shè)備驅(qū)動(dòng)和設(shè)備管理,討論四種內(nèi)核成分。
- 設(shè)備類型:在所有的linux系統(tǒng)中為了統(tǒng)一普遍設(shè)備的操作所分的類。
- 模塊:Linux內(nèi)核中用于按需加載和卸載目標(biāo)碼的機(jī)制。
- 內(nèi)核對(duì)象:內(nèi)核數(shù)據(jù)機(jī)構(gòu)中支持面向?qū)ο蟮暮?jiǎn)單操作,還支持維護(hù)對(duì)象間的父子關(guān)系。
- sysfs:表示系統(tǒng)中設(shè)備樹的一個(gè)文件系統(tǒng)
一、設(shè)備類型
在Linux以及所有Unix系統(tǒng)中,設(shè)備被分為一下三種類型:
- 塊設(shè)備
- 字符設(shè)備
- 網(wǎng)絡(luò)設(shè)備
二、模塊
盡管Linux是“單塊內(nèi)核”的操作系統(tǒng),這是說整個(gè)系統(tǒng)內(nèi)核都運(yùn)行于一個(gè)單獨(dú)的保護(hù)域中,但是Linux內(nèi)核是模塊化組成的,它允許內(nèi)核在運(yùn)行時(shí)動(dòng)態(tài)地向其中插入或從中刪除代碼。這些代碼被一并組合在一個(gè)單獨(dú)的二進(jìn)制鏡像中,即所謂的可裝載內(nèi)核模塊中,或簡(jiǎn)稱模塊。支持模塊的好處是基本內(nèi)核鏡像可以盡可能的小,因?yàn)榭蛇x的功能和驅(qū)動(dòng)程序可以利用模塊形式再提供。模塊允許我們方便地刪除和重新載入內(nèi)核代碼,也方便了調(diào)試工作。
三、設(shè)備模型
四、sysfs
sys文件系統(tǒng)是一個(gè)處于內(nèi)存中的虛擬文件系統(tǒng),它為我們提供了kobject對(duì)象層次結(jié)構(gòu)的視圖。
sysfs的訣竅是把kobject對(duì)象與目錄項(xiàng)緊密聯(lián)系起來,這點(diǎn)是通過kobject對(duì)象中的denty字段實(shí)現(xiàn)的。
第19章 可移植性
關(guān)于字長(zhǎng)和數(shù)據(jù)類型的一些準(zhǔn)則:
- ANSIC標(biāo)準(zhǔn)規(guī)定,一個(gè)char的長(zhǎng)度一定是1字節(jié)
- 盡管沒有規(guī)定int類型的長(zhǎng)度是32位,但在Linux當(dāng)前支持的體系結(jié)構(gòu)中,它都是32位的。
- short類型也類似,在當(dāng)前所有支持的體系結(jié)構(gòu)中,雖然沒有明文規(guī)定,但是它都是16位的。
- 絕對(duì)不應(yīng)該假定指針和long的長(zhǎng)度,在linux當(dāng)前支持的體系結(jié)構(gòu)中,它們可以在32位和64位中變化。
- 對(duì)于不同的體系結(jié)構(gòu)long的長(zhǎng)度不同,決不應(yīng)該假設(shè)sizeof(int)=sizeof(long)。
- 類似的,也不要假設(shè)指針和int長(zhǎng)度相等。
要想寫出移植性好、簡(jiǎn)潔、合適的內(nèi)核代碼,要注意以下兩點(diǎn):
編碼盡量選取最小公約數(shù):不要假定給定的內(nèi)核特性是可用的,僅僅需要最小的體系結(jié)構(gòu)功能。
編寫可移植性的代碼需要考慮很多問題:字長(zhǎng)、數(shù)據(jù)類型、填充、對(duì)齊、字節(jié)次序、符號(hào)、字節(jié)順序、頁(yè)大小以及處理器的加載/存儲(chǔ)排序等。對(duì)于絕大多數(shù)的內(nèi)核開發(fā)者來說,可能主要考慮的問題就是保證正確使用數(shù)據(jù)類型。
第20章 補(bǔ)丁,開發(fā)和社區(qū)
Linux編碼風(fēng)格:
- 縮進(jìn)——縮進(jìn)風(fēng)格是用制表位每次縮進(jìn)8個(gè)字符長(zhǎng)度。
- switch語(yǔ)句——switch語(yǔ)句下屬的case標(biāo)記應(yīng)該縮進(jìn)到和switch聲明對(duì)齊,這樣有助于減少8個(gè)字符的tab鍵帶來的排版縮進(jìn)。
- 空格——Linux編碼風(fēng)格規(guī)定,空格放在關(guān)鍵字周圍,函數(shù)名和圓括號(hào)之間無空格。
- 花括號(hào)——內(nèi)核選定的風(fēng)格是左括號(hào)緊跟在語(yǔ)句的最后,與語(yǔ)句在相同的一行。而右括號(hào)要新起一行,作為該行的第一個(gè)字符。
- 每行代碼的長(zhǎng)度——源代碼中要盡可能地保證每行代碼長(zhǎng)度不超過80個(gè)字符,因?yàn)檫@樣做可能使代碼最合適在標(biāo)準(zhǔn)的80*24的終端上顯示。
- 命名規(guī)范——命名中不允許使用駱駝拼寫法、Studly Caps或者其他混合的大小寫字符。
- 函數(shù)——根據(jù)經(jīng)驗(yàn),函數(shù)的代碼長(zhǎng)度不應(yīng)該超過兩屏,局部變量不應(yīng)超過10個(gè)。一個(gè)函數(shù)應(yīng)該功能單一而且實(shí)現(xiàn)精確。
- 注釋——一般情況下應(yīng)該描述的是你的代碼要做什么和為什么要這樣做,而不是具體通過什么方式實(shí)現(xiàn)的。
- typedef——使用typedef要謹(jǐn)慎,只有在確實(shí)需要的時(shí)候再使用它。
- 多用現(xiàn)成的東西——請(qǐng)勿閉門造車。內(nèi)核本身就提供了字符串操作函數(shù),壓縮函數(shù)和一個(gè)鏈表接口,所以請(qǐng)使用他們。
- 在源碼中減少使用ifdef——不贊成在源碼中使用ifdef預(yù)處理指令。
- 結(jié)構(gòu)初始化——結(jié)構(gòu)初始化的時(shí)候必須在他的成員前加上結(jié)構(gòu)標(biāo)識(shí)符。
- 代碼的事后修正——indent是一個(gè)在大多數(shù)Linux系統(tǒng)中都能找到的好工具,它可以按照指定的方式對(duì)源代碼進(jìn)行格式化。
實(shí)驗(yàn)部分
2014年9月24日,Bash中發(fā)現(xiàn)了一個(gè)嚴(yán)重漏洞shellshock,該漏洞可用于許多系統(tǒng),并且既可以遠(yuǎn)程也可以在本地觸發(fā)。
什么是shellshock:Shellshock,又稱Bashdoor,是在Unix中廣泛使用的Bash shell中的一個(gè)安全漏洞,首次于2014年9月24日公開。許多互聯(lián)網(wǎng)守護(hù)進(jìn)程,如網(wǎng)頁(yè)服務(wù)器,使用bash來處理某些命令,從而允許攻擊者在易受攻擊的Bash版本上執(zhí)行任意代碼。Bash (GNU Bourne-Again Shell) 是許多Linux發(fā)行版的默認(rèn)Shell。這可使攻擊者在未授權(quán)的情況下訪問計(jì)算機(jī)系統(tǒng)。
實(shí)驗(yàn)準(zhǔn)備
以root權(quán)限安裝4.1版bash
下載:
# wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz安裝:
# tar xf bash-4.1.tar.gz # cd bash-4.1 # ./configure # make & make install./configure的作用是檢測(cè)系統(tǒng)配置,生成makefile文件,以便你可以用make和make install來編譯和安裝程序。
鏈接:
# rm /bin/bash # ln -s /usr/local/bin/bash /bin/bash到這里就安裝完了,接下來檢測(cè)是否存在shellshock漏洞。
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test "-c參數(shù),則bash從字符串中讀入命令。bash -c "echo this is a test"在執(zhí)行的時(shí)候存在一個(gè)環(huán)境變量x,而x呢等于 () { :;}; echo vulnerable ,我們都知道環(huán)境變量在使用前都會(huì)被初始化,那么 () { :;}; echo vulnerable 就自然而然的被執(zhí)行了。 () { :;}; 定義了一個(gè)函數(shù)(function)并且它什么也不做,而后的 echo vulnerable 被解析后得到了執(zhí)行權(quán)。那么 echo vulnerable 換成其他更具破壞性的代碼后果就不堪設(shè)想了。
輸出vulnerable的話,說明bash有漏洞。
最后,讓/bin/sh 指向/bin/bash.
$ sudo ln -sf /bin/bash /bin/sh-s是創(chuàng)建軟連接,-f是強(qiáng)制創(chuàng)建,軟連接相當(dāng)于一個(gè)快捷方式。
了解bash自定義函數(shù),只需要函數(shù)名就能夠調(diào)用該函數(shù)。
$ foo() { echo bar; } $ foo > bar這個(gè)時(shí)候的Bash的環(huán)境變量:
KEY = foo VALUE = () { echo bar; }用$ echo 查看環(huán)境變量。
來看看ShellShock漏洞的真身:
export設(shè)置環(huán)境變量。
為什么調(diào)用bash的時(shí)候輸出Hello World了呢?瞧瞧他內(nèi)部的情況:
KEY = foo VALUE = () { :; }; echo Hello Worldbash讀取了環(huán)境變量,在定義foo之后直接調(diào)用了后面的函數(shù)。 一旦調(diào)用bash,自定義的語(yǔ)句就直接觸發(fā)。
攻擊Set-UID程序
本實(shí)驗(yàn)中,我們通過攻擊Set-UID程序來獲得root權(quán)限。Set-UID 是Unix系統(tǒng)中的一個(gè)重要的安全機(jī)制。當(dāng)一個(gè)Set-UID程序運(yùn)行的時(shí)候,它被假設(shè)為具有擁有者的權(quán)限。例如,如果程序的擁有者是root,那么任何人運(yùn)行這個(gè)程序時(shí)都會(huì)獲得程序擁有者的權(quán)限。 一個(gè)文件都有一個(gè)所有者, 表示該文件是誰(shuí)創(chuàng)建的。同時(shí), 該文件還有一個(gè)組編號(hào), 表示該文件所屬的組, 一般為文件所有者所屬的組。setuid: 設(shè)置使文件在執(zhí)行階段具有文件所有者的權(quán)限。典型的文件是 /usr/bin/passwd. 如果一般用戶執(zhí)行該文件, 則在執(zhí)行過程中, 該文件可以獲得root權(quán)限, 從而可以更改用戶的密碼。首先,確保安裝了帶有漏洞的bash版本,并讓/bin/sh 指向/bin/bash.
請(qǐng)編譯下面這段代碼,并設(shè)置其為Set-UID程序,保證它的所有者是root。我們知道system()函數(shù)將調(diào)用"/bin/sh -c" 來運(yùn)行指定的命令, 這也意味著/bin/bash 會(huì)被調(diào)用。
#include <stdio.h> void main() {setuid(geteuid()); // make real uid = effective uid.system("/bin/ls -l"); }system:運(yùn)行外部函數(shù)。real UID是標(biāo)記誰(shuí)調(diào)用了該可執(zhí)行文件;effective UID表示該可執(zhí)行程序所具有的權(quán)限的用戶;默認(rèn)情況下real UID和effective UID一樣,但是當(dāng)使用了setUID之后,兩者有可能不一樣。例如passwd程序,當(dāng)你執(zhí)行這個(gè)程序的時(shí)候,它的real UID就是調(diào)用passwd的用戶,這個(gè)用戶可能是root,也可能是任何普通用戶;但是它的effective UID是root,只有這樣passwd程序才能修改/etc/passwd文件。
我們注意到這里使用了setuid(geteuid()) 來使real uid = effective uid。
如果 setuid(geteuid()) 語(yǔ)句被去掉了,再試試看攻擊,我們還能夠拿到權(quán)限么?
#include <stdio.h> void main() {system("/bin/ls -l"); }失敗了!這就說明如果 real uid 和 effective uid 相同的話,定義在環(huán)境變量中的內(nèi)容在該程序內(nèi)有效,那樣shellshock漏洞就能夠被利用了。但是如果兩個(gè)uid不同的話,環(huán)境變量失效,就無法發(fā)動(dòng)攻擊了。
轉(zhuǎn)載于:https://www.cnblogs.com/crisgy/p/6130648.html
總結(jié)
以上是生活随笔為你收集整理的20169210《Linux内核原理与分析》第十一周作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (HDU)1056 --HangOver
- 下一篇: md5-linux_shell