AI 生成的代码真的安全吗? 译文

愤怒的蜗牛

软件开发编程曾经被认为只有具备深厚专业知识与技能的程序员才能胜任的工作。不过,现在貌似任何人都可以利用自然语言工具来实现并完成与此同时,过去那些需要数天、甚至数月才能开发出来的功能现在完全可以在 AI 模型的代码加持在几分钟开发出来。例如,OpenAICodex 和 GoogleBERT 都是接受过 Web 博客编程Stack overflow 等方面任务的培训。

AI 生成的代码真的安全吗? 译文

目前,许多前卫技术尝鲜者、以及新晋的 SaaS 提供商都在利用 AI 工具来使产品更加智能。SaaS 程序员也在不断探索基于 AI SaaS 工具的生成式代码输出不过,一些智能模型通过数学概率演算创建代码同时,也被发现会产生幻觉,甚至呈现了虚假的信息。学术界曾进行过一项研究并发现:由AI 生成的代码,往往会包含OWASP 10 大经典漏洞,而且有近 40% 的代码存在安全漏洞

哪些会导致 AI 生成的代码不安全?

常言道,编程标准的遵循和代码的质量决定了软件的安全性。可是,AI 模型主要是根据互联网上不同程度的可用信息,加以训练来生成代码。因此,代码质量、可靠性、安全性等方面都可能与人类开发生成的代码有所不同。例如,由 Web 开发示例训练出的模型,很可能包含着欠缺的数据验证实践。而当模型生成的代码采用相同的不良实践时,这种验证上的不足很可能会导致系统中后续运行过程中的安全问题。

5表明代码包含安全漏洞的指标

无论参数量级是百万还是十亿,已知的模型都会产生幻觉以此做出错误的预测。普通的开发人员在审阅由 AI 生成的代码时,他们很可能会错过那些细微影响严重的安全漏洞。然而,对于那些完全了解设计和开发模式的资深开发人员来说,他们则可以从如下方面及时发现漏洞并与 SaaS 安全最佳实践保持一致。

1. 强制执行类型推理和输入验证

如今,现代化的框架和代码严重依赖接口枚举的方式,进行各种推理和验证。这在某种程度上保证了代码能够准确地完成其任务保证安全性。然而,除非我们准确指导 AI 生成代码,否则它不会去执行各种缜密的推理。而且,即使在我们精心设计了提示,类型不匹配和验证执行也可能无法与用例匹配请参见如下代码段因此,为了能够查找和修正代码中的错配之处,开发人员必须充分了解其对应的代码以及具体的业务要求。

def reciprocal(user_input):
 # Insecure implementation with no type inference or validation
 result = 100 / user_input return result1.2.3.4.

2. 类/对象之间的非标准状态和上下文共享

众所周知,程序公共/私有/受保护(Public/Private/Protected 方式共享各种对象。高阶功能函数和类往往通过直接访问公共/受保护变量来执行计算进而继承对象状态。如果在实施或执行中出现了错误,那么应用的安全性以及性能瓶颈就会随即出现请参见如下代码段对此,SaaS 开发人员必须认真审查共享状态和上下文管理逻辑,以确保正确安全的代码实现

class InsecureClass:
 def __init__(self, owner, balance, password):
 self.owner = owner # Public attribute
 self._balance = balance # Protected attribute
 self.__password = password # Private attribute
 # Public def
 def get_balance(self):
 return self._balance
 # Protected def
 def _update_balance(self, amount):
 self._balance += amount
 # Private def
 def __validate_password(self, input_password):
 return self.__password == input_password
 # Insecure def exposing private data
 def insecure_password_exposure(self):
 return self.__password1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.

3. 数据处理和共享技术的弱实施

系统中的各项服务往往需要通过网络共享和接收信息。如今,安全连接和数据处理对于基于云服务的系统来说尤为重要就代码而言,我们在需要通过分布式数据网络读取、处理和共享组织中的敏感数据时,必须采用强大的处理协议和安全技术防止数据被截获因此,在使用 AI,SaaS 开发人员必须在成熟的应用程序中杜绝在架构层面上数据不安全共享下面的代码段便是一个典型的例子:

#Insecure Data Sharing
@app.route("/user/<int:user_id>", methods=["GET"])def get_user(user_id):
 user = users.get(user_id)
 if user:
 return jsonify(user) # All user data exposed, including secrets
# Insecure Data Handling
@app.route("/update_email", methods=["POST"])def update_email():
 data = request.json()
 user_id = data.get("user_id")
 new_email = data.get("new_email")
 if user_id in users:
 users[user_id]["email"] = new_email # No validation of new_email return jsonify({"message": "Email updated successfully"})1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

4. 密钥和身份验证处理不足

复杂的网络环境中,实施严格的基于角色的访问控制(RBAC保障合理的身份与权限匹配关系,保持隐私合规性的必要条件。程序代码由AI大语言模型(LLM)生成时,默认机制便是通过基础的身份验证便可提供程序连接和授权显然,这种简单的解决方案不足以在有新的网络威胁出现时仍保持必要的安全态势请参见如下代码段为此,开发人员在新增自定义函数与功能时,必须进行全面测试,以确保密钥的安全性和身份验证处理得到了妥善的实施。

# Insecure authentication
@app.route("/login", methods=["POST"])def login():
 data = request.json()
 email = data.get("email")
 password = data.get("password")
 for user_id, user in users.items():
 if user["email"] == email and user["password"] == password:
 return jsonify({"message": "Login successful", "user_id": user_id})1.2.3.4.5.6.7.8.9.

5. 过时的依赖项和已弃用的功能

如今由社区创建的开源库和框架在代码中占比并不少不过,由于可供AI训练的数据的局限性,以及可能并非最新,这便导致了AI 编程模型训练过程中,其知识停滞不前,无法获悉最新的版本随着技术的发展,许多功能将过时,一些依赖跟不上版本的迭代请参见如下代码段因此,SaaS 开发人员需要仔细审查并确保使用有效的依赖项,进而保障整体的安全性以及功能上的适用性

import md5 # Outdated library
def insecure_hash_password(password):
 # Insecure password hashing done using the deprecated MD5 algorithm.
 return md5.new(password).hexdigest()1.2.3.4.

使用AI 生成代码的安全提示

说到底,由大语言模型的高级编码所生成的代码,需要符合既定的安全和编程标准总体而言,我们可以通过如下5个方面,采取简单的检查确保 AI 生成代码安全与合规

  1. 与安全和架构团队一起进行代码审查并将其作为软件开发生命周期的标准部分。

  2. 将自动化安全测试和验证步骤集成到版本控制工具中。

  3. 在测试 KPI 中包含依赖关系和合规性检查。

  4. 采用带有静态和动态安全测试工具的零信任技术架构。

  5. 利用 DevSecOps 的优秀实践和防范影子 AI。

使用Github Action处理不安全的 AI 生成代码

无论人工多么仔细地审查和审计AI生成的代码,人为疏漏还是存在的。因此,我们需要一些预定义的检查,以便在代码进入版本控制系统立即对其开展测试和验证。在此,我们可以引入 Github Action,自动运行安全和质量检查请参见如下代码段

name: Simple Security Checks for AI generated Codeon:
 push:
 branches:
 - main pull_request:
 branches:
 - mainjobs:
 security-and-quality-check:
 runs-on: ubuntu-latest Steps:
 - name: Repository checkout uses: actions/checkout@v3 - name: Python setup uses: actions/setup-python@v4 with:
 python-version: ">=3.9"
 - name: Dependency installation run: |
 python -m pip install --upgrade pip
 pip install bandit pytest - name: Identifying insecure libraries and patterns run: |
 echo "Checking for insecure patterns..."
 if grep -r "md5.new(" .; then
 echo "ERROR: Insecure MD5 hashing detected. Use hashlib.sha256 or bcrypt instead."
 exit 1
 fi
 echo "No insecure patterns detected."
 - name: Scanning for security vulnerabilities run: |
 echo "Running Bandit security scanner..."
 bandit -r .
 - name: Running unit tests run: |
 echo "Running unit tests..."
 pytest test/unit --cmodopt=local - name: Notifying on failure if: failure()
 run: |
 send_slack_notification(“Unsafe code merge detected, fix immediately”)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.

综上所述,大语言模型可谓 SaaS 开发人员使用自然提示语言生成代码和信息的用工具之一不过,它们会带来了各项安全风险,并且有时会提供不适合企业需求的性能代码。对此,SaaS 开发人员应加倍小心。希望上述讨论能够给你提供确保AI生成代码安全态势的有力参考并能在你的日常工作中被实践


您需要 登录账户 后才能发表评论

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,15人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码