Linux核心即時入侵檢測安全增強-防止緩衝區溢位的核心補丁(轉)

ba發表於2007-08-15
Linux核心即時入侵檢測安全增強-防止緩衝區溢位的核心補丁(轉)[@more@]三.防止緩衝區溢位的核心補丁
冰塊
   這一部分我們來描述一個對系統安全有很大危害的緩衝區溢位的Linux核心補丁。

3.1 緩衝區溢位漏洞攻擊

  在C語言中對佇列資源的限制很容易讓一個記憶體溢位。有很多廣為人知的方法來利用緩衝區溢位的漏洞來對系統進行攻擊。他們可以利用緩衝區溢位的漏洞來向系統內插入一些惡意的系統命令操作,就可以得到一個特權的shell,從而對系統進行控制。主要就是利用攻擊由root或是administrator執行的程式,插入一些命令,而這些命令就有了root的執行許可權。

   一個root的程式可以劃分為以下的幾種型別:

互動式的:這是一個標準的超級使用者程式。使用者ID(UID)和有效使用者ID(SUID)都為0。對於這個使用者沒有什麼許可權問題,因為使用者已經取得了對系統的所有控制許可權。
後臺:這個主要是指在系統啟動的時候生成的root使用者級別執行的程式後臺程式。雖然對這方面的技術比較複雜,但是大多數時候也可以利用來進行緩衝區溢位漏洞的攻擊。
Setuid程式:這樣的程式有一隊使用者的標記(UID,EUID),並且值都應該是大於-的。所以一個setuid到root的程式表明下面的一個宏定義。
   #define IS_SETUID_TO_ROOT(proc) !((proc)->euid)&&(proc)->uid

   對於這個宏不同的系統可能有不同的定義。

   在下面的內容裡,我們將會討論在核心中什麼樣的root程式可以被馬上識別出來。

3.2 後臺的root程式

   只有一個Unix系統才會有root程式在後臺執行。大多數情況下,系統管理員不會去直接開啟他們也不會控制他們的執行,所以,象我們前面提到的一樣,這樣的特權程式就會被當作緩衝區溢位漏洞攻擊的主要目標。大概可以分成下面幾種型別:

後臺程式都是在系統系統的時候直接由初始化指令碼執行的。就象網路伺服器中的inetd超級伺服器程式那樣,裡面有web伺服器,mail伺服器(主要是sendmail)就是利用這樣的方式來啟動的。另外一個這樣的例子就是syslogd後臺程式。
網路伺服器由inetd超級伺服器啟動來履行如遠端訪問(telnet),檔案傳輸(ftp)等等的服務。
程式執行啟動一個特定的後臺程式,大多數都是在系統啟動的時候執行。(屬於型別級別1。)
程式是在未來的特定時間用at命令來啟動的。實際上這些程式可以認為是特定型別的級別分類。
程式是在互動的會話時刻在後臺執行的。這些都是某些特定的原因才應用的。
   這些程式一般來說都沒有一個控制終端。為了告訴它們不在程式互動的模式下執行,我們可以利用下面的宏定義。

   #define IS_A_ROOT_RAEMON(proc) !((proc)->euid)&&((proc)->tty==NULL)

   這裡,我們首先檢查程式是否是以root級別來執行的,然後我們檢查這個程式是否有一個控制終端。

3.3 系統呼叫的工具

   為了防止危險的緩衝區溢位漏洞的攻擊,有一些簡單的簡單程式碼加入到以下的幾個系統呼叫中去。

Execve(executable-file,…):這個系統呼叫允許一個嵌入的setuid程式來呼叫一個互動的shell外殼。為了阻止這樣的呼叫和其他的簡單攻擊,我們定義了一個原始的檢查,來確定這個呼叫的程式是不是擁有root的許可權。如果沒有,就不再繼續進行檢查,這個系統呼叫可以繼續執行,就忽略擷取系統呼叫的其他動作。如果呼叫的系統呼叫有root的許可權,進一步的,setuid為root,那麼這個訪問控制資料庫就要決定證明是否這個引數executable-file是否可以被setuid程式呼叫。如果接受了的話,這個呼叫就繼續進行。除非這個呼叫被入侵處理的子系統禁止拋棄。其他情況下,這些呼叫的情況都會記錄在一個日誌檔案裡面。
Setuid:我們認為任何一個setuid為root或是在後臺以root許可權的程式都是可以作為一個潛在的攻擊目標。對這樣的程式我們用特定的檢查程式來過濾這些系統呼叫。一個setuid的程式是可以在互動模式下,在呼叫其他避免執行setuid程式的系統呼叫之前來執行setuid(0)呼叫的。透過這樣的方式,我們可以跳過所有的我們介紹過的檢查。因為這個原因,我們必須載入一段程式碼來補充setuid系統呼叫來阻止一個setuid程式得到 root的UID許可權。
Chmod:當我們呼叫一個setuid的程式。使用者可以應用Chmod來取得對敏感檔案的寫許可權。(如,密碼檔案)。阻止這樣的和其他相關的攻擊,一個檢查程式碼加到chmod系統呼叫程式碼裡來阻止一個setuid程式對一般檔案或目錄訪問許可權的修改。
Chown:當呼叫一個setuid程式的時候,chown可以用來改變一個可執行檔案的擁有者為root。Chown是一個非常的呼叫,尤其是當他和 chmod一起應用的時候。基於這個原因,我們也加入了一段檢查的程式碼到chown系統呼叫裡面去,來阻止一個setuid程式修改常規檔案或目錄的擁有權。
Chgrp:和chown一樣,來利用chgrp改變組使用者來取得一定的訪問許可權來攻擊系統

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章