Veracode 2025

GenAI 代码安全评估报告

本文核心回答:在没有特定安全提示词的情况下,大语言模型生成的代码是否安全?

1

研究方法与依据 (Methodology)

📊 测试样本规模
覆盖 100+ 个大语言模型,包含最新的 GPT-5 系列、Claude Sonnet 4.5、Gemini 2.5 等。
🧪 80项 编码任务
4种语言: Java, Python, C#, JS
4类漏洞: SQL注入, XSS, 日志注入, 加密缺陷
🔍 评估标准
采用 SAST (静态应用安全测试) 引擎。仅当代码通过编译且无已知 CWE 漏洞时,才计为“通过”。
🤖 提示词策略
零安全提示 (Zero-Security Prompting)。仅描述功能需求,不提及安全约束,模拟开发者最自然的提问方式。
2

关键数据概览 (Key Findings)

55% 总体安全通过率
(中位数)
72% GPT-5 Mini
(最高分模型)
28.5% Java 语言
(最低通过率)
0% 随模型参数量
增长的安全提升
3

核心深度洞察 (Core Insights)

洞察一:为什么 OpenAI 的新模型突然变强了?

在长期停滞在 50-59% 的通过率后,OpenAI 的 GPT-5 系列(特别是 reasoning models)跃升至 70% 以上。

💡 推理机制即“自我审查”: 表现最好的模型都是“推理模型 (Reasoning Models)”。它们在输出代码前会进行内部思维链推导。这个过程类似于开发者的“自我代码审查”,显著过滤了不安全的编码模式。而非推理版模型 (GPT-5 Chat) 表现依然平平 (52%)。
洞察二:为什么 Java 成了“重灾区”?

Python、C# 和 JavaScript 的表现非常接近(约 55-61%),唯独 Java 只有 28.5%。

📉 训练数据的“历史包袱”: Java 作为老牌服务端语言,其互联网上的大量存量代码(训练数据)编写于安全意识普及之前。模型学习了大量过时的、包含漏洞的 Legacy Code(例如拼接 SQL 字符串),从而导致了糟糕的安全表现。
洞察三:模型“偏科”严重,这说明了什么?

模型在 SQL 注入防御上得分很高 (>80%),但在 XSS (跨站脚本) 和 日志注入上惨败 (<15%)。

🚫 上下文缺失是硬伤:
  • 简单模式 (SQLi): 防御 SQL 注入有标准模板(参数化查询),无论上下文如何,这样做总是对的。模型很容易学会这个“套路”。
  • 困难模式 (XSS): 防御 XSS 需要理解数据流向(数据是否被污染?是否需要清洗?)。大模型缺乏全局应用上下文,无法判断变量是否安全,往往选择“躺平”不处理。
洞察四:语法完美 ≠ 代码安全

报告发现了一个有趣的背离现象:

语法正确率 (代码能跑) 接近 100%
安全正确率 (代码无毒) 仅 55%
⚠️ 危险的假象: 模型越来越擅长写出“能运行”的代码,这会让开发者放松警惕。但“能运行”不代表“无漏洞”。训练数据中充满了能运行但不安全的代码,模型忠实地复制了这一点。

原文

源链接

附件

英文pdf (12.8M)

下载