關於競爭條件的對策

2021-10-02 05:55:09 字數 1119 閱讀 1543

原子操作

tocttou競爭條件是由於檢查操作和使用操作之間的間隔(也稱視窗期)而導致的,原子操作旨在消除檢查和使用操作之間的間隔,將檢查和使用操作原子化,該對策需要作業系統級的支援。

重複檢查和使用

#include #include #include #include int main()

//window1

else fd1=open("/tmp/xyz",o_rdwr);

//window2

if(access("/tmp/xyz",o_rdwr)) //window3

else fd2=open("/tmp/xyz",o_rdwr);

//window4

if(access("/tmp/xyz",o_rdwr)) //window5

else fd3=open("/tmp/xyz",o_rdwr);

fstat(fd1,&stat1);

fstat(fd2,&stat2);

fstat(fd3,&stat3);

if(stat1.st_ino == stat2.st_ino &&stat2.st_ino == stat3.st_ino)

else

}

該**通過執行多次access()和open(),並且對fd1、fd2、fd3進行檢查,只有三次相同才向檔案寫入,使得攻擊者贏得競爭條件變得十分簡單,因為他需要贏得5次視窗,錯過任何一次都會失敗。

粘性符號鏈結保護

大多數的tocttou競爭條件漏洞都與/tmp目錄下的符號鏈結有關,所以ubuntu採取了一種內建的保護機制,阻止程式在特定條件下使用符號鏈結,在這種對策下,即使攻擊者能夠贏得視窗,也不能造成其他傷害。該對策只應用於人人可寫的粘性目錄,例如/tmp,在ubuntu下預設開啟,可以使用如下命令開啟

sudo sysctl -w kernel.yama.protected_sticky_symlinks=1

例如,在該對策下,只有當符號鏈結的擁有者是當前粘性目錄的擁有者或者符號鏈結的euid,fopen函式才允許開啟指定檔案。

競爭條件(race condition)

在一些作業系統中,協作的程序可能共享一些彼此都能讀寫的公用儲存區。這個公用儲存區可能在記憶體中 可能是在核心資料結構中 也可能是乙個共享檔案。這裡共享儲存區的位置並不影響通訊的本質及其帶來的問題。為了理解實際中程序間通訊如何工作,我們考慮乙個簡單但很普遍的例子 乙個假離線列印程式。當乙個程序需要列印...

Web條件競爭

最近,正好作業系統課上正在學程序的競爭關係,再加上寒假安恆杯2月賽上有道web題考到了條件競爭漏洞的利用,所以就系統的學習和總結下條件競爭漏洞。一 漏洞成因 執行緒程式設計中,為了保證資料操作的一致性,作業系統引入了鎖機制,用於保證臨界區 的安全。通過鎖機制,能夠保證在多核多執行緒環境中,在某乙個時...

WEB CTF 條件競爭

條件競爭漏洞是一種伺服器端的漏洞,由於伺服器端在處理不同使用者的請求時是併發進行的,因此,如果併發處理不當或相關操作邏輯順序設計的不合理時,將會導致此類問題的發生。下面以相關操作邏輯順序設計的不合理為例,具體討論一下這類問題的成因。在很多系統中都會包含上傳檔案或者從遠端獲取檔案儲存在伺服器的功能 使...