两年前云鼎实验室的两位安全技术专家,在世界顶级安全峰会 Blackhat USA 上做过一次关于使用CodeQL进行二进制静态分析的演讲,创新性的将CodeQL应用到二进制分析领域,到目前为止在世界范围内也是独一无二的尝试。两年后,随着AI技术的蓬勃发展,我们将AI和静态分析技术深度融合,借助LLM和Agent体系,将静态分析的召回率和精确率都提升到前所未有的高度,并且在腾讯内部生产环境里落地应用,解决了很多现实风险问题。同时,我们也坚定的认为传统静态分析技术和CodeQL等分析工具仍有巨大的提升空间。AI和静态分析不是取代关系,是互相加持的关系。此次在Blackhat上的分享,一定程度上是对我们理念和实践的一次全面阐述。在此我们整理了一篇文章,将其中的一些技术要点做简单介绍。
首先,我们在代码安全扫描实践工作中,遇到了两个大的障碍是纯粹依靠静态分析难以解决的:
1、在污点分析中,因为开源项目众多,二开和定制化的情况也很多,source和sink点永远也收集不全,即便依赖知识库也难以达到好的覆盖。
2、在数据流分析中,限于很多编程语言的特性,比如各种异步调用和隐式传递,数据流分析经常会断流。而我们所做的工作也是集中解决如上的这两个问题。
基于大模型在训练阶段的知识嵌入和代码能力,业界已经发现大模型可以在代码中自动识别一些source和sink点,但是直接使用大模型带来的识别率和准确率无法让人满意。我们对应的解决方法是设计了一套多agent组合判定机制。其中包括三个重要角色,分别是Discover agent、Judge agent和Validation agent。三者分别负责发现、判断和验证。用这种将一个复杂任务拆解成多个简单任务,并由多个agent各自负责并循环提升的方式获得好的效果。目前我们这套流程每天都会自动发现和入库很多source sink点,并满足高精度要求。
当然,这里对源代码的处理不是简单的直接塞给LLM。中间我们适度的使用了LSP和其它analysis技术,让agent可以在代码间形成索引和跳转。按需获取必要的代码片段以及上下文信息。
另一个问题就是静态分析中最常见的数据流分析,限于很多语言特性数据流的传播不能保证完整性,一些隐式的方法调用和数据传递方式导致静态分析很难精确和完整的追踪数据流向。对此我们的解法是改造CodeQL的基础类库,将各种断链的情况解决掉。举几个例子比如代码中使用跨线程、反射、符号表等方法将传播流断开。
解决这些问题又存在两个难点,首先需要将CodeQL的DFA (Data Flow Analysis) 机制研究清楚,但是CodeQL本身闭源,再加上QL是Datalog类的语言难以调试,所以这里就很困难。我们被迫采用了一些逆向工程的手段将CodeQL的DFA机制研究清楚。这里不做展开,有兴趣的同学可以看我们峰会演讲后的材料。
第二个难点就是跨线程、反射等情况下,对方法调用的精确定位比较难,封装层次,弱引用,继承关系,命名空间等都是问题。先要解决这些识别问题才能patch CodeQL以实现DFA的强化。最终我们能做到在跨线程、反射、隐式值传递等情况下的完整数据流分析。
在做了source/sink自动精整识别和DFA强化后,我们的代码安全检测能力如预期的一样获得了极大提升,可以7*24小时自动扫描出漏洞信息。基于此我们也发现了不少高危漏洞。这里拿几个历史漏洞来举例,当你使用原版CodeQL的情况下,如下的漏洞都不会被扫描出来,使用我们强化过的方案都可以做到扫描发现。
左右滑动查看更多
最后,我们想抛出一些明确的观点来供业界参考:
1、AI不是解决方案,AI是技术手段。大模型在很多场景下可以提供帮助,但是单靠AI远远不够。大模型再怎么训练本身可以嵌入的知识是有限的,没有外部LSP等技术的配合大模型没办法很好的工作。
2、 静态分析仍然是很给力的技术手段。AI+静态分析可以互相促进获得之前不能达成的效果。两者相结合是未来代码分析的最佳形态。
3、 体系和系统化是关键。需要一个Driver去驱动各种Agent和工具来一起完成代码分析任务。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...