AICGSecEval: A Repository-Level AI Code Security Benchmark Based on Real CVEs
A.S.E turns 145 real CVEs into 145 fill-in-the-blank questions. Each question is a real GitHub project, a vulnerable commit, a hollowed-out code block. AI must fill the hole back in within project context. Then the framework runs Docker: compile → functional test → PoC verification. Functional pass + PoC still triggers = AI wrote the CVE right back.
1. What Problem It Solves
Existing AI code security benchmarks (SecureCodeBench, OWASP datasets, etc.) are function-level — give a function signature, have the model write from scratch, check if output for vulnerabilities. But real-world usage is different: developers use Copilot / Claude Code inside existing projects, AI reads project context then completes code. Context is repository-level, not isolated.
A.S.E builds this gap into the benchmark design:
| Dimension | Function-level benchmarks | A.S.E (repository-level) |
|---|---|---|
| Input | Function signature + NL description | Full project + hollowed vulnerable code block |
| Context | None | BM25-retrieved related project files |
| Verdict | SAST scanning | SAST scanning + PoC dynamic verification |
| Vulnerability source | Hand-written / LLM-generated | Real CVEs |
The core question A.S.E asks: when AI fills in code within real project context, does it write CVEs back verbatim?
2. Dataset: How 145 Questions Are Constructed
Data Source
Each instance comes from a real CVE:
- Find the GitHub repo and vulnerable version commit (
base_commit) for the CVE - Locate the vulnerable code file and line numbers (
vuln_file+vuln_lines) - Find the commit that fixes the CVE (
patch_commit) - Build a Docker image with the project’s build environment and vulnerable source
Data Structure
A typical instance (data/data_v2.json):
1 | { |
Dataset Scale
| Dimension | Value |
|---|---|
| Test instances | 145 |
| Repos covered | 51 GitHub projects |
| CWE types | 29 (covering OWASP Top 10 + CWE Top 25) |
| Languages | C (70), PHP (42), Java (16), Python (13), TypeScript (2), JavaScript (1), C++ (1) |
| Severity | High (70), Medium (65), Critical (9), Low (1) |
3. Evaluation Principle: Three-Step Verdict
3.1 Code Hollowing & Context Extraction
ContextManager (bench/context_manager.py) does three things:
- Git version switching: check out the repo to the vulnerable commit
- Code hollowing: delete the code block specified by
vuln_file+vuln_lines, leaving a “hole” - Context extraction: use BM25 to retrieve related files from the project, assemble into a prompt for AI
What AI receives: project README + hollowed file + BM25-retrieved related code + vulnerable code block’s functional summary. This is isomorphic to the information flow when a real developer joins a project.
3.2 Code Generation
The framework supports two modes:
- LLM mode: direct API call (e.g., GPT-4o), send prompt, receive generated code
- Agent mode: let autonomous coding agents like Claude Code operate within the project, agent decides which files to read and how to fill the hole
3.3 Dual-Track Static + Dynamic Verdict
Static assessment (run_security_scan_static.py):
- Scan AI-generated code with SAST tool Docker images (AutoPoC / ai_gen_code)
- Output number of vulnerabilities detected
Dynamic assessment (run_security_scan.py):
- Replace code in Docker container with AI-generated version
- Execute three-step verification:
| Step | Command | Pass criteria |
|---|---|---|
| 1. Compile check | image_status_check_cmd |
Outputs [A.S.E] image startup successfully |
| 2. Functional test | test_case_cmd |
Outputs [A.S.E] test case passed |
| 3. Vulnerability verification | poc_cmd |
Outputs [A.S.E] vulnerability not found |
Verdict matrix:
| Compile | Function | PoC | Conclusion |
|---|---|---|---|
| ✗ | - | - | Generation failed |
| ✓ | ✗ | - | Function incorrect |
| ✓ | ✓ | triggers | AI wrote the CVE back |
| ✓ | ✓ | doesn’t trigger | Success: function correct, vulnerability fixed |
3.4 Scoring
- Overall success rate = successful instances / total instances
- Per-CWE success rate = success rate for each vulnerability type (shows where AI performs worst)
- Best-of-N cycles = run each instance 3 times, take best result (eliminates randomness)
4. Design Highlights & Limitations
Highlights
① Repository-level context + real CVEs. Not academic function-signature exercises, but real project scenarios. BM25 retrieval + functional summary context construction is isomorphic to how developers use Copilot.
② Dual-track static + dynamic complement. Static scanning has broad coverage but false positives; dynamic PoC is precise but only verifies known vulnerabilities. Cross-validating both paths is more reliable than either alone.
③ Docker isolation ensures reproducibility. Each instance ships with its own image; compile, test, PoC all run in containers — anyone gets the same results.
④ Agent mode is pluggable. Extend AgentBenchBase, implement three methods, plug in a new agent. v2.0 already supports Claude Code.
Limitations
① Uneven language distribution. C + PHP account for 77%; Python has only 13 instances — yet Python is the most frequent language for AI coding assistants. Go / Rust / Kotlin are absent.
② Limited SAST tool coverage. Only two static analysis images (AutoPoC and ai_gen_code); weak detection for certain CWE types.
③ BM25 retrieval is lexical matching. It finds files with “similar words,” not “logically related” files. For vulnerabilities depending on implicit context (framework middleware chains, database schemas), it may miss truly relevant code.
④ High hardware requirements. 100GB disk + Docker + multi-concurrency — won’t run on a thin laptop.
5. Ecosystem Position
| Benchmark | Granularity | Vuln source | Assessment | Repo-level? |
|---|---|---|---|---|
| A.S.E | Repository-level | Real CVEs | SAST + PoC | ✓ |
| SecureCodeBench | Function-level | Hand-written + LLM | SAST | ✗ |
| BigCodeBench | Function-level | Programming problems | Unit tests | ✗ |
| garak | Application-level | Probe families | Detectors | N/A |
A.S.E is currently the only open-source benchmark satisfying all three: “repository-level context + real CVEs + dual-track static/dynamic assessment.”
The paper’s core finding: larger models don’t necessarily generate more secure code, and bigger token budgets don’t guarantee better security. Secure coding ability isn’t a simple scaling effect — context understanding and vulnerability pattern recognition matter more.
6. One-Line Verdict
A.S.E uses 145 real-CVE fill-in-the-blank questions to test AI coding assistants’ security performance in real projects. It doesn’t ask “can the model write secure code” — it asks “when the model fills in code within project context, does it write CVEs back verbatim?” The answer is often “yes” — and larger models with more tokens don’t stably solve this.
If you do AI coding security research or evaluation, A.S.E is the most worthwhile open-source benchmark available today. Repository-level design ensures evaluation results correlate with real scenarios; dual-track static/dynamic avoids single-method misjudgment.