如何通過語言提供的能力來防範Log4j之類的漏洞?
功能能力安全(capability-safe)的語言(如Rust)可以最大限度地減少甚至防止Log4j漏洞發生。
在本文中討論圍繞Log4j漏洞的兩個問題:
- 它會對使用者提供的字串進行字串插值。
- 它會訪問網路,而沒有人意識到它可能會這樣做。(這是能力安全的語言可以提供幫助的部分。)
。。。
log4j維護人員考慮實施引入導致漏洞的 JNDI 功能時,接下來可能會發生一些事情:
- 他們認為日誌庫在預設情況下始終訪問網路是完全合理的,並Network 為該Logger.getLogger()方法新增了一個引數。一些使用者接受了這一點併成為該漏洞的犧牲品,但更挑剔的使用者擔心此網路訪問請求並切換到不需要它的更簡單的其他日誌記錄庫,從而避免了該漏洞。
- 他們認為日誌庫根本不應該訪問網路,或者認為需要一個Network引數會讓使用者感到害怕或不方便,因此拒絕了該功能。
- 他們認為該功能能力是值得的,但不希望修改的破壞性 API 更改getLogger需要Network. 因此,他們引入了一種新方法,可能稱為 Logger.getLoggerWithNetwork(MyClass.class, network). 由於大多數使用者不使用這種方法並且log4j沒有它就無法訪問網路,因此可以防止絕大多數漏洞。
這三種可能性都比實際發生的情況要好,實際情況是:log4j突然獲得了訪問網路的能力,但其 API 並未更改以反映這一點,因此使用者沒有注意到。
因此,功能安全的語言本可以節省或至少減輕這一點。
所以未來的語言設計師,請考慮讓你的語言功能能力安全。
作業系統有一個資源控制程式碼或檔案描述符的概念,它們是可以在程式內部和有時在程式之間傳遞的值,代表對外部資源的訪問。程式通常具有 環境許可權,只需提供其名稱或地址即可請求任何檔案或網路控制程式碼:
let file = File::open("/anything/you/want.txt")?; |
可能有訪問控制列表、名稱空間、防火牆或虛擬化機制來管理哪些資源可以實際訪問,但這些通常是粗粒度的,並在應用程式之外進行配置。
基於能力的安全尋求避免環境權威,使沙箱更細粒度和可組合。要開啟檔案,需要一個Dir,代表它所在的開啟目錄:
let file = dir.open("the/thing.txt")?; |
嘗試訪問未包含在目錄中的路徑:
let hidden = dir.open("../hidden.txt")?; dir.symlink("/hidden.txt", "misdirection.txt")?; let secret = dir.open("misdirection.txt")?; |
返回PermissionDenied錯誤。
這允許應用程式邏輯配置自己的訪問,而無需更改整個主機程式的行為、設定單獨的主機程式或需要外部配置。
cap-std是Rust 標準庫的基於能力的版本,cap-std專案圍繞同名的cap-stdcrate 進行組織,並開發了一些庫以簡化基於功能能力的程式碼的編寫,包括:
- cap-std本身,它提供基於功能的stdAPI版本
- cap-async-std,這是async-std什麼cap-std是std
- cap-directories它提供了對標準應用程式目錄的基於能力的訪問
- cap-tempfile,它提供對臨時目錄的基於能力的訪問
- cap-fs-ext,它提供了超出現有檔案系統功能的附加檔案系統功能 std
- cap-time-ext,它提供了超出可用時間功能的附加時間功能 std
- cap-rand,它提供對隨機數生成器的基於能力的訪問
Cap-std 具有針對CWE-22 的保護功能,即“對受限目錄的路徑名的不當限制(‘路徑遍歷’)”,它在2021 年 CWE 前 25 名最危險的軟體弱點中排名第 8 。它還可用於防止不受信任的輸入誘導程式在 Linux 上開啟“/proc/self/mem”。
相關文章
- Fusion元件庫是如何支援多語言能力的元件
- 先知:AI將在一兩年內超過人類語言能力AI
- semcms網站漏洞挖掘過程與安全修復防範網站
- 淺析如何通過PHP類的反射來實現依賴注入PHP反射依賴注入
- 常見web漏洞及防範(轉)Web
- 滲透測試常見漏洞有哪些?如何有效防範?
- windows microsoft之c#語言規範WindowsROSC#
- 通過追蹤程式設計師的眼球來預防Bug程式設計師
- 通過 GDB 學習 C 語言
- 防範ASP網站漏洞及黑客入侵網站黑客
- 通過實體類生成 mysql 的建表語句MySql
- SQL隱碼攻擊的分類與防範SQL
- GO語言————6.12 通過記憶體快取來提升效能Go記憶體快取
- 通過ORA錯誤反思sql語句規範SQL
- Java語言規範Java
- 如何通過閱讀別人的程式碼提高自己的程式設計能力程式設計
- 如何防範來自雲端計算運營商的資料安全威脅
- 通過語言的比喻句發現隱藏的DDD模型 - verraes模型
- 交換網路安全防範系列二之DHCP攻擊的防範
- 如何通過rownum對錶的不同範圍進行批量更新update
- 自然語言處理(NLP)的主要範疇自然語言處理
- C# 語言規範C#
- 程式語言的演化過程
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- golang語言非同步通訊之WaitGroupGolang非同步AI
- PHP通過反射來得到類,以及一些基本的應用PHP反射
- 小酒店如何通過技術創新提供良好的使用者體驗?
- 其它語言通過HiveServer2訪問HiveHiveServer
- Django通過session實現多語言切換DjangoSession
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- 通過java來格式化sql語句JavaSQL
- 樂訊通雲通訊:物聯網路卡在安防監控提供的主要作用
- PHP語言終於有了正式的規範PHP
- Java語言——類Java
- C語言通過.h標頭檔案引入自己寫的源程式C語言
- Java語言編碼規範Java
- 最好的語言也敵不過人類愚蠢:使用PHPStan通過靜態分析儘早捕獲PHP錯誤 - madewithlovePHP
- 如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?Java