競爭條件(race condition)

2021-06-01 04:30:36 字數 1095 閱讀 6007

在一些作業系統中,協作的程序可能共享一些彼此都能讀寫的公用儲存區。這個公用儲存區可能在記憶體中(可能是在核心資料結構中),也可能是乙個共享檔案。這裡共享儲存區的位置並不影響通訊的本質及其帶來的問題。為了理解實際中程序間通訊如何工作,我們考慮乙個簡單但很普遍的例子:乙個假離線列印程式。當乙個程序需要列印乙個檔案時,它將檔名放在乙個特殊的假離線目錄 (spooler directory)下。另乙個程序(印表機守護程序)則周期性地檢查是否有檔案需要列印,若有就列印並將該檔名從目錄下刪掉。

設想假離線目錄中有許多槽位,編號依次為0,1,2,…,每個槽位存放乙個檔名。同時假設有兩個共享變數:out,指向下乙個要列印的檔案;in,指向目錄中下乙個空閒槽位。可以把這兩個變數儲存在乙個所有程序都能訪問的檔案中,該檔案的長度為兩個字。在某一時刻,0號至3號槽位空(其中的檔案已經列印完畢),4號至6號槽位被占用(其中存有排好佇列的要列印的檔名)。幾乎在同一時刻,程序a和程序b都決定將乙個檔案排隊列印,這種情況如圖2-21所示。

在murphy法則(任何可能出錯的地方終將出錯)生效時,可能發生以下的情況。程序a讀到in的值為7,將7存在乙個區域性變數next_free_slot中。此時發生一次時鐘中斷,cpu認為程序a已執行了足夠長的時間,決定切換到程序b。程序b也讀取in,同樣得到值為7,於是將7存在b的區域性變數next_free_slot中。在這一時刻兩個程序都認為下乙個可用槽位是7。

程序b現在繼續執行,它將其檔名存在槽位7中並將in的值更新為8。然後它離開,繼續執行其他操作。

最後程序a接著從上次中斷的地方再次執行。它檢查變數next_free_slot,發現其值為7,於是將列印檔案名存入7號槽位,這樣就把程序b存在那裡的檔名覆蓋掉。然後它將next_free_slot加1,得到值為8,就將8存到in中。此時,假離線目錄內部是一致的,所以印表機守護程序發現不了任何錯誤,但程序b卻永遠得不到任何列印輸出。類似這樣的情況,即兩個或多個程序讀寫某些共享資料,而最後的結果取決於程序執行的精確時序,稱為競爭條件(race condition)。除錯包含有競爭條件的程式是一件很頭痛的事。大多數的測試執行結果都很好,但在極少數情況下會發生一些無法解釋的奇怪現象。

Web條件競爭

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

WEB CTF 條件競爭

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

條件競爭漏洞

競爭條件發生在多個執行緒同時訪問同乙個共享 變數 檔案等沒有進行鎖操作或者同步操作的場景中。開發者在進行 開發時常常傾向於認為 會以線性的方式執行,但他們忽視了並行伺服器會併發執行多個執行緒,這就會導致意想不到的結果。執行緒同步機制確保兩個及以上的併發程序或執行緒不同時執行某些特定的程式段,也被稱之...