在 2023年GitHub的一项调查 中,仅次于编写代码(32%)的是开发人员报告的首要任务是查找和修复安全漏洞(31%)。

随着团队"安全左移"并在软件开发生命周期(SDLC)的早期集成安全检查,开发人员已成为防范漏洞的第一道防线。

不幸的是,我们发现"安全左移"更多的是将安全实践的负担转移给开发人员,而不是它们的好处。但AI带来了希望:45%的开发者认为团队将受益于使用AI来促进安全审查。他们没有错。

我们采访了GitHub高级安全部门的AI主管Tiferet Gazit和GitHub的首席安全专家Keith Hoodlet,讨论了开发人员在安全方面的痛点,使用AI驱动的安全工具的价值,以及AI如何增强静态应用程序安全测试(SAST)。

为什么开发人员对安全感到沮丧?

在分享Gazit和Hoodlet的见解之前,让我们直接听听开发人员的意见。

2019年底,微软的One Engineering System团队与几位开发人员坐下来,了解他们在遵循安全和合规性准则方面的挫折感。尽管那是几年前的事了,但他们的痛点至今仍然引起共鸣:

  • 在进行安全审查时,一些开发人员被迫使用不是为他们设计的工具,这会对他们查找和解决安全漏洞的能力产生负面影响。

  • 此外,大多数开发人员的首要任务是编写和审查代码。然而,在左移的时代,他们还被期望作为日常职责的一部分来审查、理解和修复漏洞。

当开发人员执行程序时,他们在运行时环境中拥有所需的一切。完成安全审查就没那么简单了。通常,开发人员需要退出他们的IDE来查看漏洞警报,在线研究漏洞类型,然后重新访问他们的IDE来解决漏洞。这就是我们所说的上下文切换,它会增加认知负荷并降低生产力。

简而言之,安全不是开发过程固有的一部分,开发人员通常对他们的代码安全性缺乏信心

如果不进行干预,这些挫折感只会随着时间的推移而增加。根据Gartner的预测,到2028年,75%的企业软件工程师将使用AI编码助手。这意味着,随着开发人员使用GitHub Copilot等AI工具提高生产力并编写更多代码,将有更多的代码需要审查。

安全专家也捉襟见肘

通常报告称,每100名开发人员中只有一名安全专家最终成为防范漏洞的最后一道防线(并负责制定和执行安全策略),这是一项重大的任务。虽然确切的数字可能有所不同,但ISC2在其2023年的劳动力研究中报告称,需要再增加400万名安全专业人员。

虽然AI不能取代安全专家,但它可以帮助他们扩展知识和能力,尤其是在他们的专业知识需求量很大的情况下。

"AI可以帮助进行这些代码和安全审查,以确保增加的动力不会导致漏洞的增加,"Gazit说。

SAST工具并不是开发人员使用的唯一安全工具,但它们是最受欢迎的工具之一。让我们看看AI如何帮助SAST工具更有效地完成工作。

提高漏洞检测能力

为了让SAST工具检测代码中的漏洞,需要向它们展示要查找的内容。因此,安全专家使用一个称为建模的过程来识别可利用的用户控制数据进入和流经代码库的点。但是,考虑到这些组件的频繁变化,对流行的库和框架进行建模是一项艰巨的工作。

这就是AI的用武之地。

安全团队正在尝试使用AI对广泛的开源框架和库进行建模,提高团队对每个软件组件内部内容的理解。

在工作区中直接提供上下文化的漏洞信息

代码扫描自动修复是一个由AI驱动的安全功能的例子,它将SAST工具(在本例中是GitHub的CodeQL)与GitHub Copilot的生成式AI能力相结合。

使用代码扫描自动修复,开发人员会在拉取请求中直接收到一个AI建议的代码修复,以及一个告警。然后,他们会得到对漏洞的清晰解释以及针对他们特定用例的修复建议。要直接在CLI中查看和应用自动修复建议,他们可以启用GitHub CLI扩展。

在第一个版本中,代码扫描自动修复可以分析JavaScript、TypeScript、Python、Java、C#和Go中的漏洞并提供修复建议。它可以为超过90%的漏洞类型生成修复程序,其中超过三分之二的修复程序可以在几乎不需要编辑的情况下合并。未来将支持更多语言,如C++和Ruby。

回报是开发人员可以更快地在他们的工作流程中修复漏洞,而不是在生产中发现这些漏洞。

image

强化SDLC

开发人员使用SAST工具在整个SDLC中保护他们的代码。

一旦开发人员启用了像CodeQL这样的代码扫描解决方案,SAST工具就会扫描你的源代码,将安全检查作为CI/CD工作流程的一部分集成进来:

  • 当你对代码库进行更改并在GitHub上创建拉取请求时,CodeQL会自动对你的代码进行完整扫描,就像拉取请求已经合并一样。然后,如果在拉取请求中更改的文件中发现漏洞,它会提醒你。

    这意味着开发人员能够在模块组合在一起时持续监控其源代码的安全状况,甚至在更改合并到主分支之前。因此,开发人员可以立即在开发中修复漏洞,在代码发送到生产之前。

  • 在提交和拉取请求之外,你还可以在GitHub Actions工作流程中设置CodeQL在指定时间运行。因此,如果你希望CodeQL定期在特定时间间隔扫描你的代码,你可以使用GitHub Actions工作流程来安排。

查看代码扫描自动修复的实际效果

"自动修复通过提供修复建议和对漏洞及其修复的上下文解释,使CodeQL对开发人员更加友好,"Gazit说。"这种AI的使用降低了负责修复漏洞的开发人员的准入门槛。"

假设一个恶意行为者将SQL注入插入到你的应用程序中。SQL注入通过用户输入字段进入你的代码库,如果构成注入的代码利用了无意的漏洞,那么恶意行为者就会获得对你的应用程序中敏感数据的未经授权的访问。

SQL注入是一种常见的漏洞类型,通常使用SAST工具发现。 下面让我们一步一步看看由GitHub Copilot驱动的代码扫描自动修复如何检测SQL注入,然后在告警中显示AI建议的修复。

image

步骤1:寻找漏洞。使用CodeQL进行的代码扫描可以在所有公共存储库上免费启用,并可以安排自动运行。扫描过程有四个主要部分,都围绕你的源代码:标记化、抽象化、语义分析和污点分析。

简而言之,对源代码进行标记化可以使其标准化,这允许CodeQL稍后对其进行分析。对源代码进行抽象化会将代码行转换为层次结构,显示这些代码行之间的关系。语义分析使用该抽象来理解源代码的含义。

最后,污点分析会查看源代码处理用户输入数据的方式。它识别数据源(输入数据进入源代码的位置)、流步骤(数据在代码中传递的位置)、消毒器(使输入数据安全的函数)和接收器(如果使用未经消毒的数据调用可能造成危害的函数)。像CodeQL这样的高级SAST工具可以评估输入数据的消毒或验证程度,并据此决定是否将路径标记为潜在漏洞。

步骤2:构建提示以生成修复。对于CodeQL支持的所有语言,开发人员将在其存储库的拉取请求中看到SQL注入告警,以及对漏洞的自然语言描述和上下文文档。这些告警还将包括开发人员可以接受、编辑或忽略的建议修复。

以下是发送给GitHub Copilot以生成增强告警的提示中包含的内容:

  • 初始CodeQL告警和检测到的漏洞类型的一般信息。这通常包括从CodeQL查询帮助中提取的漏洞示例以及如何修复它。

  • 在CodeQL的污点分析期间识别的数据流沿线的代码片段和行号,可能来自多个源代码文件。这些代码片段表明最有可能需要编辑的源代码位置。

为了指导GitHub Copilot响应的格式,我们的机器学习工程师:

  • 约束GitHub Copilot的底层模型,只编辑提示中包含的代码。

  • 要求模型以Markdown格式生成输出,包括对漏洞和建议修复的详细自然语言解释。

  • 要求提供"之前"和"之后"的代码块,演示需要更改的代码片段(包括一些周围的上下文行)以及要进行的编辑。

  • 指示模型列出修复中使用的任何外部依赖项,例如数据消毒库。

步骤3:检查不良代码。然后与GitHub上大约150个字符的公共代码运行匹配或几乎匹配的代码片段将从AI生成的编码建议中过滤掉。易受攻击的代码以及离题、有害或令人反感的内容也会被过滤掉。

你可以探索GitHub Copilot信任中心以了解有关GitHub Copilot过滤器和负责任的数据处理的更多信息。

步骤4:应用最后的润色。在开发人员看到GitHub Copilot建议的修复之前,修复生成器会处理和优化LLM输出,以检测和纠正任何小错误。

修复生成器通过以下方式做到这一点:

  • 进行模糊搜索,以确保包含AI生成的建议代码修复的"之后"代码块和行号与"之前"代码块和行号匹配。模糊搜索会查找两个代码块之间的精确匹配和相似匹配,因此修复生成器可以捕获并纠正小错误,例如与缩进、分号或两个代码块之间的代码注释差异相关的错误。

  • 使用解析器检查语法错误。

  • 进行语义检查以评估AI建议的代码修复的逻辑。例如,名称解析和类型检查有助于确保建议的代码与原始代码的意图和功能相匹配并保持一致。

  • 验证GitHub Copilot建议的任何依赖项。这意味着定位包含项目依赖项信息的相关配置文件,以查看所需的依赖项是否已经存在于项目中。如果没有,修复生成器会验证建议的依赖项是否存在于生态系统的包注册表中,并检查已知的易受攻击或恶意的包。然后,它将新的和需要的依赖项添加到配置文件中,作为修复建议的一部分。

步骤5:解释漏洞和建议的修复。最后一步是在拉取请求中向开发人员显示CodeQL告警。使用代码扫描自动修复,原始CodeQL告警通过AI建议的修复、对漏洞和建议修复的自然语言解释以及差异补丁得到增强。开发人员可以按原样接受建议的编辑,优化建议的编辑,或者忽略它。

借助AI,安全检查能够顺利集成到开发人员的工作流程中,使安全成为SDLC的一个特性,而不是在生产中事后才考虑的问题。当开发人员可以在开发阶段更轻松地帮助保护代码时,整个SDLC就会得到加强。当SDLC得到更好的保护时,组织可以更多地关注创新。

"当你将安全视为SDLC的一个特性时,你的应用程序会变得更加健壮,能够抵御日益复杂的攻击,从而节省你的时间和金钱,"Hoodlet说。"你可以将节省下来的成本用于其他改进和新功能的实验。结果是什么?组织在建立安全产品的同时,也树立了声誉,并为创新腾出了资源。"此外,安全团队可以自由地专注于值得他们专业知识的战略举措。

采用AI增强型SAST工具的组织可以帮助开发人员在安全实践中感到得到支持和提高生产力,从而使开发人员能够:

  • 在开发中帮助保护更多代码。看看这些数字就知道了。由GitHub Copilot驱动的代码扫描自动修复可以为代码库中检测到的90%以上的漏洞类型生成修复,其中三分之二以上的建议可以在几乎不需要编辑的情况下合并。

  • 更快、更好地修复漏洞。通过代码扫描自动修复,开发人员可以获得关于AI生成的代码修复的自然语言解释。他们还会得到对检测到的漏洞的描述,该描述针对其在特定代码库中的检测进行了定制,而不是一般性的描述。这种特定的上下文有助于开发人员更好地理解检测到的漏洞的性质、它在代码库中存在的原因以及如何修复它。

  • 直接在工作区中获得安全指导。开发人员可以直接在拉取请求中获得AI增强型SAST工具的所有好处。与传统的安全工具不同,这个工具是为他们量身定制的。

以上内容来源于 GitHub

声明:本文来自RedTeam,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。