引言
前段时间,GPT技术的重大突破引起了业界的广泛关注,其对于代码的解析及分析能力更是让人叹为观止。许多安全研究者都在尝试将GPT技术应用在静态代码分析(SAST)领域,截至目前,已经有很多安全媒体和厂商发表过相关的研究结果。
腾讯Xcheck团队作为专注在SAST领域十余年的技术团队,我们基于自身的专业积累,对ChatGPT进行了深度的分析评测,我们认为:当前的GPT技术已具备基本的静态代码分析能力,但在代码安全风险检测方面,GPT在技术能力上还存在较大的缺陷和差距,其可在一些细分场景下提高SAST工具的用户体验,但不能对专业SAST工具实现替换。
类比一下,GPT技术与SAST的关系就像是基因检测技术和抽血化验技术的关系。就像GPT技术一样,基因检测技术是更为前沿和新兴的检测手段,能够应用在生命科学的各个领域。但如果针对个人健康检查这一细分场景,已有的抽血化验技术能够更加简单直观的检测人体各项健康指标。我们相信,飞速发展的基因检测技术能在某些细分场景有较大价值,但一定不会在医院或体检机构里对抽血化验技术形成替换。
聊完观点,以下是我们关于GPT技术在代码安全分析领域应用前景的详细分析报告:
为什么GPT不能
直接替代SAST工具
1、技术原理层面的局限性
a) 分析能力不足:不能支持复杂的代码场景
GPT 是一种基于自然语言处理的技术,在静态代码分析时,会对代码进行 Token 化和语法分析来识别潜在的安全漏洞和代码缺陷。然而,由于代码的和自然语言的语法结构存在差异,在复杂的代码场景下,GPT 往往无法正确理解代码中的变量、函数、类等结构的含义和作用,从而无法正确发现漏洞或输出完全不相关的结果。
因此,对于复杂的代码场景,GPT 仍然需要人的指导和支持,才能更好地发挥作用。
以 ChatGPT 为例:输入简单的 PHP 命令执行代码,ChatGPT 能很好的发现问题。
然而,增加变量作用域之后,由于代码解析能力的局限,GPT 无法正确识别代码,出现了明显的误报,此处应该没有命令注入问题。
再进一步测试,我们发现,在没有调用函数的情况下,GPT 由于缺少识别能力再次误报,需要人工指导后修正。
以上是 GPT 分析能力不足的示例,经过Xcheck团队的测试,我们系统的整理了 GPT 对于各类代码结构的识别情况,从下表中我们可以得出结论:虽然 GPT 可以理解代码,但它无法像 SAST 工具那样深入分析代码的结构和逻辑。在处理复杂的代码场景时,Xcheck 仍然是更可靠和有效的选择。
代码结构
详细分类
GPT支持情况
Xcheck支持情况
变量
变量赋值
支持
支持
变量作用域
不支持
支持
数据类型
支持
支持
分支
if语句
支持
支持
switch语句
不支持
支持
循环语句
部分支持
支持
函数
直接调用
部分支持
支持
回调函数
不支持
支持
递归调用
不支持
支持
类
类的实例化
支持
支持
属性访问和修改
部分支持
支持
方法的调用
部分支持
支持
继承和多态
不支持
支持
构造函数和析构函数
不支持
支持
包
包的导入/使用
部分支持
支持
包的导出
不支持
支持
文件
跨文件
不支持
支持
b) Token长度限制:真实项目扫描受限
GPT 在处理输入时,会将将输入文本分解成单个单词或符号来,这些单词或符号被称为“Token”。目前的 GPT 通常都有最大 Token 数量的限制,例如,GPT-3.5 的最大输入长度为 4k 个 Token,而 GPT-4 的最大输入长度为 32k 个 Token。
OpenAI 模型 Token 限制
Model
Max Tokens
text-davinci-003
4,097
code-davinci-002
8,001
gpt-3.5-turbo
4,096
gpt-4
8,192
gpt-4-32k
32,768
对于真实项目来说,代码量很容易就超过 32k 个 Token,以WordPress 项目为例,所有 PHP 代码的 Token数量为 5,260,275,远超 Token 上限。即使用 Embedding 向量化处理代码,也无法保证单次查询时代码上下文的完整性,这就意味着 GPT 每次只能处理项目或者文件中的一部分,这会直接导致分析结果的不准确。
c) 稳定性问题:结果波动、API不稳定
由于 GPT 是一种基于神经网络的模型,其内部结构非常复杂,包含大量的参数和层级,还有一些随机性因素,这些随机性可以在对话场景下输出不一样的结果,提升真实性。而在 SAST 场景下,不稳定的结果意味着漏报和误报,即使可以通过调整参数来减少随机性,但结果仍然存在波动。
此外,GPT 的 API 也可能存在不稳定的问题。由于 GPT 目前多是以 API 形式提供服务,在进行静态代码分析时,可能会由于 API 服务的速率限制、负载、网络延迟、服务器故障等原因,导致分析结果的不准确性和稳定性问题。
2、实际落地场景层面的局限性
除了技术层面,数据安全、法律合规和成本等因素也使得 GPT 难以用于生产:
GPT 这类大型模型目前不支持私有化部署,只能通过 API 接口将代码发送到远程服务进行分析。由于代码是相对敏感的数据,一旦数据出了内网,就有可能造成不可控的数据泄露问题。这就意味着,对于很多行业客户来说,使用 GPT 进行代码安全检测是完全不合规的
GPT 的每个请求都需要一定的计算资源和时间来得出结果,使用 GPT 进行代码安全检测的成本可能会比现有的 SAST 工具更高。为了弥补这些成本,OpenAI 的 API 是需要付费使用的,收费模式如下表所示,一个大项目每次扫描可能就需要几美元。因此,使用 GPT 进行代码安全检测时,需要考虑高额的 API 成本问题。
OpenAI 模型定价
Model
Usage
gpt-3.5-turbo
$0.002 / 1K tokens
gpt-4
$0.03 - $0.06 / 1K tokens
gpt-4-32k
$0.06 - $0.12 / 1K tokens
使用 GPT 进行代码安全检测还存在一些法律合规问题。由于 GPT 是一种新兴的技术,目前相关的法律法规还在陆续出台和完善。因此,在使用 GPT 进行代码安全检测时,还需要注意遵守相关的法律法规,以避免可能的法律风险。
GPT技术在代码安全分析领域
可落地的应用前景
虽然GPT技术不能直接替代SAST工具,但利用其能力可以很好的提高SAST产品的使用效果和体验。
基于我们的测试结果,我们认为GPT技术可以在以下场景有较为明确的落地机会,Xcheck产品在后续的迭代中也会新增相关的功能和能力,敬请期待。
1、面向SAST产品用户
a) 提供最佳修复建议
GPT 可以基于 SAST 工具发现的漏洞,分析实际漏洞,并根据代码结构、漏洞类型等因素,提供更贴合实际情况的修复代码和指引。相比固定的修复建议和样例代码,这种个性化的修复建议可以帮助研发人员更快地解决漏洞,提高工作效率。
b) 智能审计助理
在使用 SAST 工具缺陷审计时,可以嵌入 GPT 作为审计助理,通过内置的一系列提示词,既可以智能分析漏洞,提供详细的解释和分析,并确定漏洞是否真实有效,也可以让用户和 GPT 进行交互式对话,例如,开发人员可以询问有关漏洞的危害、常见的利用方式等问题,从而更好地理解漏洞,并快速解决问题。这种智能化的审计助理可以帮助用户更好地掌握漏洞信息,提高审计的准确性和效率,提升用户体验。
c) 辅助编写自定义规则
GPT 可以根据要求提取出代码中的关键信息,并按照指定格式生成 SAST 工具可用的规则。帮助用户更快地生成规则,提高规则的准确性和可用性,降低规则编写的工作量,从而更好地检测潜在的漏洞或者降低误报。
d) 辅助开发安全培训与教育
GPT 技术可以帮助开发安全团队建设企业内部的开发安全知识库及规范,用于为开发人员提供编码规范和安全编程的实践教程
2、面向 SAST 厂商
a) 提高检测能力
虽然在复杂的代码场景中 GPT 的能力不足,但是在简单的代码片段中,它可以准确地理解代码中的语义内容,包括变量类型、函数调用关系、变量值的含义等,相比根据专家经验来提取信息,GPT 给出的信息更为贴合实际情况。SAST 产品可以基于这些信息,在漏洞分析过程中更好地理解代码,从而减少漏报和误报。
b) 生成漏洞样本
GPT 可以根据代码的结构和特征,自动化地生成各种语言、框架和库的漏洞代码,并作为数据集用于 SAST 产品能力评测、算法优化或模型训练等方面。相比传统的数据集构造方式,GPT 生成的样本更贴近真实代码,并且成本更低。
附录:腾讯Xcheck介绍
Xcheck是腾讯自研的新一代开发安全工具,拥有SAST、SCA、制品扫描三大模块。SAST模块采用创新的技术路线,摒弃了传统SAST工具主要依赖规则匹配的技术原理,基于成熟的污点分析技术与对抽象语法树的精准剖解,实现了快速精准的识别代码风险。
作为新一代的SAST工具,Xcheck解决了传统白盒扫描速度慢、误报高的通病,非常适合集成到DevOps的流水线当中使用。当前腾讯内部已全面使用Xcheck作为DevOps开发环节中的必备检测工具。
针对Golang、Java、Nodejs、PHP、Python等常用语言,Xcheck引擎算法具有非常明显优势,能够实现每秒万行的扫描,速度是同类工具的几十倍。同时,Xcheck产品经过每年数百万个真实项目统计,工具自身误报率可控制在10%以下,远低于同类工具。