
वास्तविक दुनिया की सुरक्षा कमजोरियों को ठीक करने के लिए AI एजेंटों का मूल्यांकन करने हेतु एक बेंचमार्क।
एक बेंचमार्क जो LLM एजेंटों की वास्तविक दुनिया की सुरक्षा कमज़ोरियों को ठीक करने की क्षमता का मूल्यांकन करने के लिए है। एजेंट सैंडबॉक्स्ड डॉकर कंटेनरों के अंदर चलते हैं और उनका स्कोर मेंटेनर के सुरक्षा टेस्ट सूट के विरुद्ध किया जाता है।
.env फ़ाइल) में OPENAI_API_KEY, ANTHROPIC_API_KEY, और/या POOLSIDE_API_KEY होना चाहिएनिर्भरताएँ स्थापित करें:
pip install poetry
poetry install
प्रत्येक कार्य tasks/{CVE-ID}/ के अंतर्गत रहता है और इसमें शामिल हैं:
tasks/CVE-2026-33175/
├── meta.json # GHSA ID, CWE, CVSS, रेपो URL, कमज़ोर और ठीक SHA
├── setup.sh # रेपो क्लोन करता है, कमज़ोर SHA चेकआउट करता है, निर्भरताएँ स्थापित करता है
├── run_tests.sh # रेपो में test_security.py इंजेक्ट करता है और pytest चलाता है
├── test_security.py # सुरक्षा परीक्षण (कमज़ोर कोड पर xfail, फ़िक्स पर पास)
├── advisory.md # पूर्ण GHSA सलाह (सबसे समृद्ध प्रॉम्प्ट)
├── diagnose.md # केवल व्यवहारिक विवरण — कोई फ़ाइल या फ़ंक्शन नाम नहीं
├── locate.md # केवल फ़ाइल और फ़ंक्शन — दोष का कोई विवरण नहीं
└── Dockerfile # वैकल्पिक; केवल तब मौजूद जब कार्य को अतिरिक्त सिस्टम डिप्स की आवश्यकता हो
meta.json उदाहरण:
{
"ghsa_id": "GHSA-xxxx-xxxx-xxxx",
"cwe": ["CWE-287"],
"cvss": 9.1,
"repo": {
"url": "https://github.com/org/project",
"vulnerable_sha": "abc123^",
"fixed_sha": "abc123"
}
}
setup.sh आइडेम्पोटेंट है और इसे फिर से चलाना सुरक्षित है। test_security.py को रन के दौरान एजेंट से छुपाकर रखा जाता है और एजेंट के समाप्त होने के बाद ही इंजेक्ट किया जाता है।
python build.py
यह बनाता है:
cve-bench/base) — Python 3.12, git, poetry, और हार्नेस।cve-bench/{task-id}) — बेस को बढ़ाता है, कार्य निर्देशिका कॉपी करता है, और setup.sh चलाता है।विकल्प:
# केवल विशिष्ट कार्य बनाएँ
python build.py --task CVE-2026-33175 CVE-2026-42561
# बेस इमेज को पुनः बनाना छोड़ें
python build.py --skip-base
कार्य इमेज समानांतर रूप से (अधिकतम 5 वर्कर्स) बनाई जाती हैं। यदि कार्य निर्देशिका में Dockerfile है, तो इसका उपयोग सामान्य docker/task.Dockerfile के बजाय किया जाता है।
बेंचमार्क चलाने से पहले, सत्यापित करें कि प्रत्येक कार्य के सुरक्षा परीक्षण कमज़ोर और ठीक कोड के बीच सही अंतर करते हैं:
python validate.py
प्रत्येक कार्य के लिए, यह कार्य कंटेनर के अंदर तीन चरण चलाता है:
| चरण | यह क्या जाँचता है |
|---|---|
| कमज़ोर | सुरक्षा परीक्षण कमज़ोर SHA पर विफल होने चाहिए (या xfail होने चाहिए) |
| ठीक | सुरक्षा परीक्षण ठीक SHA पर पास होने चाहिए |
| प्रतिगमन | गैर-सुरक्षा परीक्षण ठीक SHA पर पास होने चाहिए |
परिणाम एक लाइव तालिका के रूप में प्रदर्शित होते हैं। यदि कोई भी कार्य किसी भी चरण में विफल होता है तो निकास कोड 1 होता है।
# केवल विशिष्ट कार्य मान्य करें
python validate.py --task CVE-2026-33175 GHSA-r758-8hxw-4845
# मान्यकरण से पहले इमेज पुनः बनाना छोड़ें
python validate.py --skip-build
python benchmark.py --model openai:gpt-5.5 poolside:laguna-m.1 --prompt-type advisory
विकल्प:
समर्थित प्रदाता:
प्रत्येक रन results/ में एक JSON परिणाम फ़ाइल उत्पन्न करता है:
results/{task-id}__{provider}:{model}__{prompt-type}.json
मौजूदा परिणाम फ़ाइलें स्वचालित रूप से छोड़ दी जाती हैं। रन कार्यों में समवर्ती रूप से निष्पादित होते हैं (अधिकतम 20 वर्कर्स), प्रति-प्रदाता दर सीमा के साथ (एक समय में प्रति प्रदाता एक सक्रिय अनुरोध) 429 से बचने के लिए।
प्रत्येक परिणाम फ़ाइल निम्नलिखित संरचना वाला एक JSON ऑब्जेक्ट है:
{
"cve_id": "CVE-2026-33175",
"model_id": "openai:gpt-5.5",
"prompt_type": "advisory",
"timestamp": "2026-05-01T12:00:00",
"model_duration_s": 142.3,
"test_duration_s": 8.1,
"turns": [
{
"tool_calls_and_results": [...],
"input_tokens": 12400,
"output_tokens": 310
}
],
"tests": [
{
"kind": "security",
"name": "test_email_verified",
"outcome": "passed"
}
]
}
tests[].kind या तो "security" (test_security.py से) या "regression" (प्रोजेक्ट के अपने टेस्ट सूट से) है। एक रन को हल माना जाता है केवल यदि सभी सुरक्षा परीक्षण पास हों और कोई प्रतिगमन परीक्षण विफल न हो।
python generate_charts.py
results/ से सभी परिणाम फ़ाइलों को पढ़ता है और docs/images/charts/ में SVG चार्ट लिखता है। Bokeh के हेडलेस निर्यात के लिए Chrome/Chromium की आवश्यकता है (chromedriver-binary के माध्यम से)।
हार्नेस प्रत्येक Docker कंटेनर के अंदर python -m harness.run के रूप में चलता है। यह प्रॉम्प्ट लोड करने, एजेंटिक लूप चलाने और परिणाम फ़ाइल लिखने के लिए जिम्मेदार है।
src/harness/
├── run.py # प्रवेश बिंदु; तर्क पार्स करता है, घटकों को जोड़ता है, BenchmarkRunner को कॉल करता है
├── client/
│ ├── factory.py # provider:model-id पार्स करता है, सही LLMClient लौटाता है
│ ├── _client.py # अमूर्त LLMClient, ToolCall और LLMTurn डेटाक्लासेस
│ ├── anthropic.py # Anthropic SDK एकीकरण
│ └── oai.py # OpenAI SDK एकीकरण (Poolside के लिए भी उपयोग किया जाता है)
├── agent/
│ ├── core.py # एजेंटिक लूप: क्लाइंट को कॉल करता है, टूल कॉल भेजता है, संदेशों को थ्रेड करता है
│ └── runner.py # एजेंट को लपेटता है, समय और टर्न सूची ट्रैक करता है
├── bench/
│ ├── runner.py # सेटअप → एजेंट → सुरक्षा परीक्षण → प्रतिगमन परीक्षण का ऑर्केस्ट्रेट करता है
│ ├── result.py # BenchmarkResult और TestResult डेटाक्लासेस, JSON सीरियलाइज़ेशन
│ └── repository.py # परिणाम फ़ाइलों को डिस्क पर लिखता है
└── task/
├── tools.py # टूल कार्यान्वयन: ListFiles, ReadFile, SearchInFiles,
│ # EditFile, CreateFile, DeleteFile, RunPytest
└── prompt_loader.py # advisory.md / diagnose.md / locate.md पढ़ता है
एजेंट के लिए उपलब्ध टूल:
सभी टूल पथों को रिपॉजिटरी रूट के विरुद्ध मान्य करते हैं ताकि डायरेक्टरी ट्रैवर्सल को रोका जा सके। एजेंट के पास test_security.py या git इतिहास तक पहुँच नहीं है।
एजेंट लूप अधिकतम 20 टर्न के लिए चलता है। यदि टर्न सीमा पूरी हो जाती है, तो रन को वैसे ही रिकॉर्ड किया जाता है और सुरक्षा परीक्षण अभी भी रिपॉजिटरी की उस स्थिति के विरुद्ध निष्पादित किए जाते हैं जो एजेंट ने छोड़ी थी।
tasks/{CVE-ID}/ बनाएँ और meta.json, setup.sh, run_tests.sh, test_security.py, advisory.md, diagnose.md, locate.md जोड़ें।setup.sh और run_tests.sh को निष्पादन योग्य बनाएँ (chmod +x)।python validate.py --task {CVE-ID}।python build.py --task {CVE-ID}।यह कार्य स्वतंत्र अनुसंधान के रूप में किया गया था। अनुसंधान करने और इस रिपॉजिटरी को तैयार करने के समय, मेरी कोई संस्थागत संबद्धता नहीं थी।
@misc{gattipinheiro2026cvebench,
author = {Gatti Pinheiro, Giovanni},
title = {{CVE-Bench}: Benchmarking {LLM} Agents on Real-World Security Vulnerability Fixes},
year = {2026},
howpublished = {\url{https://giovannigatti.github.io/cve-bench}},
note = {Code available at \url{https://github.com/GiovanniGatti/cve-bench}}
}
MIT — LICENSE देखें।
| फ़्लैग | विवरण | डिफ़ॉल्ट |
|---|
--model | एक या अधिक provider:model-id स्ट्रिंग | सभी कॉन्फ़िगर किए गए मॉडल |
--prompt-type | advisory, diagnose, locate, या कोई भी संयोजन | सभी तीन |
--task | एक या अधिक कार्य ID | सभी कार्य |
--clean | शुरू करने से पहले चयनित दायरे के लिए मौजूदा परिणाम हटाएँ | बंद |
| प्रदाता | प्रारूप | API कुंजी env var |
|---|
| OpenAI | openai:gpt-5.5 | OPENAI_API_KEY |
| Anthropic | anthropic:claude-haiku-4-5-20251001 | ANTHROPIC_API_KEY |
| Poolside | poolside:laguna-m.1 | POOLSIDE_API_KEY |
| टूल | विवरण |
|---|
list_files | रिपॉजिटरी में फ़ाइलों और निर्देशिकाओं को सूचीबद्ध करें |
read_file | फ़ाइल सामग्री पढ़ें, वैकल्पिक रूप से पंक्ति श्रेणी |
search_in_files | कोडबेस में रेगेक्स खोज, वैकल्पिक फ़ाइल ग्लोब के साथ |
edit_file | मौजूदा फ़ाइल में पंक्तियों की श्रेणी बदलें |
create_file | एक नई फ़ाइल बनाएँ |
delete_file | एक फ़ाइल हटाएँ |
run_pytest | प्रोजेक्ट का टेस्ट सूट चलाएँ; JSON रिपोर्ट लौटाता है |