(NeurIPS 2024)

 

目录

Abstract

1 Introduction

2 Related Work

2.1 用于代码生成的多代理系统

2.2 Static and Dynamic Analysis

3 Methodology

3.1 Coding Agent

3.2 静态分析器代理

3.3 Fuzzing Agent


Abstract

        使用大型语言模型 (LLM) 自动代码生成的最新进展使我们更接近完全自动化的安全软件开发。

GAP:

        然而,现有的方法通常依赖于单个代理来生成代码,这很难生成安全、无漏洞的代码。

        传统的LLM程序综合主要关注功能的正确性,常常忽略运行时发生的关键动态安全影响

        为了应对这些挑战,我们提出了 AutoSafeCoder,这是一个多代理框架,它利用 LLM 驱动的代理通过持续协作进行代码生成、漏洞分析和安全增强。

        该框架由三个代理组成:负责代码生成的编码代理识别漏洞的静态分析器代理以及使用基于突变的模糊测试方法执行动态测试以检测运行时错误的模糊测试代理。

        我们的贡献重点是通过在 LLM 代码生成期间将动态和静态测试集成到迭代过程中来确保多代理代码生成的安全性,从而提高安全性。

        使用 SecurityEval 数据集的实验表明,与基线 LLM 相比,代码漏洞减少了 13%,且功能没有受到影响。

1 Introduction

        软件漏洞--系统中的安全缺陷、故障或薄弱环节--具有重大风险,经常被攻击者恶意利用[ 1]。据 IBM 最近的一份研究报告估计,这些漏洞平均每年给公司造成 390 万美元的损失 [ 2 ]。在全球范围内,安全漏洞造成的损失预计将在 2021 年至 2025 年间超过 1.75 万亿美元[3]。随着大语言模型(LLM)越来越多地融入软件开发生命周期[4],研究表明,使用大语言模型作为编码助手会使漏洞发生率增加 10%[5],这引发了人们对 LLM 驱动代码生成的安全影响的新担忧[6]。

        虽然 LLM 生成的代码在功能正确性方面表现出色,但它们生成的代码往往存在安全问题 [5 , 7]。尽管使用 LLMs 进行编码的民主化提高了开发人员的通过让更多人参与编程来提高生产力 [8, 9],大型语言模型生成的代码通常无法满足软件安全标准,在大约 40% 的情况下可能包含漏洞 [10]。该评估在[11]中被重复使用,进一步发现其他最先进的语言模型[12、13]与Copilot[14]具有相似的安全级别。 [15] 中的另一项研究发现,在 21 个安全相关案例中,有 16 个案例中 ChatGPT 生成的代码低于最低安全标准。

        为了降低使用LLM作为开发人员助手的风险,在将代码传递给开发人员之前分析代码中的静态和动态漏洞至关重要。代码漏洞会带来重大风险,因此帮助开发人员缓解这些问题至关重要。虽然 VUDDY [16]、MVP [17] 和 Movery [18] 等工作重点是识别易受攻击的代码克隆 (VCC),但它们通常忽略了漏洞修复。最近的工作已经证明了预训练的 LLM 在自动化该过程方面的潜力 [19],但 VulRepair [20] 和 AIBUGHUNTER [21] 等研究缺乏基于动态执行的技术来评估 LLM 生成的代码是否容易受到攻击。此外,虽然存在动态分析工具,但它们通常只关注功能而不解决安全问题。

        为了解决在软件开发过程中生成安全代码同时确保功能的挑战,我们提出了一种多代理解决方案,通过静态分析审查代理、模糊测试代理和接收来自两者反馈的编码代理来创建安全且功能正确的代码。代理。我们的工作重点是 Python 编程语言,因为它是开发人员中最流行的语言之一 [22, 23]。因此,我们提出了一个由编码代理、静态分析器代理和模糊测试代理组成的三层系统,使用由 GPT4 支持的多代理系统来生成、检测和修复漏洞,用于代码生成以及静态和动态使用基于多代理的系统分析源代码。

        总之,本文的贡献是:

        • 我们引入了一种新的多代理系统,利用大型语言模型(LLM)自主生成安全且构造正确的代码。我们的系统结合了静态分析的反馈执行动态代码分析的模糊代理

        • 我们在LLM框架内应用少样本学习和情境学习技术,使代理能够有效地识别连续反馈循环中的漏洞。

        • 我们提供全面的评估,展示协作代码生成系统的效率和安全性,并得到定量和定性评估的支持。

2 Related Work

2.1 用于代码生成的多代理系统

        最近,软件开发领域出现了几种由大型语言模型(LLMs)驱动的创新型多代理代码生成方法[24 , 25, 26 , 27 , 28]。

        这些基于代理的系统的一个主要特点是它们的协作机制,LLMs 通过对话迭代改进它们的输出,从而达成更大的共识,并希望得到更准确的响应。这些系统为代理分配了特定的角色,如程序员或设计师,有些系统还将标准化操作程序(SOP)作为一种通信协议,以加强协调[26]。不过,虽然这些方法显示出巨大的潜力,但它们主要侧重于评估生成代码的功能,往往忽略了关键的安全方面。

2.2 Static and Dynamic Analysis

        静态分析方法,如使用抽象语法树(AST)[29] 或深度学习方法[20] 的方法,通过分析未执行的源代码来帮助识别问题。然而,这些技术往往不足以检测所有漏洞,而且可能无法识别运行时问题。相比之下,动态分析可以检测出依赖于特定输入值或运行时条件的漏洞,但它会受到运行时开销的影响。最近,出现了用于动态测试、深度学习库和编译器的新方法[ 30 , 31 ]。这些方法利用大型语言模型(LLM)来自动化和增强突变模糊(一种动态测试技术,通过生成随机输入并监控执行情况来发现软件漏洞)。因此,静态和动态测试对于彻底的漏洞评估至关重要,因为静态分析可以捕获早期的编码缺陷,而动态分析则可以识别执行过程中出现的问题。

3 Methodology

        我们的方法引入了一个多代理框架,通过由大型语言模型(LLM)驱动的多个代理来整合静态和动态分析,从而提高代码生成的安全性。如图 1 所示,本节将概述我们的代理及其交互。

        我们将代码生成过程分为三个迭代阶段,涉及以下代理:

        i) 编码代理;ii) 静态分析代理;iii) 模糊代理。

        该流程从编码代理开始,编码代理根据代码要求或描述生成初始代码。然后,静态分析器代理审查代码是否存在漏洞,并向编码代理提供修改反馈。这一迭代过程一直持续到漏洞得到解决或满足四次迭代的最终条件为止。

        然后,经过验证的代码会被传递给模糊代理,模糊代理会生成并改变输入种子,以测试代码是否在运行时崩溃或出错。任何问题都会反馈给编码代理,包括有问题的输入和错误上下文,以便进一步改进。更新后的代码在返回给用户之前,会用失败的输入进行重新测试,以确保正确执行。以下各节将详细介绍我们的三个代理。

3.1 Coding Agent

        Coding Agent 是一款由 LLM 驱动的工具,专为代码生成和代码修复而设计,由 GPT-4 提供支持。它使用少量学习方法进行操作,通常以文档字符串的形式接收代码需求,概述所需的功能,以及部分源代码(例如函数定义)。根据此信息,编码代理生成所需的代码。然而,LLM生成的代码仍然可能存在安全漏洞[32];这类似于人类程序员无意中生成易受攻击的代码。为了解决这些问题,编码代理根据专门代理的反馈修改代码。它迭代地接收来自静态分析器代理和模糊测试代理的输入,直到解决所有漏洞并且没有检测到进一步的问题或达到迭代限制。

3.2 静态分析器代理

        下一个同样由 GPT-4 支持的代理是静态分析代理。这个由 LLM 驱动的工具使用编码代理生成的代码来执行静态分析和检测安全漏洞。静态分析器代理采用提示工程,指示它根据 MITRE CWE 数据库识别漏洞。如果检测到漏洞,该代理会向编码代理提供反馈,包括相关的 CWE 代码和补救建议。这种反馈会启动一个迭代过程,在这个过程中,两个代理最多会进行四次信息交换,直到静态分析器代理认为代码安全为止。这一过程完成后,代码将被转发给模糊代理,进行动态漏洞测试。

3.3 Fuzzing Agent

        模糊测试代理的主要目标是生成不同的输入,以对生成的代码进行执行驱动的动态测试。它从初始种子生成器开始,它使用代码要求并利用 LLM 生成有意义的种子输入来识别错误。一旦生成,这些种子就会经历类型感知突变[33]以迭代地产生模糊输入。

        在整个模糊循环过程中生成的模糊种子输入用于评估系统行为和检测崩溃,崩溃表明存在潜在的错误。我们的执行过程包括将这些模糊输入种子传递给 LLM 生成的代码,解析代码以提取被测函数,并将其嵌入带有主函数的可运行 Python 模板中。每次运行后,都会对退出代码进行分析,以检测崩溃。导致崩溃的模糊输入会与遇到的错误细节一起保存,并作为代码调整的反馈发送回编码代理。然后,使用相同的输入种子重新运行程序,对修改后的代码进行重新评估,以确认问题是否已经解决。如果问题仍然存在,反馈循环将继续进行进一步调整。为了生成有效和高效的输入,我们根据每个参数的数据类型采用了类型感知突变策略。对于整数和浮点数据类型,突变过程会随机增加或减少输入。对于字符串,突变包括生成新字符串、洗牌字符或添加和删除字符。对于布尔数据类型,会随机返回一个布尔值。在列表和字典中,内容会根据其数据类型(数值或字符串)发生变化。

Logo

更多推荐