
- 作業系統教程
- 作業系統 - 首頁
- 作業系統 - 需求
- 作業系統 - 概述
- 作業系統 - 歷史
- 作業系統 - 元件
- 作業系統 - 結構
- 作業系統 - 架構
- 作業系統 - 服務
- 作業系統 - 屬性
- 作業系統 - 週轉時間 & 等待時間
- 作業系統程序
- 作業系統 - 程序
- 作業系統 - 程序排程
- 作業系統 - 排程演算法
- 先來先服務排程演算法
- 最短作業優先排程演算法
- 輪循排程演算法
- 最高響應比優先排程演算法
- 優先順序排程演算法
- 多級佇列排程
- 上下文切換
- 程序操作
- 彩票程序排程
- 預測突發時間最短作業優先排程
- 競爭條件漏洞
- 臨界區同步
- 互斥同步
- 程序控制塊
- 程序間通訊
- 搶佔式和非搶佔式排程
- 作業系統同步
- 程序同步
- 作業系統記憶體管理
- 作業系統 - 記憶體管理
- 作業系統 - 虛擬記憶體
- 作業系統儲存管理
- 作業系統 - 檔案系統
- 作業系統型別
- 作業系統 - 型別
- 作業系統雜項
- 作業系統 - 多執行緒
- 作業系統 - I/O 硬體
- 作業系統 - I/O 軟體
- 作業系統 - 安全
- 作業系統 - Linux
- 考試題庫及答案
- 考試題庫及答案
- 作業系統有用資源
- 作業系統 - 快速指南
- 作業系統 - 有用資源
- 作業系統 - 討論
作業系統 - 競爭條件漏洞
競爭條件
在作業系統中,競爭條件是一種不希望出現的情況,當多個程序或執行緒併發訪問和操作共享資源時發生,導致輸出不一致。執行結果取決於在搶佔式環境中執行的程序的各個語句的執行順序。共享資源可以是共享變數、表或檔案。這些程序“競爭”訪問共享資源,因此這種情況稱為競爭條件。
競爭條件示例
讓我們考慮一個場景,其中兩個程序 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 中的漏洞。