AI赋能SAST实践: Copilot + CodeQL
原创 SASTing 2024-11-25 08:00 上海
AI如何赋能SAST工具,4500 字解读微软方案。(大家想看什么内容欢迎留言,笔者会筛选热度最高的议题整理更新)
关键词
CodeQL(SAST工具)
Coplit(AI工具)
AI增强SAST工具的实现原理
AI驱动的SAST工具能带来哪些好处
背景
在2023年GitHub的一项调查中,开发者们表示,除了编写代码(占比32%),他们最常做的任务就是发现和修复安全漏洞(占比31%)。
随着开发团队将安全检查提前到软件开发生命周期(SDLC)的早期阶段(安全左移),开发者们已经成为抵御漏洞的第一道防线。
然而,遗憾的是,这种“左移”策略更多是将安全实践的责任推给了开发者,而非真正带来好处。不过,45%的开发者认为,在对软件进行安全审查时,如果能很好地结合生成式AI的能力,那么会在保证软件安全的前提下,极大地提高开发效率。
Tiferet Gazit
以及首席安全专家Keith Hoodlet
从专业角度发表了看法,包括以下三个方面:开发者面临的安全挑战
AI驱动的安全工具的价值
AI如何增强静态应用程序安全测试(SAST)的效果
为什么开发者对安全问题感到沮丧?
Gazit
和Hoodlet
的见解之前,我们先听听开发者的心声。One Engineering System
团队与几位开发者进行了座谈,了解他们在遵循安全与合规指南时的困扰。虽然这是几年前的事情,但他们的痛点至今依然存在:在进行安全审查时,一些开发者被迫使用非定制化的工具,工具无法结合业务场景做分析,导致产生大量的误报漏报,这严重影响了他们发现和解决安全漏洞的效率。
此外,大多数开发者的首要任务是编写和review代码。然而,在“安全左移”策略的背景下,他们还被要求在日常工作中审查、理解和修复漏洞,这对他们的安全开发能力提出了更高的要求。
开发者在做安全审查时,需要在不运行项目的前提下发现漏洞,这需要他们有丰富的安全审查经验,并且对各种漏洞类型熟练掌握。开发者需要在"开发"与"安全"两个角色之间反复切换,无形中加重了负担,降低了开发效率。
简而言之:
安全并非开发过程的固有部分,开发者往往对自己代码的安全性缺乏信心。
如果不加以干预,这些困扰只会随着时间的推移而加剧。根据Gartner的预测,到2028年,75%的企业软件工程师将使用AI编码助手。这意味着,随着开发者借助GitHub Copilot等AI工具提高生产力并编写更多代码,需要审查的代码量也将随之增加。
安全专家也面临巨大压力
通常情况下,每100名开发者中只有一位安全专家,他们最终成为抵御漏洞的最后一道防线(并负责制定和执行安全政策),这是一项艰巨的任务。ISC2(国际信息系统安全认证联盟)在其2023年的工作力研究中报告称,全球对安全专业人员的需求增加了四百万。
虽然AI不能取代安全专家,但它可以帮助他们扩展知识和能力。
Gazit
表示:AI可以帮助进行代码和安全审查,确保在提高开发速度的同时不会导致漏洞的增加。”
AI如何赋能SAST工具
SAST工具并非开发者使用的唯一安全工具,但它们是最受欢迎的工具之一。让我们看看AI如何帮助SAST工具更高效地完成工作。
AI增强框架建模能力
为了让SAST工具检测代码中的漏洞,工具自身需要理解整个项目。因此,安全专家通过建模来进行污点分析。但项目中使用的组件/框架是千变万化的,因此,对常用的框架进行建模是非常重要的。
这时AI就派上用场了。
可以使用AI对开源框架和库进行建模,从而提高SAST工具对整个项目的理解能力。
CodeQL如何通过AI对框架进行建模 会在后续文章中介绍
在开发环境中提供上下文相关的漏洞信息
Code scanning autofix 是一个AI驱动的安全功能示例,它结合了SAST工具(在本例中是GitHub的CodeQL)与GitHub Copilot的生成式AI能力。
code scanning autofix
可以带来很多便利:开发者可以在PR(pull request)中直接收到AI建议的代码修复方案和警报
收到关于漏洞描述及针对具体的业务场景的修复建议
可以在命令行界面(CLI)中直接查看并应用自动修复建议,只需启用GitHub CLI扩展即可
code scanning autofix
初版支持分析JavaScript
、TypeScript
、Python
、Java
、C#
和Go
。它能够为超过90%的漏洞类型生成修复方案,并且其中超过三分之二的修复方案几乎无需修改即可合并。未来还将支持更多语言,如C++
和Ruby
。开发者可以在CI/CD流水线中更快地修复漏洞,而不是在生产环境中才发现这些漏洞。
增强软件开发生命周期(SDLC)
开发者使用SAST工具在整个SDLC中保护他们的代码。
一旦开发者启用了像CodeQL这样的代码扫描解决方案,SAST工具将扫描源代码,并将安全检查集成到CI/CD工作流程中:
当你对代码库进行更改并在GitHub上创建PR时,CodeQL会自动进行扫描。如果发现漏洞,它会在PR中对应的文件中发出警报。开发者可以在合并分支前持续监控代码安全,做到在开发阶段发现漏洞并修复。
- 除了commit和PR,你还可以在
GitHub Actions
工作流程中设置指定时间点运行CodeQL。因此,如果你想让CodeQL在特定时间间隔内定期扫描代码,可以使用GitHub Actions工作流程进行调度。
code scanning autofix的实际效果
Gazit
表示:code scanning autofix
通过提供修复方案及上下文解释,使CodeQL对开发者更加友好。这种AI应用降低了开发者修复漏洞的门槛。
SQL注入是一种常见的漏洞,通常可以通过SAST工具发现。
code scanning autofix
检测SQL注入并提供AI修复方案的流程。
步骤1:发现漏洞
CodeQL的代码扫描功能可以在所有公共仓库中免费启用,并自动安排运行。扫描过程主要包括四个部分,都围绕源代码展开:
tokenization(标记)
abstraction(抽象)
semantic analysis(语义分析)
taint analysis(污点分析)
CodeQL运行原理(以上四步)会在后续文章中解释
步骤2:构建prompt (提示)以生成修复方案
accept
,edit
,或dismiss
。以下是发送给Copilot的prompt中包含的内容:
CodeQL报告及关于检测到的漏洞的常规信息:如漏洞示例及其修复方法,这些信息是从CodeQL漏洞知识库中获取的。
代码片段和行号,可能来自多个源代码文件,这些代码片段和行号来源于CodeQL污点分析的完整数据流信息。这些代码片段就是项目中最可能需要修复的代码块。
为了指导Copilot的响应格式,我们的机器学习工程师需要:
限制Copilot的基础模型,使其仅编辑prompt中包含的代码。
要求模型生成Markdown格式的输出,包括漏洞的详细描述和修复方案。
要求提供“before”和“after”的代码块(上下文信息),展示需要更改的代码片段(包括一些上下文行)以及要进行的编辑内容。
要求模型列出修复方案中使用的所有外部依赖项。
步骤3:检查不良代码
做一些过滤操作(不良内容、敏感内容等)
步骤4:最后的润色
fix generator
(修复生成器)会处理和优化LLM(大型语言模型)的输出,以检测并纠正可能的错误。fix generator
要做以下工作:- fuzzy search(模糊搜索),以确保包含AI生成的修复代码与prompt中提供的代码块上下文信息匹配。模糊搜索寻找代码块之间的精确和相似匹配,以便
fix generator
可以捕捉并纠正错误,例如缩进、分号或代码注释差异相关的错误。 使用解析器检查语法错误
进行语义检查,以评估AI提供的修复方案的逻辑。例如,名称解析和类型检查有助于确保修复代码与原始代码的意图和功能相匹配。
- 验证Copilot修复方案中的外部依赖项。这意味着查找包含项目依赖项信息的配置文件,以查看所需的依赖项是否已存在于项目中。如果没有,
fix generator
会验证依赖项是否存在,并检查其是否有漏洞。然后,它会将需要的依赖项添加到配置文件中,作为修复建议的一部分。
步骤5:解释漏洞和修复方案
code scanning autofix
,原始的CodeQL警报会得到增强:包括AI建议的修复方案、漏洞描述,以及补丁等。开发者可以选择accept
,edit
,或dismiss
。
如何从AI驱动的SAST工具中受益
通过AI,安全检查能够无缝集成到开发者的日常工作流程中,使安全成为SDLC的一部分,而非生产后的补救措施。当开发者在开发阶段更容易地确保代码安全时,整个SDLC都会得到强化。而当SDLC得到更好的保护时,组织可以更专注于创新。
Hoodlet
表示:当你将安全视为SDLC的一个特性时,你的应用程序将更能抵御日益复杂的攻击,从而节省时间和金钱。你可以将这些节省下来的成本用于其他改进和新功能的实验。
组织在构建安全产品的同时,释放了资源用于创新。此外,安全团队可以专注于那些需要他们专业知识的战略性项目。
此外,开发者也可以获益:
- 在开发阶段更安全地编写更多代码。只需看看数据。由Copilot驱动的
code scanning autofix
可以为代码库中检测到的超过90%的漏洞类提供修复方案,并且超过三分之二的建议几乎无需修改即可合并。 - 更快更好地修复漏洞。通过
code scanning autofix
,开发者会收到AI生成的代码修复方案(与业务场景结合)。他们还会收到针对实际业务场景的漏洞描述,而非固定的描述。这种具体的上下文帮助开发者更好地理解检测到的漏洞的性质、为何存在于代码库中以及如何修复它。 在开发环境中直接获得安全指导。开发者可以在PR中直接获取AI增强的SAST工具提供的所有信息。与传统的安全工具不同,其可以被视作定制化工具。

