无意中延续了十年的bug的人工智能工具现在也可能有助于消除它。
2010 年,一位开发人员发布了一个小代码片段作为 GitHub Gist,以展示如何在 Node.js 中创建静态文件服务器。它包括一个微妙的路径遍历漏洞,允许攻击者在指定目录之外导航。随着时间的推移,不安全的模式通过Stack Overflow答案,博客文章,大学教程甚至主要公司的生产存储库传播。
多年来,它变得如此嵌入开发者文化,以至于它进入了当今AI模型的训练数据。
“我们并不100%确定2010年的Gist是原始来源,但这是我们可以追踪的最早实例,”莱顿大学博士候选人,分析该问题的出版前论文的主要作者Jafar Akhoundali说。“很可能是代码片段传播,因为它解决了一个常见问题 – 提供静态内容 – 并且可以很容易地用复制粘贴重复使用。
教程和像Stack Overflow这样的平台可能是传播的主要贡献者,因为它们更明显,更受寻求快速解决方案的开发人员的信赖,并设计用于代码重用。Akhoundali说,项目之间的直接复制粘贴频率较低,因为它通常需要更多的上下文和努力从业务逻辑中提取可重复使用的代码。
为了衡量这个漏洞已经变得有多深,Akhoundali和他的团队要求大型语言模型,包括GPT-3.5,GPT-4,Claude,Gemini和Copilot模型为静态文件服务器编写代码。他们测试了一般提示和明确请求安全代码的提示。即使指示优先考虑安全性,70%的响应也包含易受攻击的逻辑。平衡模式下的 GPT-3.5 和 Copilot 无法在任何测试场景中生成安全代码。
“许多LLM都是在GitHub等大型公共代码库上训练的,”Akhoundali说。他说,如果数据包括不安全的模式,模型将不可避免地重现它们。
这是一个“垃圾进来,垃圾出去”的案例,他说。“当数据本身缺乏质量时,我们不能简单地期望模型表现更好……无论是人类还是人工智能,都不是罪魁祸首,”他说。解决此类问题的潜在解决方案是自我改进的模型,这些模型可以提出假设,实验和推理,而不仅仅是依赖互联网上不受信任的可用数据,如人工智能代理。
研究人员没有发现OpenAI,Gemini和Claude等模型提供商之间的漏洞再现有任何显着差异。该团队还建立了一个系统来修复它。它扫描公共GitHub存储库以查找路径遍历漏洞模式,并尝试使用沙盒测试确认可利用性。如果成功,该工具使用 GPT-4 生成补丁。它通过验证易用代码可以在实践中触发来避免误报,这与纯静态分析不同。
设计修补步骤在技术上被证明是具有挑战性的。早期尝试要求模型重写整个文件,从而导致语法错误和意外更改。后来,该团队通过附加行号和请求差异来改进其方法。即便如此,确保补丁正确性需要额外的启发式和程序检查。
“有很多程序,每个程序都需要不同的功能和逻辑。即使我们进行定制的每个程序测试,仍然无法覆盖所有角落案例,这需要维护人员进行最终检查,“Akhoundali说。
从对40,546个存储库的初始扫描中,该工具验证了1,756个是可利用的路径遍历缺陷。它产生了1600个有效的补丁。只有63个项目接受了修复。
Akhoundali将低摄取率归因于几个因素。一些存储库被放弃,其他仓库仅在测试或开发环境中使用代码,在某些情况下,他们无法获得安全通道来到达维护者。
为了避免恶意行为者,该团队隐瞒了全部技术细节。他们尽可能通过私人渠道联系。“我们试图平衡通知社区有关漏洞的好处与潜在攻击者发现此漏洞并利用它的风险,”Akhoundali说。
该团队的研究集中在JavaScript项目中的路径遍历漏洞上,但管道是可扩展的。他说,原则上,该方法可以应用于其他漏洞类甚至其他编程语言。
至于人工智能供应商的角色,Akhoundali认为默认的训练和模型对齐可以有所帮助。但这将是具有挑战性的,他说。大多数时候,安全代码意味着更复杂的代码。所有开发人员都会想要它,还是他们只对功能感兴趣?性能怎么样 – 有时,运行安全代码使其速度慢得多,并且需要多次检查,他说。
终极设计选择取决于开发人员,但供应商起着关键的推动作用。设计选择和优先级因不同的开发人员和公司而异,”他说。