• Operating System Video Tutorials

作業系統 - 競爭條件漏洞



競爭條件

在作業系統中,競爭條件是一種不希望出現的情況,當多個程序或執行緒併發訪問和操作共享資源時發生,導致輸出不一致。執行結果取決於在搶佔式環境中執行的程序的各個語句的執行順序。共享資源可以是共享變數、表或檔案。這些程序“競爭”訪問共享資源,因此這種情況稱為競爭條件。

競爭條件示例

讓我們考慮一個場景,其中兩個程序 P1 和 P2 試圖更改儲存在記憶體位置 C 中的共享變數的值,該變數最初為 10。P1 想要增加 C 的值,而 P2 想要減少 C 的值。增加或減少的操作不是單個語句,而是對應於如下所示的多個語句。

P1 的語句為

R1 ← M(C) [將記憶體位置 C 的內容載入到暫存器 R1]

R1 ← R1 + 1 [增加暫存器 R1 的內容]

M(C) ← R1 [將暫存器 R1 的內容儲存到記憶體位置 C]

P2 的語句為

R2 ← M(C) [將記憶體位置 C 的內容載入到暫存器 R2]

R2 ← R2 - 1 [減少暫存器 R1 的內容]

M(C) ← R2 [將暫存器 R2 的內容儲存到記憶體位置 C]

在理想情況下,P1 完全執行,然後 P2 執行,反之亦然。因此,在兩個程序都執行後,C 的值保持不變,即 10。但是,由於 P1 和 P2 彼此競爭,並且每個程序都可能搶佔另一個程序,因此語句是交織在一起的。讓我們看一下導致不同輸出的兩種不同場景。

場景 1

時間戳 程序 語句 R1、R2 和 M(C) 的值
T1 P1 R1 ← M(C) R1 = 10,M(C) = 10
T2 P2 R2 ← M(C) R2 = 10,M(C) = 10
T3 P2 R2 ← R2 - 1 R1 = 10,R2 = 9,M(C) = 10
T4 P1 R1 ← R1 + 1 R1 = 11,R2 = 9,M(C) = 10
T5 P1 M(C) ← R1 R1 = 11,R2 = 9,M(C) = 11
T6 P2 M(C) ← R2 R1 = 11,R2 = 9,M(C) = 9

在上述場景中,我們發現程序 P1 執行的增加操作完全丟失了,C 的值為 9,這是不正確的。

場景 2

時間戳 程序 語句 R1、R2 和 M(C) 的值
T1 P1 R1 ← M(C) R1 = 10,M(C) = 10
T2 P1 R1 ← R1 + 1 R1 = 11,M(C) = 10
T3 P2 R2 ← M(C) R1 = 11,R2 = 10,M(C) = 10
T4 P2 R2 ← R2 - 1 R1 = 11,R2 = 9,M(C) = 10
T5 P2 M(C) ← R2 R1 = 11,R2 = 9,M(C) = 9
T6 P1 M(C) ← R1 R1 = 11,R2 = 9,M(C) = 11

在上述場景中,我們發現程序 P2 執行的減少操作丟失了,C 的值為 11,這也是不正確的。

從以上兩個場景可以看出,如果更改共享資源的程式碼部分沒有以原子方式執行,則結果可能不正確或丟失。

競爭條件漏洞

競爭條件漏洞是一種軟體錯誤,允許惡意實體利用競爭條件下併發程序的執行,以便產生不一致的輸出。它是一個重要的安全漏洞,被識別為 CWE-362(常見弱點列舉,第 362 節)。

當在程序或執行緒的檢查時間 (TOC) 和使用時間 (TOU) 視窗之間插入錯誤程式碼時,無論是惡意還是故意,都會導致此問題。

以下是一些競爭條件漏洞的示例 −

  • 駭客可以在檢查登入憑據之前,在授予訪問許可權的過程中干擾安全系統。攻擊是透過在 TOC 和 TOU 之間插入惡意程式碼來執行的,然後對未經授權的使用者進行身份驗證以訪問系統。
  • 對於臨時檔案,攻擊者將使用一些常見的名稱建議建立或更改檔案以儲存敏感資料。透過這種方式,攻擊者可以更改系統的行為,從而導致漏洞。
  • 當用戶想要訪問任何檔案或資料時,系統會提示他們檔案需要訪問許可權。利用這一點,資料和檔案可能會導致損壞或丟失。
  • 攻擊者可以開啟資料庫並根據自己的需要更改資料,例如根據績效更新資料庫中員工的工資資訊,他們可以為績效低的員工增加工資,反之亦然。

競爭條件的後果

競爭條件漏洞會帶來一些嚴重的後果,破壞安全系統及其功能,例如:

  • 競爭條件可能導致共享檔案和共享表的 資料丟失和資料損壞。
  • 當核心程序受到競爭條件漏洞的影響時,它們可能會無限期地執行,從而導致系統崩潰。
  • 在登入會話期間,未經授權的人員可能會訪問系統。
  • 當多個程序爭用使用共享資源時,可能會發生某些程序持有某些資源,同時等待其他資源的情況。這會導致死鎖。

防止競爭條件漏洞

競爭條件漏洞會帶來嚴重的後果,降低系統的整體效能並危害系統安全。因此,必須採取適當的保護措施,以儘可能避免這些情況。

一些常用的措施如下所列 −

  • 原子操作 − 如果任何操作的指令序列作為一個單元執行,則稱為原子操作。原子操作不允許中斷,因此可確保多個程序無法同時訪問共享資源。
  • 同步 − 為了確保任何時候只有一個程序或執行緒可以訪問共享資源,可以使用同步機制,例如鎖、訊號量、互斥量或監視器。
  • 訪問限制 − 可以最小化或最佳化跨越 TOCTOU 的漏洞視窗,以限制訪問資源的持續時間。
  • 檢測措施 − 自動化分析和測試工具有助於定期審查程式碼以檢測競爭條件。
  • 維護日誌 − 維護正確的系統日誌有助於跟蹤對共享資源的訪問和亂序操作,指示競爭條件。
  • Web 應用防火牆 − Web 應用防火牆可防止 Web 攻擊,進而防止 TOCTOU 中的漏洞。
廣告