2019-06-17 12:03:1816846人阅读
OpenRASP 是百度安全推出的一款开源、免费的自适应安全产品,目前与国际知名非盈利安全组织OWASP(Open Web Application Security Project)达成深度合作,现已加入到OWASP全球技术项目中,在全球范围内进行大规模推广。OpenRASP将新兴的RASP(Runtime Application Self-Protection)安全防护技术普及化,使其迅速成为企业Web安全防护中的一个重要武器,有效增强防御体系纵深和对漏洞防护的适应能力。
近期WebLogic 漏洞频频爆发,本文介绍RASP技术在防御这些漏洞上的优势。
漏洞回顾
WebLogic最近几年爆出了多个高危漏洞,主要类型是XXE、文件上传和反序列化三种。已经公开PoC的如下:
【CVE-2019-2725】wls9-async XMLDecoder 反序列化漏洞
【CVE-2019-2647】WSATStreamHelper Blind XXE 漏洞
【CVE-2019-2618】DeploymentService 任意文件上传漏洞(需要认证)
【CVE-2018-2628】T3 proxy 反序列化漏洞
【CVE-2017-10271】wls-wsat XMLDecoder 反序列化漏洞
...
RASP防护引擎运行于应用内部,可以在代码层面修复这些缺陷。以【CVE-2019-2647】WSATStreamHelper Blind XXE 漏洞为例,若要使用WAF防御,通常是增加XML的相关规则,拦截恶意的外部实体。而RASP技术可以通过挂钩 javax.xml.parsers.SAXParserFactory 类的函数,在应用解析XML之前检查外部实体是否安全;也可以采用更加安全的方式,直接调用 SAXParserFactory.setFeature 禁止外部实体加载,在代码层面修复漏洞。下面我们来详细了解一下。
漏洞修复
首先,我们来看下XXE漏洞。如果没有特殊需求,我们通常会要求研发通过修改代码的方式,禁止外部实体加载:
在PHP下面,我们通常会增加:
// simple loader 示例
libxml_disable_entity_loader(true);
// DOMDocument 示例
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);
在Java下面,我们通常会增加:
// dom4j 示例
SAXReader reader = new SAXReader();
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
利用RASP技术,我们无需修改代码,即可实现对漏洞的热修复。以 Java dom4j 方式为例,通过挂钩 SAXReader 的构造函数,在对象初始化之后立即调用 setFeature 函数,即可修复漏洞。我们计划在 OpenRASP v1.1 版本实现这个算法,并增加对dom4j/sax/stax/jdom等XML解释器的支持。若要了解更多XXE漏洞的修复方法,请参考 OWASP - XML External Entity (XXE) Prevention Cheat Sheet。
然后,我们来看下文件上传漏洞。通常,我们会要求研发对上传的文件进行过滤,白名单化允许使用的扩展名。
OpenRASP 提供了一套通用的文件上传防护框架。通过挂钩 org.apache.commons.fileupload.servlet.ServletFileUpload/move_uploaded_files 等函数,可以在应用处理文件上传时,结合目标文件名、Content-Type、文件内容等参数进行检测:
type = fileUploadparams = { "name": "file", "filename": "a.jsp", "content": "<% ... %>"}
从类实例里获取解析好的参数,不会受到畸形的 multipart 协议影响
无需修改代码就可以热修复大部分上传漏洞
由于文件上传是一个和业务强相关的操作,OpenRASP默认使用黑名单方式,只拦截 php/jsp/.. 等扩展名。
最后,我们来看下反序列化漏洞。由于业务需求,可能无法禁止反序列化。因此,修复反序列化漏洞的方式通常是class黑名单过滤。
比如 WebLogic CVE-2015-4852 就是用这种方式修复的:
org.apache.commons.collections.functors*com.sun.org.apache.xalan.internal.xsltc.trax*
javassist*
org.codehaus.groovy.runtime.ConvertedClosure
org.codehaus.groovy.runtime.ConversionHandler
org.codehaus.groovy.runtime.MethodClosure
java.lang.ProcessBuilder.start ...
java.lang.reflect.Method.invoke
...
java.beans.XMLDecoder.readObject
通过遍历堆栈,我们发现这个命令执行来自XMLDecoder的反射调用(正常的代码应该是直接调用),因此判定为异常操作。另外,增加XMLDecoder的检测规则后,我们不但可以防御 CVE-2019-2725、CVE-2017-10271,后续再有基于 java.beans.XMLDecoder 的命令执行利用都可以防护,无需升级。
写在最后
OpenRASP 是百度AIoT安全解决方案的重要组成部分,也是百度下一代AI安全技术栈的核心技术之一。从新一代安全技术的研发与开源,到为行业提供一体化安全解决方案,再到促进学术、企业、机构间多层面协作,百度安全实验室正在升级打造AI时代的安全生态,打破产业隔阂,避免生态碎片化,以此推动AI时代的安全生态建设。
今年6月份我们会发布基于RASP技术的 DevSecOps 社区版方案。若想在第一时间了解我们的动态,请加入QQ技术讨论群 259318664 讨论(微信群需要联系群主加入)。
更多内容请移步:
OpenRASP 项目主页: https://rasp.baidu.com
GitHub 源代码:
https://github.com/baidu/openrasp