一、產生原因
Log4j漏洞產生原因是因為Log4j2核心庫中存在一個基於JNDI的任意代碼執行漏洞,通過惡意構造特定的Class路徑變量,攻擊者便可控制JNDI上下文,最終在應用中任意執行代碼。
這個問題的出現是源於Log4j2中的JNDI Lookup,這個Lookup是在默認的情況下啟用的。在高版本的log4j中已經關閉了JNDI Lookup,但1.x版本中這個設置默認是開啟的。
二、漏洞影響範圍
這個漏洞在log4j2.0-2.14.1版本之間,log4j-core組件中存在,當組件中與JNDI Query交互時,便會存在遠程攻擊的可能性。
三、漏洞防禦方案
1、更新log4j版本
參考官方的建議,更新log4j-core組件並且把相關的被動依賴也需跟着更新。更新版本號如下:
log4j-core 2.15.0
log4j-api 2.15.0
log4j-jul 2.15.0
log4j-slf4j-impl 2.15.0
log4j-web 2.15.0
log4j-over-slf4j 2.15.0
2、關閉JNDI Lookup
假如不想更新log4j版本,可關閉JNDI Lookup,可以手動修改配置項,禁用JNDI Lookup來避免這個問題。
<Properties>
<Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>
或者直接禁用掉JNDI Lookup:
<Properties>
<Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>
<Loggers>
<Root level="info">
<AppenderRef ref="File"/>
</Root>
<Logger name="org.apache.logging.log4j" level="WARN"/>
<Logger name="com.acme" level="DEBUG">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
可以發現,關閉JNDI Lookup只需要在log4j2.xml文件中新增一段<Logger name="org.apache.logging.log4j" level="WARN"/>即可。
四、修復的代碼示例
更新log4j-core組件或者禁用掉JNDI Lookup這兩種方法都可以修復這個漏洞。修改log4j2的配置文件,添加一個Logger配置來禁用JNDI Lookup,代碼如下:
<Properties>
<Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
<Logger name="org.apache.logging.log4j" level="WARN"/>
</Loggers>
此配置省略了默認的<Appenders>標籤,使日誌控制台輸出到終端。
五、總結
本文介紹了Log4j漏洞的產生原因、影響範圍以及漏洞修復方案。為保證代碼安全,建議在項目中使用較新的log4j版本或禁用JNDI Lookup功能。
原創文章,作者:WRBC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/137721.html