对于为了满足日益增长的需求和责任而飞速工作的软件开发人员来说,几年前人工智能 (AI) 编程助手的出现无疑是一大福音。开发人员很快就成为了生成式 AI 模型的狂热用户,这些模型加速了代码创建过程和交付速度。然而,在带来不可否认的初始优势之后,另一只鞋子也随之落下,给日益复杂的环境增添了更多复杂性。保护攻击面本来就是一项永无止境的任务;而 AI 编程则让这项任务变得更加难以克服。
除了进一步增加代码库的复杂性之外,人工智能模型还缺乏创建高质量、安全代码所必需的上下文细微差别,尤其是在由缺乏安全知识的开发人员使用时。因此,漏洞和其他缺陷正以前所未有的速度涌现。
当前的软件环境在安全方面已经失控,而且没有丝毫减缓的迹象。但斩杀复杂性和不安全性这两头“双龙”仍有希望。企业必须挺身而出,建立强大的开发人员风险管理体系,并通过教育和技能提升,为开发人员提供掌控软件所需的工具。
人工智能助手增加了复杂性和代码可维护性问题
2022年11月,生成式人工智能(Generative AI)作为OpenAI的ChatGPT首次亮相,开发者们迅速抓住了这一机遇,很快便使用GenAI模型来加速代码创建和软件开发。根据GitHub的一项调查,截至2023年6月,92%的美国开发者将人工智能工具用于工作或个人用途。开发者们大多认为加速代码创建是有益的,使用人工智能工具也迅速成为一种常态。
然而,尽管后续调查(例如Synk的一项调查)发现,约四分之三的开发人员认为 AI 生成的代码比人类编写的代码更安全,但他们也发现,超过一半的 AI 代码中仍然存在错误。此外,80% 的开发人员忽视了安全的 AI 编码策略,错失了及时发现错误的机会。
随着人工智能助手加速这一进程,大量易受攻击的软件被发布到一个环境中,无论代码是如何创建的,这个环境中已经充满了安全漏洞。
GitClear最近的一项研究揭示了 AI 生成的代码如何增加复杂性,并加剧了软件开发生命周期 (SDLC) 后期维护和保护软件的挑战。GitClear 分析了 2020 年 1 月至 2023 年 12 月期间创建的四年间更改的代码(约 1.53 亿行),发现了有关代码流失率和复制粘贴代码率的惊人结果。
“代码流失”(Code Churn)指的是编写后两周内被更改或更新的代码,预计在2021年至2024年间将翻一番,而这还不包括人工智能工具的冲击。在同一时期,复制/粘贴代码的数量增长速度快于更新、删除或移动的代码数量,这表明人们正在逐渐远离“DRY”(不要重复自己)的实践,而这种趋势必然会导致软件缺陷的增加。
这两种不良做法都会增加应用程序的复杂性,从而推高支持成本,并增加软件安全的难度。人工智能加速的软件生产速度,使得更多漏洞在修复之前就被放入流水线,这也大大延长了安全措施跟进所需的时间。美国国家标准与技术研究院 (NIST) 的一项研究发现,与在软件开发生命周期 (SDLC) 初期修复缺陷相比,在测试阶段修复缺陷所需的时间要长 15 倍。而在部署/维护阶段修复缺陷所需的时间则可能长达 30 到 100 倍。
AI工具提高了代码交付速度,提升了原始生产效率,但这些早期的生产力提升却被软件开发生命周期(SDLC)后期的代码可维护性问题所抵消。解决方案是从一开始就解决这些问题,以免它们危及应用程序和数据安全。
借助升级技能的武器库
参与软件开发的组织需要转变其文化,树立“安全第一”的理念,将软件安全视为一项业务优先事项,而非仅仅将其视为技术问题。持续不断的攻击和引人注目的数据泄露事件已变得屡见不鲜,董事会和首席执行官们都无法忽视。安全的软件是企业生产力、声誉和生存能力的基石,因此,构建强大的安全文化至关重要。而安全文化的基础正是开发人员风险管理。
实施教育计划以提高开发人员编写安全代码和纠正人工智能生成或第三方代码中的错误的技能,可以防止那些日益常见的缺陷进入管道,从而降低复杂性(第一条龙),同时提高安全性(第二条龙)和软件质量。
公司需要投资一个能够提供敏捷、实践和持续学习的项目,并将安全作为其关键绩效指标中的突出部分。学习项目应该建立开发人员所需技能的基准,并应包含内部和行业基准来衡量他们的进度。它应该解决实际问题,并根据开发人员的工作量身定制,采用适合他们日程安排的形式,并涉及他们实际使用的编程语言。这种技能提升有助于形成一种安全文化,在这种文化中,开发人员与安全团队合作,确保在软件开发生命周期 (SDLC) 开始时遵循最佳安全实践,这已被证明是确保软件安全的最有效(且经济高效)的方法。
教育的一个关键方面是了解程序是否有效,开发人员是否已经吸收了新技能并且正在持续应用这些技能。
对于时间紧迫的开发人员来说,AI 工具在速度和效率方面的优势是难以抗拒的。但 AI 生成的代码所带来的复杂性和风险也不容忽视。
组织需要全面提升开发人员的技能,以便他们能够与安全专业人员合作,将软件安全问题扼杀在萌芽状态。只有管理好开发人员的风险,才能斩断复杂性和不安全性这两大“双龙”,确保代码(无论是由人工智能还是人类生成的)安全可靠,避免漏洞。