”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 利用AI自动修复代码漏洞

利用AI自动修复代码漏洞

发布于2024-11-08
浏览:669

在 Snyk 的 SecRel 客户研讨会库中,我们有一个名为 Breaking AI 的研讨会。本次研讨会将介绍生成式 AI 助手(例如 copilot 和 codium)如何帮助开发人员更快地编写代码。研讨会的一大亮点是,人工智能助手就像刚从编码训练营出来的初级开发人员:超级热心且乐于助人,但是 - 你真的想要检查他们的代码(对初级开发人员没有阴影 - 我们需要他们,他们太棒了!)。在研讨会中,我们展示了 AI 助手和 Snyk 的结合如何为您提供超能力 - 快速、安全地编写代码。

引用一位著名厨师的话,Snyk 现在凭借其 Deep Code AI Fix 功能“更上一层楼”。当发现安全漏洞时,Snyk Code 总是给出良好的修复建议。它甚至可以为您提供三个具有相同漏洞的其他开源项目的良好参考,并向您展示这些项目如何修复它。现在,得益于 Snyk 安全研究团队精心整理的数据、结合了生成人工智能和符号人工智能力量的混合人工智能模型以及机器学习模型,Snyk 现在可以轻松地自动修复许多常见的安全漏洞。最喜欢的 IDE。

在本博客中,我将演示如何在我们研讨会中使用的 Java 示例项目中最好地利用 Deep Code AI Fix (DCAIF)。源代码可以在这里找到。注意:该项目故意在多个方面存在漏洞,不适合在任何生产环境中使用。

会议安排应用程序的乐趣

如果您曾经参加过技术会议或在技术会议上发表过演讲,您就会知道最具挑战性的方面之一是创建和展示日程安排。

参考应用程序是一个糟糕的版本(我不是一个好的前端开发人员!)但是,它对于展示代码如何在技术上工作但同时不安全非常有用。

这是一个使用 Thymeleaf 模板引擎的 Spring Boot 应用程序。启动时,它使用流行的 faker 库生成随机演讲者、演讲标题和演讲描述数据。演讲标题和描述均来自《银河系漫游指南》一书的正文。注意:标题和描述可能并不都 100% 适合工作。你已被警告!

活动中生成的每个演讲者还有一个专门的页面,您可以在其中查看他们在会议上的演讲列表。我们将重点关注应用程序的这一部分。

要编译并运行应用程序,请执行以下命令:

mvn clean install
mvn spring-boot:run

当您运行应用程序时,除了通常的 Spring Boot 横幅和其他输出之外,您还会看到如下内容:

Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah

注意:情况不会完全像这样,因为每次启动应用程序时,演讲者及其演讲都是随机生成的。

如果您单击或复制/粘贴其中一个链接,您将看到一个演讲者页面,其中包含他们的演讲列表:

Automatically fix code vulnerabilities with AI

让我们来玩一下:找出漏洞

看看 TalkController.java。这就是演讲者页面的呈现方式。你能发现这个漏洞吗?

我们不希望您必须依赖您的眼球!我们希望开发人员快速行动并编写安全的代码。

我使用 IntelliJ Idea 来编写我的 Java 应用程序。我还使用 Snyk 的 IDE 扩展。好消息是,所有流行 IDE 都有 Snyk IDE 扩展,支持多种编程语言。

如果您想继续操作并且没有 Snyk 帐户,您可以在此处免费创建一个帐户。

我有没有提到这个应用程序有很多漏洞?那是因为我们在我们的工作室中使用它。我要重点关注的是TalkController.java中的那个:

Automatically fix code vulnerabilities with AI

  1. 显示发现跨站脚本(XSS)漏洞
  2. 显示与具有相同漏洞的三个开源项目之一的差异。这显示了它是如何修复的(绿色部分)。
  3. 红色波浪线表示漏洞在代码中的位置。

这些都是对于解决问题非常有用的信息。但是,请注意 #1 漏洞左侧有一个小闪电图标 (⚡️)。说明该漏洞可以自动修复。

如果将鼠标悬停在红色波浪线上,您将看到修复此问题的选项

Automatically fix code vulnerabilities with AI
在查看 Deep Code AI Fix 结果之前,让我们先看看副驾驶会为我们做什么。

这是我在第 42 行给 copilot 的提示以及它注入的代码:

// guard against XSS
username = username.replaceAll("", ">");

这个可能可以对抗幼稚攻击,但是它可以对抗所有类型的 XSS 攻击吗?我不太确定。事实上,当我重新运行 Snyk 扫描时,XSS 漏洞仍然存在。

让我们看一下 Snyk 的修复:

String usernameStr = ""   HtmlUtils.htmlEscape(username)   "'s talks";
================================================


现在,这个我喜欢。它使用惯用且预期的方法以及内置 Spring Boot 库:HtmlUtils。我相信这将彻底净化输入:用户名。新的 Snyk 扫描显示该漏洞已不存在。

Automatically fix code vulnerabilities with AI
确实,竖起大拇指! Snyk 自动修复不仅解决了该漏洞,而且以与所使用的框架(本例中为 Spring Boot)相匹配的方式实现了这一点。

DCAIF 不会让您放慢脚步

在这篇文章中,我向您展示了 Snyk 的 Deep Code AI Fix 如何超越修复建议,并可以代表您进行修复。您还可以通过查看原始安全漏洞不再存在来确认修复的好处。

在 Snyk,我们喜欢人工智能助手,但他们在安全方面不太擅长。我们的研究表明,新一代人工智能生成不安全代码的速度与人类大致相同——大约 40%。这是有道理的,因为像 Copilot 这样的纯 Gen AI 解决方案主要在现有代码上训练他们的模型。 Snyk 的混合方法包括符号 AI、Gen AI、机器学习和我们安全团队的策划培训,为结果提供了安全第一的方法。

版本声明 本文转载于:https://dev.to/snyk/automatically-fix-code-vulnerabilities-with-ai-4dbf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-05-02
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-05-02
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-05-02
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法时,您可能会出现错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && &&华氏度D...
    编程 发布于2025-05-02
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-02
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-05-02
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-02
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-05-02
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-05-02
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-02
  • 如何为单个HTML元素应用多个CSS类?
    如何为单个HTML元素应用多个CSS类?
    将多个CSS类应用于html中的单个元素,类属性可以用于类型的CSS类,以指定元素来定型。但是,如果您在同一类属性中分配多个类,则面对仅应用一个类的问题。问题:Answer:There are two methods to apply multiple CSS classes to a singl...
    编程 发布于2025-05-02
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-02
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-05-02
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-05-02
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3