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