Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊漏洞自动修复技术的行业现状

聊聊漏洞自动修复技术的行业现状

作者头像
泉哥
发布于 2020-12-30 08:14:21
发布于 2020-12-30 08:14:21
99900
代码可运行
举报
文章被收录于专栏:漏洞战争漏洞战争
运行总次数:0
代码可运行

好久没写公众号了,收集整理了当前学术界与工业界的一些漏洞自动修复技术,对此作个简单分类与记录,谈谈原理,也聊聊个人看法。

1、基于依赖组件版本的修复方法

现在有很多包管理器,比如npm、maven,在里面指定下第三方组件版本号即可。所以如果想自动修复开源组件的历史漏洞,通过爬虫监控一些安全公告站点,去收集历史漏洞相关的版本信息,然后就可以直接生成安全版本号,然后Pull Request去合并即可。

去年Github收购Dependabot后,就是专门干了这件事。

这种自动修复方式目前我们也已经应用了,准确度理论上也可以做到100%。除了用在日常检测与修复漏洞外,用于安全应急也是个不错的选择。

漏洞信息的收集也是个长期积累的过程,还有那种包依赖另一包的死循环问题,也是项令人头疼的问题,目前可能没有特别好的解决方案。

2、基于程序移植的修复方式

2015年麻省理工学院发布了一款叫CodePhage的漏洞自动修复系统(研究论文:https://people.csail.mit.edu/stelios/papers/codephage_pldi15.pdf),它不需要程序源码,其输入样本是:一个可造成目标程序(Recipient,接收者)崩溃,一个不会,然后从程序代码仓库中去搜索能够同时满足两个样本情况的程序(Donor,贡献者)。将两个样本的执行路径进行对比以定位错误位置(Candidate Check Discovery),提取Donor对输入数据的处理逻辑,以生成对应的补丁代码(Check Excision),然后插入错误位置进行修复(Check Insertion),再收集上下文信息对补丁代码进行适配转换(Check Translation),最后再验证补丁是否消除(Patch Validation)。

下面是CodePhage的实际案例测试结果:

整个系统都是假设修复代码可以在其它程序中找到,这条其实很难满足的。几年过去了,这种修复方式的影响非常小,也证明了这一点。如果是同一帮人写的代码,那么就可能出现相似的漏洞,行业对这种寻找相似漏洞的分析方式,称为变体分析(Variant Analysis)。所以,这种检测方式倒不如用来挖掘相似漏洞,而不是寻找修复代码。

3、基于AST与模板的修复方式

今年陌陌发布一个IDEA插件用于检测Java代码漏洞并提供自动修复代码生成的功能。它利用IDEA的Inspection机制去检测代码,提供“一键修复”功能,这种方式对开发者非常友好。

检测原理也比较简单,就是利用IDEA SDK提供的接口从语法上去检测表达式,判断程序使用的是哪个XML解析类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
  if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.parsers.DocumentBuilderFactory", "newInstance")) {
    commonExpressionCheck(expression, "setFeature", XmlFactory.DOCUMENT_BUILDER_FACTORY, false);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.parsers.SAXParserFactory", "newInstance")) {
    commonExpressionCheck(expression, "setFeature", XmlFactory.SAX_PARSER_FACTORY, false);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.transform.sax.SAXTransformerFactory", "newInstance")) {
    commonExpressionCheck(expression, "setAttribute", XmlFactory.SAX_TRANSFORMER_FACTORY, true);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "org.xml.sax.helpers.XMLReaderFactory", "createXMLReader")) {
    commonExpressionCheck(expression, "setFeature", XmlFactory.XML_READER_FACTORY, false);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.validation.SchemaFactory", "newInstance")) {
    commonExpressionCheck(expression, "setProperty", XmlFactory.SCHEMA_FACTORY, false);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.stream.XMLInputFactory", "newFactory")) {
    commonExpressionCheck(expression, "setProperty", XmlFactory.XML_INPUT_FACTORY, false);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.transform.TransformerFactory", "newInstance")) {
    commonExpressionCheck(expression, "setAttribute", XmlFactory.TRANSFORMER_FACTORY, true);
  } else if (MoExpressionUtils.hasFullQualifiedName(expression, "javax.xml.validation.Schema", "newValidator")) {
    commonExpressionCheck(expression, "setProperty", XmlFactory.VALIDATOR_OF_SCHEMA, false);
  }
}

然后根据不同的XML解析类的修复模板生成代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 生成待插入的语句内容
List<String> blockTextes = new ArrayList<>();
if (xmlFactory.equals(XmlFactory.DOCUMENT_BUILDER_FACTORY) ||
    xmlFactory.equals(XmlFactory.SAX_PARSER_FACTORY) ||
    xmlFactory.equals(XmlFactory.SAX_BUILDER) ||
    xmlFactory.equals(XmlFactory.SAX_READER) ||
    xmlFactory.equals(XmlFactory.XML_READER_FACTORY)
) {
    blockTextes.add(varName + ".setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);");
} else if (
    xmlFactory.equals(XmlFactory.SAX_TRANSFORMER_FACTORY) ||
    xmlFactory.equals(XmlFactory.TRANSFORMER_FACTORY)
) {
    blockTextes.add(varName+".setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, \"\");");
    blockTextes.add(varName+".setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, \"\");");
} else if (
    xmlFactory.equals(XmlFactory.SCHEMA_FACTORY) ||
    xmlFactory.equals(XmlFactory.XML_INPUT_FACTORY) ||
    xmlFactory.equals(XmlFactory.VALIDATOR_OF_SCHEMA)
) {
    blockTextes.add(varName+".setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, \"\");");
    blockTextes.add(varName+".setProperty(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, \"\");");
}

这是开发过程中的检测与修复方式,还有开发完成后的检测与修复方式,在实际商业产品中,我只在RIPS中见过。

RIPS在检测代码发现漏洞后,会将source与sink存入数据库,然后对漏洞类型进行比较细化的分类,再根据分类寻找对应的修复代码模板,再将source这些上下文信息代入模块中生成最终的补丁代码。

修复代码模板如下:

这种结合AST与模板的生成方案,准确率还是比较高的,但是支持的范围相对比较有限,代码逻辑一复杂就无法修复,更多地还是针对简单漏洞模型的修复。

4、基于约束求解与符号执行的修复方式

这种方法更多是针对缓冲区溢出一类内存破坏漏洞的修复,对源码和二进制都适用。对于检测到漏洞,先通过分析CFG控制流图、符号执行分析,生成路径可达条件和漏洞触发条件取交后的约束,再进行约束求解,根据求解结果生成相应的修复代码。比如加入对缓冲区边界的条件判断、将不安全的函数替换成安全函数、增大缓冲区内存大小等等。

可参考研究论文“BovInspector: Automatic Inspection and Repair of Buffer Overflow Vulnerabilities”:

https://seg.nju.edu.cn/uploadPublication/copyright/116-553503409.pdf

这种针对特定漏洞类型还是比较适用的,比如溢出,但因为涉及路径分析、符号执行、约束求解,对性能是一种挑战,还有路径爆炸等问题,对于大程序分析是一大挑战,也并不是那么通用。

5、基于AI的修复方式

Facebook内部有一款叫Getafix的自动修复Bug的工具,它会利用AI去学习之前提交的代码,利用聚类算法从历史代码中找到一种修复Bug的模式,它能够创建一个包含各种语法树比较数据以及所隐含的修复模式集合,再结合当前上下文生成修复代码。

这工具还是偏代码Bug的修复,而非安全漏洞,而且支持类型很少,主要是针对空指针异常

参考资料:https://engineering.fb.com/2018/11/06/developer-tools/getafix-how-facebook-tools-learn-to-fix-bugs-automatically/

总结

纵观各种漏洞自动修复方法,落地到工业界的很少,对于漏洞自动修复技术的探索还有很有很长的路要走。

除上面提的方法外,其实还有一些学术论文有其它方法,但都很难实际利用到生产环境中,我主要整理了一些当前工业界正在用,以及学术界主流的一些思路,汇总归类下当作学习笔记了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞战争 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CodeQL进行JAVA代码审计(1) --- XXE漏洞的挖掘
XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
半月弧
2020/04/27
3.5K2
CodeQL进行JAVA代码审计(1) --- XXE漏洞的挖掘
【SDL实践指南】Fortify控制流巧用之XXE规则调试记录
在Fortify执行静态代码扫描时会加载默认规则和自定义规则目录下的自定义规则内容,输出结果中不仅有默认规则的众多的安全问题还会有自定义规则扫描出来的问题,如果我们想要只扫描我们自定义的规则那么就得重新进行二次扫描,基于此背景我们可以借助Fortify protal的接口来执行静态代码扫描并且附加相关的参数来丢弃对默认规则的导入,在使用自定义扫描规则执行静态代码扫描之初我们需要去按需自定义静态代码的扫描规则,本篇文章主要记录近期编写、调试关于XXE漏洞静态代码扫描规则中的历程,主要包括规则定义、规则使用、规则优化、误报处理、规则输出等环节
Al1ex
2025/02/19
1070
【SDL实践指南】Fortify控制流巧用之XXE规则调试记录
Java 中文官方教程 2022 版(四十)
本课程专注于 XML 的流式 API(StAX),这是一种基于 Java 技术的流式、事件驱动、拉取解析的 API,用于读取和写入 XML 文档。StAX 使您能够创建快速、相对易于编程且具有轻量级内存占用的双向 XML 解析器。
ApacheCN_飞龙
2024/05/24
2030
从最近的微信支付看XXE漏洞
先说下写这篇文章的初衷吧,最近微信支付java_sdk刚爆发了一次xxe漏洞,然后领导赶快用自家的静态代码审计工具做了审计(这里我就不报名字,本来可以帮公司推广下产品是很好的,但我怕本文过于基础会被各位大佬喷出翔来,到时候有辱“司”门就真是罪过罪过了)。
FB客服
2018/07/31
1.2K0
从最近的微信支付看XXE漏洞
Java安全编码实践总结
Java作为企业主流开发语言已流行多年,各种java安全编码规范也层出不穷,本文将从实践角度出发,整合工作中遇到过的多种常见安全漏洞,给出不同场景下的安全编码方式。
FB客服
2020/07/15
1.6K0
Java安全编码实践总结
【漏洞简析】weblogic CVE-2019-2647等相关XXE漏洞分析
按照惯例,Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)一看就是一堆漏洞,高危的还好几个。
绿盟科技安全情报
2019/10/24
8120
【漏洞简析】weblogic CVE-2019-2647等相关XXE漏洞分析
Java 审计之XXE篇
在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过。下面来 深入了解一下该漏洞的产生和利用。
全栈程序员站长
2022/07/13
6720
谈谈微信支付曝出的漏洞
昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为,其中就包括众多媒体所宣传的“0元也能买买买”。
美的让人心动
2018/07/30
1K0
谈谈微信支付曝出的漏洞
Java代码审计汇总系列(二)——XXE注入
OWASP Top 10中的另一个注入漏洞是XML外部实体注入(XXE),它是在解析XML输入时产生的一种漏洞,漏洞原理和黑盒挖掘技巧见之前的文章:XML外部实体(XXE)注入原理解析及实战案例全汇总,这里从代码层角度挖掘XXE漏洞。
Jayway
2019/11/12
2.6K0
Java面试之 OOAD & UML
答:UML 是标准建模语言;常用图包括:用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
全栈程序员站长
2022/08/04
3320
WebLogic CVE-2019-2647~2650 XXE漏洞分析
Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)
Seebug漏洞平台
2019/05/13
1.1K0
WebLogic CVE-2019-2647~2650 XXE漏洞分析
从JDK源码来看XXE的触发原理和对应的防御手段
这个JDK中内置的类是一种的DOM型的解释器,该种Parser的特点是将完整的xml文档内容加载到树结构中去,然后我们通过遍历结点来获取我们需要的内容。
FB客服
2023/02/10
5060
从JDK源码来看XXE的触发原理和对应的防御手段
微信支付工具类
微信支付工具类 WechatPayXmlUtil 点击查看代码 import org.w3c.dom.Document; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; /** * 2018/7/3
化羽羽
2022/11/14
5560
java最新漏洞_JavaMelody XXE漏洞(CVE-2018-15531)分析
JavaMelody是一款在生产和QA环境中对JAVA应用以及应用服务器(Tomcat、Jboss、Weblogic)进行监控的工具,可以通过图表给出监控数据,方便研发运维等找出响应瓶颈、优化响应等。
全栈程序员站长
2022/09/08
2.2K0
XXE修复方案参考
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142448.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
6730
CVE-2017-12629 - Apache Solr XXE & RCE 漏洞分析
Versions Affected Apache Solr before 7.1.0 with Apache Lucene before 7.1 Elasticsearch, although it uses Lucene, is NOT vulnerable to this. Description ​ Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该
风流
2018/06/07
2.6K0
Android 创建与解析XML(二)—— Dom方式
Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容
阳光岛主
2019/02/19
6770
Spring周边:XML
DOCTYPE 声明为文档提供一个空间,通过引用外部文件、通过直接声明或通过这两种方式来标识其根元素和文档类型定义 (DTD)。DOCTYPE 声明可以包含下列内容:
WEBJ2EE
2019/10/24
1.9K0
Spring周边:XML
XXE漏洞那些事儿(JAVA)
之前我们学习了DocumentBuilder这个XML解析类的使用方法,还展示了如何读取本地文件以及利用XXE外带数据,当然,也简单的提到了相应的防御方法,这一章,我们将学习其他一些JAVA中常用的XML解析方法以及编码规范
tnt阿信
2020/08/05
1.2K0
XXE漏洞那些事儿(JAVA)
Java面试系列21-xml
1.xml有哪些解析技术?区别是什么? 有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析
Java帮帮
2018/03/19
7300
相关推荐
CodeQL进行JAVA代码审计(1) --- XXE漏洞的挖掘
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验