AI写的代码比“手工代码”安全性差很多

类似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上的不安全代码进行模型训练。开发者需要对这些输入(开源代码)运行静态分析工具,仅使用通过安全检查的输入(代码)进行训练,以及设计更聪明的方法,利用库文档和“专家”代码示例在训练前重新加权整个数据集,可以显著提高数据的安全性。

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418685.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国考省考行测:语句排序2刷题

国考省考行测:语句排序2刷题 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点…

2024/1/20 并查集

目录 并查集关键代码 亲戚 村村通 团伙(新知识) 并查集关键代码 返回祖宗节点路径压缩: int find(int x) {if(f[x]!x) f[x]find(f[x]);return f[x]; } 合并: void make(int x,int y) {int f1find(f[x]);int f2find(f[y]);…

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构 ##关于window mysql主从搭建简单教程 传送门 window mysql5.7 搭建主从同步环境-CSDN博客 ##父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project…

c++ mysql数据库编程(linux系统)

ubuntu下mysql数据库的安装 ubuntu安装mysql&#xff08;图文详解&#xff09;-CSDN博客https://blog.csdn.net/qq_58158950/article/details/135667062?spm1001.2014.3001.5501 项目目录结构 数据库及表结构 public.h //打印错误信息 #ifndef PUBLIC_h #define PUBLIC_H…

SetFitABSA: 基于 SetFit 的少样本、方面级情感分析

SetFitABSA 是一种可以有效从文本中检测特定方面情感的技术。 方面级情感分析 (Aspect-Based Sentiment Analysis&#xff0c;ABSA) 是一种检测文本中特定方面的情感的任务。例如&#xff0c;在“这款手机的屏幕很棒&#xff0c;但电池太小”一句中&#xff0c;分别有“屏幕”和…

fabric.js 组件 图片上传裁剪并进行自定义区域标记

目录 0. 前言 1. 安装fabric与引入 2. fabric组件的使用 3. 属性相关设置 4. 初始化加载 4. 方法 5. 全代码 0. 前言 利用fabric组件&#xff0c;实现图片上传、图片”裁剪“、自定义的区域标记一系列操作 先放一张效果图吧&#x1f447; 1. 安装fabric与引入 npm i …

x-cmd pkg | mermaid - 流程图、时序图等图表绘制工具

简介 mermaid-cli 是由 Mermaid 官方提供的命令行工具&#xff0c;用于将 Mermaid 语法的文本转换为 SVG / PNG / PDF。 Mermaid 是一个基于 JavaScript 的图表绘制工具&#xff0c;它使用简单的文本描述语法&#xff0c;就可以绘制出流程图、时序图、甘特图等多种图表。 首次…

C#调用C动态链接库

前言 已经没写过博客好久了&#xff0c;上一篇还是1年半前写的LTE Gold序列学习笔记&#xff0c;因为工作是做通信协议的&#xff0c;然后因为大学时没好好学习专业课&#xff0c;现在理论还不扎实&#xff0c;不敢瞎写&#xff1b; 因为工作原因&#xff0c;经常需要分析一些字…

4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单 //C风格解法1&#xff0c;通过率100% #include <bits/stdc.h> // int a, b; 一定会自动初始化为 0int main(){int a 2, b 3; // 定义a&#xff0c;b&#xff0c;不会自动初始化&#xff0c;最好自己定义时初始化// windows环境下a值固定&…

Redis原理篇(SkipList)

一.概述 本质是双端链表&#xff0c;只不过在正向遍历时可以不一个一个遍历&#xff0c;而是可以跳着遍历。 怎么实现的呢&#xff0c;下面是SkipList源码 二.源码 1. zskiplist 意义&#xff1a;跳表 zskiplist里面有头指针和尾指针&#xff0c;节点数量&#xff0c;最大…

acwing讲解篇之93. 递归实现组合型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 本题相当于二叉树的深度优先遍历&#xff0c;树的第i层表示第i个数选或不选&#xff0c;当选择了m次左节点后退出 我们记录当前递归的深度deep 然后用state进行状态压缩&#xff0c;state第i位是1表示选第i个数&#xff…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …