斯坦福大学的一项研究发现,使用人工智能助手编写的代码比“手工代码”的安全性差很多,而且人工智能工具还会导致用户对其代码中的安全性过于自信。



类似Github Copilot这样的人工智能代码助手能大大提高开发人员的开发效率和生产力,并降低开发技术门槛(不熟悉语言或概念的程序员的进入)。然而,缺乏经验的开发人员可能会轻易相信人工智能助手的输出内容,从而引入安全漏洞风险。


近日,斯坦福大学的一项研究发现,使用人工智能助手编写的代码比“手工代码”的安全性差很多,而且人工智能工具还会导致用户对其代码中的安全性过于自信。


调查还发现,人工智能助手输出的代码通常在满足“正确性”的同时,很少了解密码应具有的安全属性,并且在某些情况下,可能会创建无意中使用户感到困惑的代码。


该调查设计了一个全面的用户研究项目,共有47名参与者使用三种不同的编程语言(Python、JavaScript和C)执行了五项与安全相关的编程任务。三个核心研究问题如下:


  • 当用户使用人工智能编程助手时,是否会编写更多不安全的代码?
  • 用户相信人工智能助手能够编写安全的代码吗?
  • 用户与人工智能助手交互时的语言和行为如何影响其代码中的安全漏洞程度?


多个国家的开发人员参与了该调查,其中大多数来自以下三个国家:


  • 美国 57%
  • 中国 15%
  • 印度 13%


该调查的关键发现如下:


人工智能代码在五项测试中的安全性表现普遍低于人工代码


在所有五个类型的安全错误测试(下图)中,人工智能助手所犯的编码错误都超过手工编码,与对照组相比,67%的使用AI助手的开发者提供了正确的解决方案,而“人工编码”的对照组的这一比例为79%。这表明,依赖人工智能辅助开发可能会导致更多安全错误。



AI实验组(蓝色)和人工对照组(黄色)五项测试的代码安全错误占比


例如,在SQL注入漏洞测试中,使用AI助手的参与者提供的解决方案安全性明显较低(36%对50%)。有36%的使用人工智能助手的参与者编写了容易受到SQL注入攻击的解决方案,而不使用AI助手的对照组的这一比例仅为7%。


开发者最常用的提示词



开发者通常会选择使用用多种策略提示人工智能助手:64%的开发者尝试直接任务规范;21%的开发者选择向AI助手提供函数声明指令(例如“编写一个函数……”);49%的人指定了编程语言;61%使用先前模型生成的提示词来提示代码助手(这可能会强化模型提供的漏洞);53%的开发者指定了特定API调用的特定库;Python开发者提供函数声明更为常见;而参与者更有可能为SQL和C问题指定编程语言。


整改建议


一、优化提示词。调查发现,使用AI的开发者用户的语言和提示参数的选择存在显着差异。建议未来的系统在将用户的提示用作系统的输入之前,应考虑改进用户的提示(例如修复拼写错误并包含设计人员易于实施的有关安全性的语言),以更好地优化整体性能。


另一种方法可以考虑基于机器学习的方法来预测用户提示的意图(或者他们的任务可能产生的特定类别的安全问题),然后修改提示以防范已知漏洞或AI输出。


二、减少AI的代理权。提供不安全代码的开发者不太可能主动修改人工智能助手的输出或调整参数,这意味着不能给予人工智能助手太多的代理权(例如自动参数选择),因为这样可能会导致用户疏于防范安全漏洞。随着人工智能代码助手变得越来越普遍,这些都是需要考虑的重要解决方案。例如,与GitHubCopilot集成的VSCode等IDE可以调整默认行为,根据AI助手建议的库,实时清晰地显示库文档和使用警告。


三、净化训练数据。许多人工智能编程助手都使用GitHub上的不安全代码进行模型训练。开发者需要对这些输入(开源代码)运行静态分析工具,仅使用通过安全检查的输入(代码)进行训练,以及设计更聪明的方法,利用库文档和“专家”代码示例在训练前重新加权整个数据集,可以显著提高数据的安全性。


结论


使用人工智能助手写代码开发者在大多数编程任务中更有可能引入安全漏洞。此外,查询人工智能助手的提示词越专业具体(例如提供帮助函数或调整参数),生成的代码越安全。


参考链接:


https://arxiv.org/html/2211.03622v3