引言
前段时间,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 |
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%以下,远低于同类工具。