如何通過語言提供的能力來防範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”。
相關文章
- 零日漏洞是什麼?如何防範零日漏洞?
- 零日漏洞是什麼?該如何防範?
- 先知:AI將在一兩年內超過人類語言能力AI
- Fusion元件庫是如何支援多語言能力的元件
- semcms網站漏洞挖掘過程與安全修復防範網站
- 淺析如何通過PHP類的反射來實現依賴注入PHP反射依賴注入
- 升級過log4j,卻還沒搞懂log4j漏洞的本質?
- GO語言————6.12 通過記憶體快取來提升效能Go記憶體快取
- 通過實體類生成 mysql 的建表語句MySql
- 滲透測試常見漏洞有哪些?如何有效防範?
- 私有云中的安全風險如何防範
- Java語言規範Java
- 通過語言的比喻句發現隱藏的DDD模型 - verraes模型
- 最好的語言也敵不過人類愚蠢:使用PHPStan通過靜態分析儘早捕獲PHP錯誤 - madewithlovePHP
- pytest:通過scope控制fixture的作用範圍
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- 出行坐車如何防範?
- 其它語言通過HiveServer2訪問HiveHiveServer
- PHP通過反射來得到類,以及一些基本的應用PHP反射
- 如何防範來自雲端計算運營商的資料安全威脅
- C語言通過.h標頭檔案引入自己寫的源程式C語言
- 電腦病毒的防範
- Java語言編碼規範Java
- 樂訊通雲通訊:物聯網路卡在安防監控提供的主要作用
- 通過計算機語言自定義保留小數計算機
- 通過Go語言建立CA與簽發證書Go
- 利用漏洞修復漏洞:青藤提供的「Log4j命令注入漏洞(CVE-2021-44228)」【免重啟】線上熱補丁服務現已上線!
- 通過IO模型帶來的思考模型
- elasticsearch 的 log4j漏洞怎麼解決啊?Elasticsearch
- 幽默圖:log4j漏洞事件的幽默模因事件
- 通訊錄的c語言程式編輯C語言
- C語言小白走過的彎路C語言
- 如何通過 JavaCSV 類庫來優雅地(偷懶)讀寫 CSV 檔案?Java
- e語言 類似eval函式作用的函式
- DDOS 攻擊的防範教程
- 語言的力量主要來自於社群
- Go 語言程式設計規範Go程式設計