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