邢柳
北京航天長征科技信息技術(shù)研究所 北京 100076
Linux的系統(tǒng)調(diào)用的函數(shù)指針存放在系統(tǒng)調(diào)用符號表(sys_call_table)中。通過一些特殊的手段,我們可以更改其中系統(tǒng)地址的指針將系統(tǒng)調(diào)用引導(dǎo)到自己的程序代碼中,從而實現(xiàn)特定功能。使用LKM替換系統(tǒng)調(diào)用,我們可以在不重新編譯內(nèi)核的情況下,為Linux系統(tǒng)增加或完成一些特殊形式的功能。
文件系統(tǒng)的屬性對于提高文件系統(tǒng)的安全性和保障文件系統(tǒng)的完整性(尤其對于系統(tǒng)日志文件)有很大的作用。chattr正是設(shè)置文件系統(tǒng)屬性的用戶接口命令。注意,該命令的使用必須是root用戶,其他用戶即使是文件的所有者對該文件使用chattr命令也會顯示“不允許的操作”的錯誤提示。系統(tǒng)管理員把系統(tǒng)的重要文件添加上隱藏屬性,以防止系統(tǒng)重要文件被刪除或篡改。比如使用了命令:
chattr + a message.txt
對message.txt文件設(shè)置了append屬性后,系統(tǒng)只允許在這個文件末尾追加數(shù)據(jù),不允許任何進程覆蓋、截斷或者刪除這個文件。實驗結(jié)果顯示,message.txt只能被添加,而不準修改。
在Linux系統(tǒng)中,如果一個用戶以root的權(quán)限登錄,文件系統(tǒng)的權(quán)限控制將無法對root用戶和以root權(quán)限運行的進程進行任何的限制。這樣對于Linux操作系統(tǒng),如果攻擊者通過遠程或者本地攻擊獲得root權(quán)限將可能對系統(tǒng)造成嚴重的破壞。而ext2文件系統(tǒng)可以作為最后道防線,最大限度地減小系統(tǒng)被破壞的程度,并保存攻擊者的行蹤。ext2屬性是由 sys_open()和 sys_truncate()等系統(tǒng)調(diào)用檢查和賦予的,不受用戶識別號和其他因素的影響,在任何情況下,對具有不可修改(immutable)屬性的文件的進行任何修改都會失敗,不管是否是root用戶進行的修改。
如果root用戶去掉了文件的隱藏屬性,就可以對該文件進行任意的刪除、修改等操作。本文對系統(tǒng)進行的保護措施是:先對系統(tǒng)重要文件設(shè)置隱減屬性,然后加載本文提出的安全保護模塊。目的是使root用戶也不能更改文件的隱藏屬性,即不能篡改要保護的文件。從而保證系統(tǒng)重要文件不被破壞和刪除。
眾所周知,Linux內(nèi)核中有大量安全特征,其中有很多特征有著廣泛的應(yīng)用,但是絕大多數(shù)的系統(tǒng)管理員(包括一些資深系統(tǒng)管理員)都忽略了 ext2文件系統(tǒng)的隱藏屬性(attribute)。Linux的這種安全特征甚至遠沒有Lids和Tripwire等外部安全工具受關(guān)注,但是使用這個特征可以很好地保護系統(tǒng)的安全。從Linux的1.1系列內(nèi)核開始,ext2文件系統(tǒng)就開始支持一些針對文件和目錄的額外標記或者叫做屬性(attribute)。ext2文件系統(tǒng)支持表1列出的屬性設(shè)置。
在這些屬性中,最為重要的是a(Append Only)屬性和不可修改(immutable)屬性,它們對于提高文件系統(tǒng)的安全性和保障文件系統(tǒng)的完整性(尤其對于系統(tǒng)日志文件)有很大的作用。另外,由于ext3文件系統(tǒng)是以ext2文件系統(tǒng)為基礎(chǔ)的,因此所有ext2文件系統(tǒng)支持的屬性,ext3文件系統(tǒng)也都支持。
替換系統(tǒng)調(diào)用就是我們自己構(gòu)造一個系統(tǒng)調(diào)用,想辦法使 sys_call_table相應(yīng)的系統(tǒng)調(diào)用號指向我們自己構(gòu)造的函數(shù)。在原來的2.4內(nèi)核里,可以將sys_call_table直接導(dǎo)出,這樣我們就很容易拿到sys_call_table的控制權(quán)來實現(xiàn)系統(tǒng)調(diào)用的替換,但是從2.6的版本以后,考慮到安全問題不允許將sys_call_table再導(dǎo)出,這樣就加大了取得syscall_table控制權(quán)的難度。下面討論獲取sys_call_table地址的方法。
在內(nèi)核代碼中存在許多符號(symbol),特別是大量的全局符號,內(nèi)核通過它的地址,如c02f94a0這樣的符號來使用變量,但是直接使用地址來引用變量又給內(nèi)核編程帶來了很大困難,所以內(nèi)核提供了一種折中的方案,即將每個符號和其對應(yīng)的地址保存在一個文件中,這樣既可在編程開發(fā)時使用符號,又可以方便的得到其地址。System.map就是保存這種對應(yīng)關(guān)系的文件。它通常位于/boot/System.map,在其內(nèi)部記錄了內(nèi)核各個符號的內(nèi)存定位信息。通過文本文件搜索,我們可以獲取sys_call_table的地址,并作為LKM模塊加載時的傳遞參數(shù)。
vmlinuz是可引導(dǎo)的、壓縮的內(nèi)核,其中“vm”代表“Virtual Memory”,通常位于/boot/vmlinuz,一般是在編譯內(nèi)核時通過“make zImage”創(chuàng)建或make bzImage創(chuàng)建,然后通過拷貝產(chǎn)生,在開頭部分內(nèi)嵌有g(shù)zip解壓縮代碼。由內(nèi)核文件中包含的一個微型的 gzip用于解壓縮內(nèi)核并引導(dǎo)它。vmlinux是未壓縮的內(nèi)核,vmlinuz是vmlinux的壓縮文件。通過shell命令:grep sys_call_table/boot/System.map或nm vmlinux grep sys_call_table就可以獲得sys_call_table的地址。
替換系統(tǒng)調(diào)用可以通過中斷向量取得 sys_call_table地址?;舅悸肥沁@樣的,因為系統(tǒng)調(diào)用都是通過 0x80中斷來進行的,故可以通過查找 0x80中斷的處理程序來獲得sys_call_table的地址。其基本步驟是,首先獲取中斷描述符表的地址,再從中查找 0x80中斷的服務(wù)例程,再搜索該例程的內(nèi)存空間,以從其中獲取sys_call_table的地址。
chattr命令最終執(zhí)行進sys_ioctl()系統(tǒng)調(diào)用里,所以,我們替換調(diào)用原有的sys_ioctl()函數(shù)。在新的sys_ioctl()函數(shù)里面,根據(jù)傳進的參數(shù)進行判斷,如果用戶輸入的是要求改寫文件屬性的chattr命令,那么就可以通過dbgprint函數(shù)調(diào)用printk,輸出信息到環(huán)形buffer,該信息由klogd取出,交給syslogd存到系統(tǒng)日志文件/.var/log/messages里面,管理員查看該日志,會發(fā)現(xiàn)有人想要執(zhí)行該操作,根據(jù)該信息輸出的時間,能判斷出是否合法用戶在執(zhí)行這條命令。
本文的測試環(huán)境是Fedora core 5。在模塊hijack.ko里面,通過替換sys_ioctl()系統(tǒng)調(diào)用,實現(xiàn)了監(jiān)控 root用戶修改文件隱藏屬性功能。測試步驟如表2所示。
表2 監(jiān)控特權(quán)命令chattr測試步驟
本文使用LKM替換系統(tǒng)調(diào)用,實現(xiàn)監(jiān)控特權(quán)命令的執(zhí)行。以監(jiān)控chattr命令執(zhí)行為例。本文的安全實現(xiàn)前提是,系統(tǒng)管理員把系統(tǒng)的重要文件添加上隱藏屬性,以防止系統(tǒng)重要文件被刪除或篡改。設(shè)置完各種隱藏屬性后,安裝hijack模塊,防止不法用戶獲取到root口令,破壞系統(tǒng)重要文件。
[1]李善平,季江民,尹康凱.邊干邊學(xué)—Linux內(nèi)核指導(dǎo)(第二版)[M].杭州:浙江大學(xué)出版社.2008.
[2]倪繼利.Linux安全體系分析與編程[M].北京:電子工業(yè)出版社.2007.
[3]趙亮.探索Linux內(nèi)核級安全增強系統(tǒng)[J].開放系統(tǒng)世界.2003.
[4]王艷麗.淺談Linux用戶管理[J].電子科技.2010.
[5]曹云鵬.關(guān)于 Linux操作系統(tǒng)用戶管理的研究[J].科技情報開發(fā)與經(jīng)濟.2003.
[6]陳向陽,方漢.Linux實用大全[M].北京:科學(xué)出版社.1998.