




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、安全編程:警惕輸入找出并保護(hù)程序的入口安全編程:警惕輸入找出并保護(hù)程序的入口 本文關(guān)鍵字:本文關(guān)鍵字: 如果您不控制,攻擊者就會來控制如果您不控制,攻擊者就會來控制 安全的程序中第一道防線是檢查每一個不可信的輸入。但是這是什么意思呢?可以歸結(jié)為以下三點: 限制程序暴露的部分。如果您的程序分為若干塊 這通常是一個好主意 那么盡量設(shè)計得讓攻擊者根本不能與大多數(shù)塊通信。這包括不能讓他們利用各塊之間的通信路徑。如果攻擊者不能查看、修改或者插入他們自己的數(shù)據(jù)到那些通信路徑中(包括作為塊間的中間人潛入),那是最好了。如果那不可能 比如當(dāng)塊之間使用網(wǎng)絡(luò)通信時 那么使用加密等機(jī)制來防范攻擊者。后續(xù)的文章將更深
2、入地討論這一問題。 限制暴露部分所允許的輸入類型。有時您可以修改設(shè)計以使只有少數(shù)的輸入可以接受 如果可以,那么就這樣做吧。 嚴(yán)格檢查不可信的輸入。真正“安全”的程序應(yīng)該沒有任何輸入,但那種程序是沒有用處的。因而,您需要對來自于不可信源的輸入路徑的數(shù)據(jù)進(jìn)行嚴(yán)格的檢查。前一期文章 論述了如何檢查各種不同類型的數(shù)據(jù);本文將幫助您確定這些數(shù)據(jù)的來源。這并不是說您 只 需檢查進(jìn)入您的程序的數(shù)據(jù)。通常明智的做法是檢查多個位置的數(shù)據(jù),但是您必須至少檢查所有的數(shù)據(jù)一次,并且明智的做法是至少在數(shù)據(jù)第一次進(jìn)入時進(jìn)行一次檢查。 程序的類型決定一切程序的類型決定一切 您必須檢查所有不可信的輸入 但是什么是不可信的輸入
3、呢?其中一些取決于您的程序要做什么。如果您的程序是數(shù)據(jù)的瀏覽器或者編輯器(比如文字處理器或者圖像顯示器),而這些數(shù)據(jù)有可能來自攻擊者,所以那是不可信的輸入。如果您的程序響應(yīng)網(wǎng)絡(luò)上的請求,那些請求可能正是來自攻擊者 所以網(wǎng)絡(luò)連接是不可信的輸入。 另一個重要的因素是您的程序是如何設(shè)計的。如果您的程序運行時身份是“root”或者其他一些特權(quán)用戶,或者有對數(shù)據(jù)(比如數(shù)據(jù)庫中的數(shù)據(jù))的訪問特權(quán),那么從程序中沒有特權(quán)的部分到那些有特權(quán)的部分的輸入是不可信的。 尤其重要的情形是所有的“setuid”或者“setgid”的程序。只是運行一個 setuid/setgid 程序就會獲得特權(quán),這些程序特別難以保證安
4、全。為什么呢?因為 setuid/setgid 程序有特別多的輸入 它們中很多輸入多得驚人 可以被攻擊者控制。 常見的輸入源常見的輸入源 下面的章節(jié)將討論一些常見的輸入以及如何處理這些輸入。當(dāng)您編寫程序的時候這些輸入每一個都應(yīng)該考慮,如果它們不可信,一定要謹(jǐn)慎對它們進(jìn)行過濾。 環(huán)境變量環(huán)境變量 環(huán)境變量可能令人難以置信地危險,尤其是對那些 setuid/setgid 程序及它們調(diào)用的程序。危險的原因在于以下三個方面: 許多庫和程序由環(huán)境變量以非常含糊的方式控制著 實際上,很多都完全沒有文檔化。命令 shell /bin/sh 使用 PATH 和 IFS 等環(huán)境變量,程序加載器 ld.so (/
5、lib/ld-linux.so.2) 使用 LD_LIBRARY_PATH 和 LD_PRELOAD 等環(huán)境變量,很多程序使用 TERM、HOME 和 SHELL 環(huán)境變量 所有 這些環(huán)境變量都可用于開發(fā)程序。這樣的環(huán)境變量數(shù)不勝數(shù);對調(diào)試來說它們很多都是晦澀的變量,并且將它們?nèi)苛谐鲆彩菬o濟(jì)于事的。實際上,您不可能了解全部環(huán)境變量,因為有一些并沒有文檔化。 環(huán)境變量是繼承而來的。如果程序 A 調(diào)用 B,而 B 調(diào)用 C,C 調(diào)用 D,那么程序 D 將獲得的環(huán)境變量就是程序 A 所獲得的環(huán)境變量,除非有一些程序在這個過程中對其進(jìn)行了改動。這就意味著,如果 A 是一個安全的程序,而 D 的開發(fā)者
6、為了調(diào)試方便而增加了一個沒有文檔化的環(huán)境變量,那么程序 D 的這個附加的環(huán)境變量就會成為程序 A 的一個漏洞!這種繼承不是偶然的 這是為了使環(huán)境變量有用 但是這也使之成為一個嚴(yán)重的安全問題。 環(huán)境變量可以被本地運行的攻擊者 完全 控制,而且攻擊者可以用不同尋常的方式來利用這一點。如 environ(5) 手冊頁(參閱 參考資料)中所描述,環(huán)境變量在內(nèi)部作為字符指針數(shù)組來存儲(數(shù)組以一個 NULL 指針結(jié)束),每一個字符指針指向一個形式為 NAME=value(這里 NAME 是環(huán)境變量名) 的以零字符結(jié)尾的(NIL-terminated)字符串。這一細(xì)節(jié)的重要性何在?這是因為攻擊者可能會做一些
7、不合常理的事情,例如為同一個環(huán)境變量名創(chuàng)建多個值(比如兩個不同的 LD_LIBRARY_PATH 值)。這可以很容易地導(dǎo)致庫使用環(huán)境變量去做意想不到的事情,有可能被利用。GNU glibc 庫對此有防范的例程,但是使用環(huán)境變量的其他庫和任何例程可能很快陷入困境。 有一些情形下,程序經(jīng)過了修改,以使得難以利用它們來使用環(huán)境變量。歷史上,很多攻擊利用的是命令 shell 處理 IFS 環(huán)境變量的方法,但是當(dāng)今大部分的 shell(包括 GNU bash)已經(jīng)經(jīng)過了修改,從而使 IFS 難以利用。 不幸的是,盡管這一加固措施是一個好主意,但它還是不夠 您還是需要謹(jǐn)慎地去處理環(huán)境變量。在 Unix 類
8、系統(tǒng)上所有的程序如何運行,這是一個特別重要的(雖然難以理解)例子。歡迎光臨八一學(xué)習(xí)網(wǎng)八一學(xué)習(xí)網(wǎng),收藏本篇文章收藏本篇文章 $False$ Unix 類系統(tǒng)(包括 GNU/Linux)首先通過系統(tǒng)加載器來運行程序(在大部分 GNU/Linux 系統(tǒng)中這個加載器是 /lib/ld-linux.so.2),它可以定位并加載所需要的共享庫。這個加載器通常由環(huán)境變量來控制。 在大部分 Unix 類系統(tǒng)中,加載器通常在環(huán)境變量 LD_LIBRARY_PATH 中列出的目錄中開始搜索庫。我應(yīng)該說明一下,LD_LIBRARY_PATH 被很多 Unix 類系統(tǒng)使用,但不是全部都用;HP-UX 用的是環(huán)境變量
9、SHLIB_PATH,AIX 用的是 LIBPATH。而且,在 GNU-based 系統(tǒng)(包括 GNU/Linux)中,環(huán)境變量 LD_PRELOAD 所列出的庫首先加載,并且優(yōu)先于所有其他的庫。 問題是,如果攻擊者可以控制程序用到的底層庫,那么攻擊者就可以控制整個程序。例如,假設(shè)攻擊者可以運行 /usr/bin/passwd(一個可以改變您的口令的特權(quán)程序),但卻用環(huán)境變量去改變這個程序用到的庫。攻擊者可以編寫自己的口令加密函數(shù) crypt(3), 然后當(dāng)特權(quán)程序嘗試調(diào)用這個庫時,攻擊者可以讓這個程序來做任何事情 包括允許永久地、無限制地控制整個系統(tǒng)。當(dāng)前,加載器通過檢測程序是否設(shè)置了 se
10、tuid/setgid 來防范這一問題,如果設(shè)置了,它們就會忽略 LD_PRELOAD 和 LD_LIBRARY_PATH 環(huán)境變量。 本文關(guān)鍵字:本文關(guān)鍵字: 那么,我們安全了嗎?沒有。如果惡意的 LD_PRELOAD 或者 LD_LIBRARY_PATH 值沒有被 setuid/setgid 程序清除,它將被傳遞到其他程序,并導(dǎo)致出現(xiàn)加載器試圖去防范的問題。因而,雖然加載器讓編寫安全的程序成為 可能,但您還不得不去防范惡意的環(huán)境變量。而且,這還不能處理那些沒有文檔化的環(huán)境變量的問題。 對于安全的 setudi/setgid 程序來說,惟一可靠的辦法是,始終在程序開始時“提取并清除”環(huán)境變量
11、: 提取出您確實需要的環(huán)境變量(如果有)。 清除所有的環(huán)境變量。在 C/C 中,通過包含 并將 environ 變量設(shè)為 NULL 可以清除環(huán)境變量(盡早做這些事情,特別是在創(chuàng)建線程之前)。 只將您所需要的環(huán)境變量設(shè)置為可靠的值。您幾乎肯定要重新添加的一個環(huán)境值是 PATH,它是搜索程序的目錄列表。典型的 PATH 應(yīng)該只是設(shè)置為 /bin:/usr/bin,或者一些類似的值。不要向 PATH 中添加當(dāng)前路徑“.”,或者甚至一個空條目(這樣在開始和結(jié)束的冒號可被利用)。典型的,您還需要設(shè)置 IFS(設(shè)置為它默認(rèn)的“ tn” 空格、制表符和新行)和 TZ(時區(qū))。其他您可能需要設(shè)置的是 HOME
12、 和 SHELL。您的應(yīng)用程序可能還需要更多,但是要限制它們 除非是特別需要,否則不要接受潛在的攻擊者的數(shù)據(jù)。 文件文件 正如我在前一期文章中提到的,不要信任可以被攻擊者設(shè)置的文件名。Linux 和 Unix 允許用任意的字符序列來作為文件名,所以,如果您正在使用一個來自攻擊者的目錄或者接受他的一個文件名,一定要有所準(zhǔn)備。攻擊者可以創(chuàng)建以“-”開頭的文件名,或者含有“&”等特殊字符的文件名,等等。 不要信任可以被不可信用戶控制的文件內(nèi)容。這包括那些被程序瀏覽或編輯的可能是由攻擊者寄來的文件。例如,著名的文本編輯器 vim 版本 5.7,當(dāng)要編輯一個文件時,將查找一個內(nèi)置的 status
13、line 命令來在它的狀態(tài)行上設(shè)置信息,而那個命令又可以執(zhí)行任意的 shell 程序。攻擊者可以用電子郵件給受害者發(fā)送特別處理過的文件,如果受害者用 vim 來閱讀或者編輯它,受害者就可能會去運行攻擊者想要運行的任何程序! 避免從當(dāng)前目錄中獲得配置信息,因為用戶可能會瀏覽一個由攻擊者控制的目錄,攻擊者在那里創(chuàng)建了一個惡意的配置文件(例如,攻擊者可能已經(jīng)發(fā)送了一個包括數(shù)據(jù)和惡意配置文件的壓縮目錄)。而應(yīng)該從 /etc、用戶的主目錄和/或桌面環(huán)境的庫中獲得配置信息。通常,將配置信息以及其他信息存儲在“/.program-name”文件中是很方便的;文件名最前的句點是為了讓它不影響正常的顯示。如果您
14、真正必須要從當(dāng)前目錄下得到配置信息,那么要非常嚴(yán)格地檢查其中的所有數(shù)據(jù)。 不要讓攻擊者控制任何臨時文件。我建議,如果一個用戶是可信的,那么將臨時目錄放在那個用戶的主目錄下。如果這不可接受,那么要用安全的方法來創(chuàng)建和使用臨時文件(我將在后一期文章中討論如何安全地創(chuàng)建臨時文件)。 文件描述符文件描述符 不懷好意的攻擊者可能啟動一個程序而只是對它的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)錯誤做一些奇怪的事情。例如,攻擊者可能會關(guān)閉它們中的一個或多個,以使得您打開的下一個文件同時也是正常的輸出位置。這對 setuid/setgid 程序來說尤其是一個問題。當(dāng)前的一些 Unix 類系統(tǒng)已經(jīng)可以防范這一問題,但不是所有
15、的系統(tǒng)都可以。 setuid/setgid 程序防范這一攻擊的一種方法是,使用 open() 反復(fù)打開 /dev/null 直到文件描述符的值大于 2(您必須在打開文件前做這件事情,最好是在程序初始化時)。文章整理文章整理: :八一學(xué)習(xí)網(wǎng)八一學(xué)習(xí)網(wǎng) http:/http:/ (本站) 然后,如果對 open() 的第一次調(diào)用返回的是 2 或者更小,那么不輸出任何消息并退出。通過先反復(fù)打開 /dev/null,您自己保護(hù)了自己 如果您偶爾試圖去打開文件并輸出錯誤消息時,不會再發(fā)生壞的事情。在這種情況下不需要輸出錯誤消息,因為文件描述符 0 到 2 只是在攻擊者試圖去攪亂您的程序的時候才會被關(guān)閉。
16、 命令行命令行 程序啟動時可以接受來自命令行的數(shù)據(jù) 但是您可以相信這些數(shù)據(jù)嗎?setuid/setgid 程序尤其不能。如果您不能相信這些數(shù)據(jù),那就要自己做好一切準(zhǔn)備,包括大的參數(shù)、大量的參數(shù)、不可知的字符,等等。注意,程序的名字只是命令行值的第 0 個參數(shù) 不要 相信程序名,因為攻擊者會改變它。 不但如此,還要盡力去設(shè)計您的命令行語法,以使它更容易安全地使用。例如,支持用標(biāo)準(zhǔn)的“-”(雙破折號)選項來表示“不再有選項”,這樣腳本就可以使用這個選項來防止攻擊者通過創(chuàng)建以破折號開頭的文件名 (如“-fr”)來攻擊。否則,攻擊者可以創(chuàng)建“-fr”文件,并讓用戶運行“yourcommand *”;這
17、時您的程序可能會將文件名(“-fr”)曲解為一個選項。 圖形用戶界面(圖形用戶界面(GUIGUI) 這里是應(yīng)對災(zāi)難的一個方案:一個進(jìn)程擁有特別的特權(quán)(例如,如果它設(shè)置了 setuid/setgid),它使用操作系統(tǒng)的圖形用戶界面(GUI)庫,而且 GUI 用戶不是完全可信任的。問題是,GUI 庫(包括 Unix 的、Linux 的和 Windows 的)并不是設(shè)計這樣使用的。這樣做也不現(xiàn)實 GUI 庫很大,而且依賴于龐大的基礎(chǔ)結(jié)構(gòu),所以很難為了安全性而去分析所有的代碼。GTK GUI 庫當(dāng)發(fā)現(xiàn)它是在 setuid 程序中運行時甚至?xí)V?,因為它沒有假定會這樣使用(感謝 GTK 的開發(fā)者主動預(yù)防
18、了這一安全問題)。 難道這意味著您只能使用命令行?不是。將您的程序分為小一些的部分,用沒有特權(quán)的部分去實現(xiàn) GUI,用單獨的部分去實現(xiàn)需要特權(quán)的操作。下面是一些常見的做法: 通常,簡單的方法是將有特權(quán)的操作作為命令行程序來實現(xiàn),由 GUI 調(diào)用 那樣您可以“無償?shù)亍鲍@得 GUI 和命令行界面(CLI),從而簡化了腳本編寫和調(diào)試。典型地,CLI 特權(quán)程序是一個 setuid/setgid 程序。當(dāng)然,有特權(quán)的程序必須保護(hù)自己不受攻擊,但是這個方法通 1212 常意味著這一部分必須是安全的程序,這些程序應(yīng)更小并且更容易保護(hù)。 本文關(guān)鍵字:本文關(guān)鍵字: 如果您需要高速通信,將這個程序作為有特權(quán)的程序
19、啟動,把它分為可以安全通信的獨立的進(jìn)程,然后將一個進(jìn)程永久釋放特權(quán)并去運行 GUI。 另一種方法是實現(xiàn)有特權(quán)的服務(wù)器來響應(yīng)請求,并創(chuàng)建 GUI 作為客戶機(jī)。 使用 Web 界面;創(chuàng)建一個有特權(quán)的服務(wù)器,然后使用 Web 瀏覽器作為客戶機(jī)。這實際上是先前方法的一個特例,但它很靈活,因此通常值得考慮。如任何其他為我們帶來網(wǎng)絡(luò)數(shù)據(jù)問題的 Web 應(yīng)用程序一樣,您將需要使它安全。 網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)數(shù)據(jù) 如果數(shù)據(jù)來自于網(wǎng)絡(luò),您應(yīng)該認(rèn)為它是高度不可信的。不要相信“源 IP”地址、HTTP“Referrer”頭的值或者類似的數(shù)據(jù)所告訴您的數(shù)據(jù)來自何方;那些來自發(fā)送者的值可以被偽造。當(dāng)心來自域名系統(tǒng)(DNS)的值
20、;DNS 實現(xiàn)的是一個分布式數(shù)據(jù)庫,那些值中有一些可能是攻擊者提供的。 如果您有一個客戶機(jī)/服務(wù)器系統(tǒng),服務(wù)器應(yīng)該永遠(yuǎn)不要相信客戶機(jī)??蛻魴C(jī)數(shù)據(jù)在到達(dá)服務(wù)器前可以被操縱,客戶機(jī)程序可能已經(jīng)被修改,或者攻擊者可能創(chuàng)建了他們自己的客戶機(jī)(很多這種情況?。?。如果您正在從 Web 瀏覽器獲得數(shù)據(jù),不要忘記 Web cookie、HTML 表單數(shù)據(jù)、URL 等可以被用戶設(shè)置為任意的值。這是網(wǎng)絡(luò)購物車應(yīng)用程序中常見的問題;許多這樣的應(yīng)用程序使用隱藏的 HTML 表單域來存儲產(chǎn)品信息(比如價格)和相關(guān)信息(比如運費),當(dāng)用戶發(fā)送這些值時就盲目地接收。用戶不僅能將產(chǎn)品價格設(shè)置為更低的值或者零,有時他們還可以設(shè)置負(fù)值的價格,以得
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東2024年12月廣東省汕尾法院公開招考26名勞動合同制審判輔助人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 學(xué)校蔬菜購買合同范本
- 河南省安陽市殷都區(qū)2024-2025學(xué)年數(shù)學(xué)三下期末統(tǒng)考模擬試題含解析
- 2025屆江西省鷹潭市月湖區(qū)數(shù)學(xué)三下期末綜合測試模擬試題含解析
- 江陰職業(yè)技術(shù)學(xué)院《課程標(biāo)準(zhǔn)與教材研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 嵐縣2024-2025學(xué)年數(shù)學(xué)四下期末統(tǒng)考試題含解析
- 2025屆河北省承德市隆化縣章吉營學(xué)區(qū)四年級數(shù)學(xué)第二學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 方山縣2025屆三年級數(shù)學(xué)第二學(xué)期期末質(zhì)量檢測試題含解析
- 牡丹江大學(xué)《客房服務(wù)技能》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025屆依安縣小升初必考題數(shù)學(xué)檢測卷含解析
- 最新地鐵通信系統(tǒng)首件定標(biāo)籌劃
- 實木家具生產(chǎn)標(biāo)準(zhǔn)工藝標(biāo)準(zhǔn)流程
- 熱導(dǎo)檢測器(TCD)原理與操作注意事項
- DB33_T 2352-2021鄉(xiāng)鎮(zhèn)運輸服務(wù)站設(shè)置規(guī)范(可復(fù)制)
- 專升本高等數(shù)學(xué)的講義80頁PPT課件
- 血氣分析臨床基礎(chǔ)(課堂PPT)
- 特種設(shè)備停用報廢注銷申請表
- 第三章 文獻(xiàn)的版本
- 糖尿病酮癥酸中毒ppt課件
- 五年級下冊英語課件--Lesson--7《Arriving-in-Beijing-》|冀教版-(三起)-(共21張PPT)
- 武發(fā)[2004]13關(guān)于積極推進(jìn)“ 城中村”綜合改造工作的意見
評論
0/150
提交評論