人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統 > 網絡技術教程 > 詳細頁面

安全編程: 避開競爭條件(3)

安全編程: 避開競爭條件(3)

更新時間:2021-10-03 文章作者:未知 信息來源:網絡 閱讀次數:

網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據資源、信息資源、知識資源、專家資源、大型數據庫、網絡、傳感器等。 當前的互聯網只限于信息共享,網絡則被認為是互聯網發展的第三階段。
遵守一些簡單的規則,可以避免這些問題:

  不要使用 access(2) 來判定您是否可以做某件事情;通常攻擊者會在調用 access(2) 后改變該情形,所以,通過調用 access(2) 獲得的任何數據都可能不再是可信任的。換一種方式,將您的程序的特權設置得恰好是您想要的特權(例如,設置它的有效 id、文件系統 id 或者有效 gid,并通過 setgroups 來清除所有不需要的組);然后調用 open(2) 直接打開或創建您需要的文件。在類 Unix 系統上,open(2) 調用是原子的(與以前的 NFS 系統版本 1 和版本 2 不同)。

  當創建一個新文件時,使用 O_CREAT | O_EXCL 模式打開它(確保只有在創建一個新文件時調用 O_EXCL 才會成功)。最初只授與非常有限的權限;至少禁止任意的用戶修改它!通常,這表示您需要使用 umask 和/或打開參數,將初始的訪問權限局限于用戶,也可以局限于用戶所在的組。不要嘗試在創建完文件后再去減少權限,因為這樣做會導致競爭條件。在大部分類 Unix 系統上,只在打開文件時才檢查權限,所以,攻擊者可以在權限位(permission bit)允許時打開文件,并使該文件一直處于打開狀態,不管權限如何改變。如果您愿意,還可以在以后將權限修改得更為開放。您還需要為打開失敗做好準備。如果您絕對需要能打開某個新文件,那么應該創建一個循環:(1)創建一個“隨機”的文件名,(2)使用 O_CREAT | O_EXCL 選項打開文件,
(3)成功打開文件后停止循環。

  當對文件的元信息進行操作時(比如修改它的所有者、對文件進行統計,或者修改它的權限位),首先要打開該文件,然后對打開的文件進行操作。只要有可能,應盡量避免使用獲取文件名的操作,而是使用獲取文件描述符的操作。這意味著要使用 fchown( )、fstat( ) 或 fchmod( ) 系統調用,而不使用取得文件名的函數,比如 chown()、chgrp() 和 chmod()。這樣做將避免文件在您的程序運行時被替換(一種可能的競爭條件)。例如,如果您關閉一個文件,然后使用 chmod() 來修改其權限,那么攻擊者很可能在這兩個步驟之間移動或刪除該文件,并創建指向另一個文件(比如 /etc/passwd)的符號鏈接。

  如果您的程序需要遍歷文件系統(遞歸地遍歷子目錄),那么要提防攻擊者可能會利用您正在遍歷的目錄結構。這種情形的一個常見的例子是,運行您的程序的管理員、系統程序或者有特權的服務器正在遍歷的是由普通用戶控制的文件系統部分。GNU 文件實用程序(fileutils)可以完成遞歸目錄刪除和目錄移動,但是在版本 4.1 之前,當遍歷目錄結構時,它只是簡單的遵循“..”這個特殊條目。當文件被刪除時,攻擊者可以將一個低層級的目錄移動到更高的層級;fileutils 將會遵循“..”目錄向上到更高層級,可能會一直到文件系統的根。通過在適當的時間刪除目錄,攻擊者可以刪除計算機中的任何文件。您不應該信任“..”或“.”,如果它們是由攻擊者控制的。

  如果可以,不要將文件放置在可以由不信任用戶共享的目錄中。如果不是那樣,那么應該盡量不使用在用戶間共享的目錄。不要介意創建只能由受信任的特定進程訪問的目錄。

  考慮避免使用傳統的共享目錄 /tmp 和 /var/tmp。如果您可以只使用一個管道,將數據從一個位置發送到另一個位置,那么您就可以簡化程序,并排除潛在的安全問題。如果您確實需要創建一個臨時文件,那么可以考慮將臨時文件存儲到其他地方。如果您不是在編寫一個有特權的程序,那么這點尤其需要考慮;如果您的程序沒有特權,那么將臨時文件放置在用戶目錄內部會更安全一些(處理 root 用戶時要當心,它以“/”作為其主目錄)。這樣,即使您沒有“正確地”創建臨時文件,攻擊者通常也無法引發問題(因為攻擊者不能利用用戶主目錄的內容)。

  但是,無法總是能夠避免使用共享目錄,所以我們需要理解如何處理 /tmp 等共享目錄。這一點非常復雜,所以它應該自己占用一節!


共享目錄(比如 /tmp)


共享目錄基本概念

  如果您可信任的程序將要與潛在的非信任用戶共享一個目錄,那么要特別小心。在類 Unix 系統中,最常見的共享目錄是 /tmp 和 /var/tmp,對這些目錄的錯誤使用滋生了很多安全缺陷。最初創建 /tmp 目錄,是將它作為一個創建臨時文件的方便位置,通常不應該與任何其他人共享臨時文件。不過,該目錄很快它就有了第二個用途 —— 創建用戶間共享對象的標準位置。由于這些標準目錄有多種用途,使得操作系統難以加強訪問控制來防止攻擊;因此,您必須正確地使用它們,以避免受到攻擊。

  當您使用共享目錄時,確保目錄和文件有適當的權限。顯然,您需要限制哪些人可以對共享目錄中創建的文件進行讀寫操作。但是,在類 Unix 系統中,如果多個用戶都可以向同一目錄添加文件,而且您計劃通過一個有特權的程序向該目錄添加文件,那么要確保為該目錄設置“sticky”位。在一個普通的目錄中(沒有 sticky 位),任何人對它都有寫權限 —— 包括攻擊者 —— 可以刪除或者重命名文件,導致各種各樣的問題。例如,一個可信任的程序可以在這樣一個目錄下創建一個文件,而一個不受信任的用戶可以刪除或者重命名它。在類 Unix 系統上,需要設置共享目錄的 “sticky”位;在 sticky 目錄中,文件只能由 root 或者文件的所有者解除鏈接或者重新命名。/tmp 和 /var/tmp 目錄通常實現為“sticky”目錄,以排除一些問題。

  程序有時會留下一些沒用的臨時文件,所以,大部分類 Unix 系統會自動刪除特定目錄 /tmp 和 /var/tmp 下的原有臨時文件(“tmpwatch”程序可以完成這項任務),一些程序會“自動”刪除它們所使用的特定臨時目錄下的文件。這聽起來很方便...只可惜攻擊者可能會讓系統特別繁忙,使活動文件成為舊文件。結果:系統可能會自動刪除正被使用的文件名稱。然后會發生什么?攻擊者可能會嘗試創建他們自己的相同名稱的文件,或者至少讓系統創建另一個進程,并重新使用相同的文件名稱。結果:混亂。這類問題叫做“tmpwatch”問題。解決這種問題的方法是,一旦自動創建了一個臨時文件,就必須始終使用打開該文件時得到的文件描述符或文件流。永遠不要重新打開文件或者使用任何以文件為參數的操作 —— 始終使用文件描述符或者相關的流,否則,tmpwatch 競爭將引發一些問題。您甚至無法先創建文件、然后關閉它、然后再重新打開它,即使權限已經限制了誰可以打開該文件。

  攻擊 sticky 目錄以及您創建的文件的受限權限只是第一步。在運行安全程序期間,攻擊者可能會嘗試進行插入操作。常見的一種攻擊是,當您的程序正在運行時,在共享目錄中創建和反創建指向其他一些文件的符號鏈接 —— /etc/passwd 或者 /dev/zero 是常見的目標。攻擊者的目標是,創造這樣一種情形,即讓安全程序判定某個給定的文件名并不存在,然后,攻擊者就可以創建指向另一個文件的符號鏈接,而后安全程序繼續執行某些操作(但是現在,它打開的實際上是一個意料之外的文件)。重要的文件經常會被這樣破壞或更改。這種做法的另一個變種是,創建和反創建攻擊者可以進行寫操作的普通文件,這樣,攻擊者有時就可以控制有特權的程序創建的“內部”文件。

  在這些共享目錄中創建文件時,常遇見的一個問題是,您必須確保您計劃使用的文件名在創建時并不存在,然后自動創建該文件。在創建該文件“之前”進行檢查沒有用,因為在已經進行了檢查但還沒有創建該文件之前,另一個進程可以使用該文件名創建出這個文件。使用“不可預知的”或者“惟一的”文件名也沒有用,因為攻擊者可以反復猜測該文件名,直到成功為止。所以,您需要執行一個或者創建一個新文件或者失敗的操作 —— 不做其他任何事情。類 Unix 系統可以這樣做,但是您需要知道如何要求系統去做。


網絡的神奇作用吸引著越來越多的用戶加入其中,正因如此,網絡的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術都需要適時應勢,對應發展,這正是網絡迅速走向進步的催化劑。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 贵州省| 正蓝旗| 西乌珠穆沁旗| 东平县| 兰溪市| 克拉玛依市| 安远县| 历史| 扎鲁特旗| 南川市| 安吉县| 义乌市| 古交市| 黄石市| 兴义市| 泰和县| 海城市| 双鸭山市| 尼木县| 广宗县| 内乡县| 平利县| 文安县| 吉木乃县| 晴隆县| 临海市| 平山县| 永平县| 聊城市| 三亚市| 兴安盟| 崇信县| 舞阳县| 遂昌县| 都兰县| 武川县| 渝北区| 盐山县| 普兰店市| 菏泽市| 建瓯市|