单位 7 / 11

安全代码审查和静态分析:利用人工智能查找漏洞

收益:

  • 能够使用人工智能作为第二只眼睛,并通过提供上下文来标记代码中的 OWASP 类漏洞(注入、硬秘密、访问控制)
  • 能够根据上下文消除人工智能产生的误报,并防止在未经验证的情况下将每个发现视为真正的漏洞
  • 能够认识到人工智能建议的修复可能会引入新的漏洞/错误,并使每个补丁通过审查和测试门

软件内的漏洞是最昂贵的漏洞之一,因为它们从一开始就嵌入到产品中并分发给数百万用户。安全代码审查是在投入生产之前逐行读取源代码并捕获漏洞(SQL 注入、身份验证漏洞、硬编码密码、不正确的授权)的过程。如果是手工完成的话,又慢又累;在大型代码库中很容易错过漏洞。

人工智能在代码审查方面的强大有两个原因:代码也是一种语言,人工智能擅长模式识别。人工智能可以快速标记一段代码中的危险模式(将用户输入直接放入查询中、未加密的数据存储、缺少输入验证),解释每个代码为何存在风险,并提出修复建议。但AI看不到代码的整个操作上下文(输入可能正在另一层被清除),它可能发明了一个不存在的漏洞(误报)或错过了一个真正的漏洞(漏报),最重要的是,它提出的“修复”可能会引入新的漏洞或错误。人工智能是代码审查的第二只眼睛和指针;开发人员和安全专家决定发现的结果是否是真正的漏洞以及修复是否正确且安全。

代码审查的步骤

  1. 给出范围和背景。哪种语言,哪个框架,该代码在哪里接受输入,在哪里给出输出,在哪一层工作?没有上下文的代码审查会产生误报。
  2. 扫描危险模式。搜索已知的 AI 漏洞类别(例如 OWASP Top 10):注入、身份验证、敏感数据泄露、访问控制。
  3. Have each finding justified.对于每个标志:哪一行、哪个漏洞类别、如何利用它、证据是什么。不合理的发现不会得到认真对待。
  4. 消除误报。输入是否真的被清除了,该路径是否真的可以访问——检查上下文。
  5. 验证修复情况。确认AI推荐的补丁确实关闭了漏洞,没有引入新的漏洞/bug,并且已经通过测试。
  6. 人类的认可。开发人员+安全专家审查发现并修复;这就是它进入代码存储库的方式。

术语:SAST(静态应用程序安全测试 - 分析源代码而不运行源代码的静态安全测试)。 DAST(动态 — 外部测试正在运行的应用程序的动态测试)。 OWASP Top 10 是最常见 Web 应用程序漏洞的标准列表。注入是将用户输入解释为命令/查询(例如 SQL 注入)而导致的漏洞。参数化查询是通过将输入与代码分离来防止注入的正确方法。

常见漏洞类别表

漏洞等级

症状(在代码中)

正确的解决方案

AI的陷阱

SQL注入

将输入连接到查询中

参数化查询

可以忽略消毒

硬编码的秘密

密码/输入代码

秘密保险箱(保险库),env

假阳性(样本/测试)

弱认证

控制缺失/不正确

强大的集中控制

错过了上下文

访问控制错误

没有授权检查

服务器端授权

不懂复杂的流程

敏感数据泄露

无密码存储/记录

加密、屏蔽

无法知道关键性

不安全的序列化

反序列化不可靠的数据

安全解析

错过了罕见的图案

三个迷你箱子

案例 1 — 捕获实际注入。开发人员让 AI 检查数据访问功能。 AI 标记了将用户的 userId 值直接连接到 SQL 文本的行,并说“这是经典的 SQL 注入,将其转换为参数化查询”;提供样本校正。开发人员确认输入尚未在其他地方进行清理,验证它是否是一个真正的漏洞,实现建议的参数化查询,并编写测试。人工智能凸显了这一漏洞;验证和修正测试来自开发商。

情况 2 — 误报固定秘密。 AI在文件中看到password =“test1234”行并说“关键:硬编码密码”。开发人员检查上下文:这是一个单元测试文件,一个虚拟测试数据,未发布到生产中,也未移植到真实系统。该发现是误报。开发人员记录了这一点,但没有采取行动,因为这不是真正的秘密。教训:人工智能的“硬秘密”标志必须通过上下文消除;并非每个字符串都是秘密。

案例 3 — 新漏洞修复。 AI提出了针对XSS(跨站脚本)漏洞的修复方案;但他建议的代码会清除错误位置的输入并跳过另一个区域的输出编码;结果,差距并没有完全缩小。安全专家审查修复情况,注意到缺失的编码,并将其修复在正确的层。教训:人工智能推荐的补丁不会自动安全;每个修复都经过审查和测试。

弱提示/强提示

弱提示:

这段代码是否有漏洞,修复一下:[代码]

该提示没有给出上下文(语言、框架、输入源),不要求理由,不质疑误报,并且愿意盲目接受人工智能产生的纠正。人工智能混合了真实脆弱性和不存在脆弱性的迹象。

强力提示:

您的角色:助理,是开发人员在安全代码审查方面的第二只眼睛。决策; consider the fix directly applied.代码:[指定语言/框架].上下文:此函数[输入源:例如接收[外部HTTP请求],写入[输出目的地]。您的任务:(1) 使用 OWASP 类标记可能的漏洞,给出行号 + 为什么存在风险 + 如何利用 + 每个发现的证据,(2) 为每个发现编写至少 1 个误报场景(例如,如果输入在另一层中进行了清理),(3) 建议修复,但带有“[审查 + 编写测试]”标志;还要评估修复是否引入新的漏洞/错误。添加一个假漏洞。[代码]

强烈提示提供背景信息,要求提供 OWASP 类别和证据,质疑误报和补救风险,强制进行人工审查。

可复制的提示模板

漏洞扫描模板 检查 OWASP Top 10 的 [语言/框架] 代码。对于每个可能的发现:行号、漏洞类别、为什么有风险、示例利用、证据强度(确定/可能/弱)。上下文:输入[源],输出[目标]。添加捏造的发现;如果您不确定,请输入“[必须验证]”。代码:[粘贴]

假阳性消除模式 对于以下代码查找,列出不存在真正漏洞的场景:是否可以在另一层清除输入,该路径是否可访问,该值是否为测试/样本,框架是否自动受到保护。写下每一项的确认方法。发现:[粘贴]

修复评估模板建议修复以下漏洞;然后批评您自己的修复:(1)它是否真正消除了漏洞,(2)它是否引入了新的漏洞/错误,(3)我应该编写什么测试(正面和负面案例),(4)性能/功能影响。我将审查并测试该修复。漏洞+代码:【粘贴】

漏洞类别的安全模式教学模板 [例如SQL注入]比较显示了该语言/框架中的安全打字模式和常见错误模式。一般规则+给出代码示例;但我希望您在我的代码中实现它之前询问上下文。语言/框架:[写]

常见错误

  • 没有上下文的评论。如果没有语言、框架和输入/输出上下文,人工智能就会混淆真实和虚假的发现;请务必提供上下文。
  • 将每一个迹象都误认为是真正的弱点。 AI 产生误报(测试数据、在另一层清理的输入);根据上下文筛选每个发现。
  • 盲目应用AI的修正。推荐的补丁可能会引入新的漏洞/错误;审查并编写测试。
  • 相信假阴性。即使AI说“没有漏洞”,也要亲自检查关键路径;静态扫描并不能检测到所有漏洞。
  • 将代码/秘密提供给外部工具。私有代码和真正的秘密(密钥、密码)是知识产权和漏洞;匿名或使用公司的孤立工具。
提示:当拥有人工智能审查代码时,最有效的过滤器是询问每个发现的“证据强度”(确定/可能/弱)。大多数标记为“弱”的发现都是误报;你将精力分配给“确定”的人。
注意:人工智能提出的安全修复方案不应在未经测试的情况下进入仓库。不正确的“修复”既可能使漏洞处于开放状态,也可能导致生产中出现功能错误;每个补丁都会经过审查和测试。

总之

安全代码审查是在投入生产之前捕获漏洞的最便宜的方法,并且由于代码是一种语言,人工智能在这里成为强大的第二只眼睛:标记危险模式,解释风险,建议修复。但AI无法看到整个操作上下文,会产生误报和误报,而且它推荐的补丁可能会引入新的漏洞。因此,审查有六个步骤(背景、筛选、论证、误报消除、修复验证、人工批准),决定权在于开发人员和安全专家。三个原则:没有上下文就不能解释任何发现,每个迹象都可以根据上下文消除,没有任何修复未经测试就进入存储。并且在没有匿名的情况下,代码/秘密永远不会提供给外部工具。

应用任务

获取示例代码片段(从您自己的代码中删除敏感部分或存在漏洞的示例代码)。让AI使用“漏洞扫描”模板进行检查;对每个发现应用“误报消除”模板并消除真实的结果。用“补救评估”模板对最严重的发现进行纠正,自己审查并写出一个正面+一个负面的测试用例。注意有多少结果是误报。

清单

  • [ ] 在检查代码之前我给出了语言、框架和输入/输出上下文。
  • [ ] 我询问了每项发现的行号、漏洞类别、利用路径和证据。
  • [ ] 我根据上下文筛选了每个发现的误报。
  • [ ]我没有盲目套用AI的修正;我复习并写了一个测试。
  • [ ] 尽管输出“无漏洞”,我还是亲自检查了关键路径。
  • [ ] 我对代码/秘密进行了匿名处理或使用了公司隔离工具。
  • [ ] 我已经通过开发者+安全审批通过发现并修复。