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

利用AI自动修复代码漏洞

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

在 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]删除
最新教程 更多>
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-03-12
  • VS Code & Delve 调试Go代码:Build Tags配置指南
    VS Code & Delve 调试Go代码:Build Tags配置指南
    在Visual Studio Code中使用标签进行调试,并在使用构建标签来编译GO程序的各种版本时,请在delve debugger 中使用,这对于配置DEBUGGER以配置最佳debugger以进行最佳利用。标签:在Visual Studio Code的GO插件中指定构建标签,您可以使用bui...
    编程 发布于2025-03-12
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-03-12
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-03-12
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-03-12
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-03-12
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-03-12
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-12
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-03-12
  • Laravel要去:我的旅程和纤维API样板的创建
    Laravel要去:我的旅程和纤维API样板的创建
    花费四年以上,我对MVC(Model-View-Controller)架构非常熟悉。它的简单性和结构使与之合作变得很高兴,而Laravel的有条理的文件夹可帮助开发人员保持正轨。您始终知道将代码放置在哪里,以及广泛的内置工具 - 数据库连接,redis,排队,迁移,ORM等等 - 将设置无缝。只需...
    编程 发布于2025-03-12
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-03-12
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-03-12
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-03-12
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-03-12
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-03-12

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

Copyright© 2022 湘ICP备2022001581号-3