軟件安全知識之漏洞討論
漏洞討論
與整體安全目標的更好連接需要更復雜的規范
我們已將實施漏洞歸類為違反軟件組件的特定部分規范。但是,與整個軟件系統的安全目標的連接很弱。軟件系統完全有可能存在實現漏洞,但無法利用該漏洞來破壞系統的安全目標,例如,因為系統中的其他地方有多余的對策。更重要的是,如果一個軟件系統沒有任何我們討論的實現漏洞,它仍然可能無法實現其安全目標。
為了更好地保證軟件系統滿足安全目標,可以將安全目標正式化為規范。在設計階段,在子組件中分解系統時,應指定子組件的行為
這樣它們共同暗示了整個系統的規范。通過這樣的設計,一方面是違反規范的實現漏洞與系統的整體安全目標之間的聯系另一方面,要強大得多。
但是,重要的是要注意,在這種情況下,規范將變得更加復雜和特定于域。我們討論一個額外復雜性的例證。對于我們討論的漏洞類別(內存管理、結構化輸出生成、競爭條件和API漏洞),相應的規范表達了軟件單次執行的屬性:給定的執行滿足或違反規范,一旦存在違反規范的執行,軟件就會出現漏洞。規范。
但是,有些軟件安全目標不能表示為單個執行跟蹤的屬性。這種安全目標的一個廣泛研究的例子是信息流安全。確定性順序程序的此安全目標的基線規范如下:將程序的輸入和輸出標記為公共或機密,然后要求軟件沒有兩次執行相同的公共輸入(但不同的機密輸入)具有不同的公共輸出。查看執行對的直覺如下:程序可能不會直接泄露機密數據,而是泄露有關此數據的一些部分信息。如果通過多次運行收集,攻擊者可以收集如此多的信息,以至于最終機密原始數據的相關部分實際上被泄露。上述規范有效地要求機密輸入永遠不會以任何方式影響公共輸出,因此不能泄露甚至部分信息。以雙重方式,可以通過要求低完整性輸入不會影響高完整性輸出來表達完整性目標。
但是,信息流規范比我們在前面部分中討論的規范更復雜,因為需要兩次執行才能顯示違反規范的情況。信息泄露漏洞違反了(面向機密性的)信息流策略。它們也可以理解為違反規范,但現在這是一個談論軟件系統多次執行的規范。這對制定解決這些漏洞的對策產生了深遠的影響[12]。
側信道漏洞不同
根據定義,側信道漏洞并不違反軟件源代碼抽象級別的規范:它們本質上使用源代碼抽象的效果。但是,如果開發的軟件執行基礎結構模型足夠詳細,可以模擬側信道攻擊,那么側信道漏洞可以再次被理解為違反部分規范。可以通過為執行基礎結構提供規范來選擇在執行基礎結構中定位漏洞,該規范指出它不應引入其他通信機制。這基本上是完全抽象理論[13]所要求的。或者,可以改進源代碼語言的模型,以暴露特定側信道攻擊中使用的效果,從而可以在源代碼級別表達側信道漏洞。處理一般軟件側信道漏洞尚未得到很好的理解,也沒有普遍適用的現實對策。當然,可以隔離執行,即防止在同一硬件上并發執行,但這與其他目標(例如優化硬件利用率)相矛盾。
漏洞作為故障
通過漏洞違反的規范對漏洞進行分類對于理解相關的漏洞類別很有用,但并不是一個完整的分類法:有大量的軟件部分規范有助于實現某些安全目標的系統。然而,漏洞可以被視為故障概念的一個實例,在可靠計算領域進行了研究,并且在該領域已經開發了良好的故障分類法[14]。