Linux和Unix安全編程HOWTO——小心對其它資源的調用出口

來源:互聯網
上載者:User

轉自:http://man.chinaunix.net/tech/secure_programs_howto_cn/c711.html

限制調用出口為合法值

要 保證調用其它程式的出口只允許每個參數的合法而且期望的值。聽起來不難,但實現起來就難得多了,因為有很多庫調用或命令會以潛在的令人驚異的方式調用低級 常式。例如,若干popen(3)和system(3)一類的系統調用通過調用命令shell來實現,也就是說,它們會受到shell逸出字元的影響。同 樣,execlp(3)和execvp(3)也可能會調用shell。很多指南建議在產生一個進程時完全避免使用popen(3)、system(3)、 execlp(3)和execvp(3),直接用C中的execve(3)[Galvin 1998b]。至少應該避免在可以使用execve(3)時使用system(3);因為system(3)使用shell來擴充字元,對於惡作劇者來說 system(3)會提供更多機會。Perl和shell的backtick(`)也以同樣的方式調用命令shell;參見Perl一節。

這 個問題最令人頭疼的例子就是shell逸出字元。標準的類Unix命令shell(儲存在/bin/sh)對許多字元有特別的解釋。如果這些字元被傳遞給 shell,那麼除非被忽略,都將使用它們的特殊解釋;這一事實可被用來破壞程式。按照WWW安全FAQ[Stein 1999, Q37],這些逸出字元是:

& ; ` ' \ " | * ? ~ < > ^ ( ) [ ] { } $ \n \r

不幸的是,這並非實際存在的所有逸出字元。下面是可能出問題是一些其它字元:

  • “!” 在運算式裡意味著“否”(就象在C語言裡一樣);如果程式的傳回值被檢測,預先考慮“!”會欺騙指令碼在某些事情已經成功時以為它失敗了,或是相反。在某些 shell裡,“ !”會訪問命令的過去,這會導致真正的問題。在bash裡,只有互動模式會出問題,但tcsh(某些Linux發行版裡的csh的複製形式)甚至在指令碼裡 都使用“!”。新的bash看來也用“ !”來訪問命令的過去 -- 但可能只用於互動模式。

  • “#”是注釋字元,隨後的文本被忽略。

  • “-”會被誤解為後面是一個選項(或者象“--”一樣禁用其它選項)。甚至當它位於檔案名稱的中間,或者前面存在被shell認為是空格的字元,都可能會出問題。

  • “ ”(空格)和其它空白字元會把某個“單獨的”檔案名稱變成多個參數。

  • 其它控制字元(特別是NIL)會在某些shell的實現上產生問題。

  • 按照應用的情況,甚至可以想象“.”(“在當前shell下運行”)和“=”(設定變數)都是令人擔心的字元,而且目前找到的例子表明這些問題會帶來更嚴重的安全問題。

忘記其中的某個字元會導致災難性後果,例如,許多程式把反斜線作為逸出字元加以忽略[rfp 1999]。像在“證實輸入”一節所討論的那樣,一個推薦方案是至少在輸入時立刻忽略掉所有這些字元。同樣,目前最好的解決方案是識別出希望允許的字元,並且只使用這些字元。

許 多程式有執行“額外”操作的“逃逸”代碼;要確保它們沒有被包括在內(除非希望它們出現在訊息裡)。例如,許多面向行命令的郵件程式(如mail和 mailx)使用代字元(~)作為逃逸字元,可以用來發送許多命令。結果,像“mail admin < file-from-user”這樣看起來清白的命令就會被用來執行任意程式。vi和emacs一類的互動程式有“逃逸”機制,通常允許使用者使用過程中執 行任意的shell命令。應該無論如何都檢查調用程式的文檔來尋找逃逸機制。

避免逃逸代碼的問題甚至涉及到底層硬體組件及其模擬器。大多數 數據機實現了所謂的“Hayes”命令集,用“+++”序列、一個延遲再加上“+++”來強迫數據機切換模式(並把後面的文本作為命令解釋)。這 可以被用來實現拒絕服務的攻擊,甚或強迫使用者與另一個人相串連。許多“終端”介面實現了VT100一類早已淘汰的老物理終端的逃逸代碼。比如這些代碼可以用 來改變終端介面的字型顏色。儘管如此,不要允許直接向終端螢幕發送任意的不可信資料,因為某些代碼會導致嚴重問題。在某些系統上可以重新對應按鍵;在若干 系統上甚至可以發送代碼來清除螢幕、顯示一組希望受害者啟動並執行命令以及把這些設定發“回去”(強迫受害者運行攻擊者選擇的命令)。

與之相關 的一個問題是NIL字元(字元0)可能會有些出人意料的後果。大多數C和C++函數假設該字元標識字串的結束,但其它語言(如Perl和Ada95)中 的字串處理常式可以處理包含NIL的字串。由於很多庫和核心調用使用的是C語言規範,結果就是被檢查的內容並非實際所用到的[rfp 1999]。

在調用其它程式或引用某個檔案時,應該總是指定其完整路徑(如/usr/bin/sort)。對於程式調用,即使PATH值設定不正確,這也會排除調用“錯誤”的命令可能引起的錯誤。對於引用其它檔案,這會減少“錯誤”的起始目錄所帶來的問題。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.