
معيار لتقييم وكلاء الذكاء الاصطناعي في إصلاح الثغرات الأمنية الواقعية.
معيار تقييم لوكلاء LLM على إصلاح الثغرات الأمنية الواقعية. يعمل الوكلاء داخل حاويات Docker معزولة (sandboxed)، ويُقيَّمون وفقًا لمجموعة اختبارات الأمان الخاصة بالمُطوِّر.
OPENAI_API_KEY و/أو ANTHROPIC_API_KEY و/أو POOLSIDE_API_KEY في بيئتك (أو في ملف .env)ثبّت التبعيات:
pip install poetry
poetry install
تقع كل مهمة تحت tasks/{CVE-ID}/ وتحتوي على:
tasks/CVE-2026-33175/
├── meta.json # GHSA ID, CWE, CVSS, repo URL, vulnerable and fixed SHAs
├── setup.sh # Clones repo, checks out the vulnerable SHA, installs dependencies
├── run_tests.sh # Injects test_security.py into the repo and runs pytest
├── test_security.py # Security tests (xfail on vulnerable code, pass on the fix)
├── advisory.md # Full GHSA advisory (richest prompt)
├── diagnose.md # Behavioural description only — no file or function names
├── locate.md # File and function only — no description of the flaw
└── Dockerfile # Optional; only present when the task needs extra system deps
مثال 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 تكراريّ التنفيذ (idempotent) وآمن لإعادة تشغيله. يُبقى test_security.py مخفيًا عن الوكيل أثناء التشغيل ولا يُحقن إلا بعد انتهاء الوكيل.
python build.py
يقوم هذا ببناء:
cve-bench/base) — Python 3.12 وgit وpoetry والأداة المساعدة (harness).cve-bench/{task-id}) — توسّع الصورة الأساسية، وتنسخ دليل المهمة، وتشغّل setup.sh.الخيارات:
# Build specific tasks only
python build.py --task CVE-2026-33175 CVE-2026-42561
# Skip rebuilding the base image
python build.py --skip-base
تُبنى صور المهام بشكل متوازٍ (حتى 5 عمال). إذا كان دليل المهمة يحتوي على Dockerfile، يُستخدم بدلاً من القالب العام docker/task.Dockerfile.
قبل تشغيل المعيار، تأكد من أن اختبارات الأمان لكل مهمة تميّز بشكل صحيح بين الكود المُعرَّض للثغرة والكود المُصحَّح:
python validate.py
لكل مهمة، تُنفَّذ ثلاث مراحل داخل حاوية المهمة:
| المرحلة | ما يتحقق منه |
|---|---|
| المُعرَّض للثغرة | يجب أن تفشل اختبارات الأمان (أو تُعلَّم xfail) على SHA المُعرَّض للثغرة |
| المُصحَّح | يجب أن تنجح اختبارات الأمان على SHA المُصحَّح |
| الانحدار | يجب أن تنجح الاختبارات غير الأمنية على SHA المُصحَّح |
تُعرض النتائج في جدول مباشر. رمز الخروج هو 1 إذا فشلت أي مهمة في أي مرحلة.
# Validate specific tasks only
python validate.py --task CVE-2026-33175 GHSA-r758-8hxw-4845
# Skip rebuilding images before validation
python validate.py --skip-build
python benchmark.py --model openai:gpt-5.5 poolside:laguna-m.1 --prompt-type advisory
الخيارات:
الموفّرون المدعومون:
يُنتج كل تشغيل ملف نتائج بصيغة JSON داخل results/:
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/ ويكتب رسومًا بيانية بصيغة SVG إلى docs/images/charts/. يتطلب Chrome/Chromium لتصدير Bokeh بدون واجهة رسومية (headless) (عبر chromedriver-binary).
تعمل الأداة المساعدة داخل كل حاوية Docker عبر python -m harness.run. وهي مسؤولة عن تحميل الموجه، وتشغيل حلقة الوكيل، وكتابة ملف النتيجة.
src/harness/
├── run.py # Entry point; parses args, wires components, calls BenchmarkRunner
├── client/
│ ├── factory.py # Parses provider:model-id, returns the correct LLMClient
│ ├── _client.py # Abstract LLMClient, ToolCall and LLMTurn dataclasses
│ ├── anthropic.py # Anthropic SDK integration
│ └── oai.py # OpenAI SDK integration (also used for Poolside)
├── agent/
│ ├── core.py # Agentic loop: calls client, dispatches tool calls, threads messages
│ └── runner.py # Wraps Agent, tracks timing and turn list
├── bench/
│ ├── runner.py # Orchestrates setup → agent → security tests → regression tests
│ ├── result.py # BenchmarkResult and TestResult dataclasses, JSON serialisation
│ └── repository.py # Writes result files to disk
└── task/
├── tools.py # Tool implementations: ListFiles, ReadFile, SearchInFiles,
│ # EditFile, CreateFile, DeleteFile, RunPytest
└── prompt_loader.py # Reads advisory.md / diagnose.md / locate.md
الأدوات المتاحة للوكيل:
تتحقق جميع الأدوات من المسارات مقابل جذر المستودع لمنع اجتياز الدلائل (directory traversal). لا يملك الوكيل حق الوصول إلى 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 | معرّف مهمة واحد أو أكثر | جميع المهام |
--clean | حذف النتائج الموجودة للنطاق المحدد قبل البدء | معطّل |
| الموفّر | الصيغة | متغير بيئة مفتاح API |
|---|
| 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 | بحث بتعبيرات regex في قاعدة الكود مع نمط glob اختياري للملفات |
edit_file | استبدال نطاق من الأسطر في ملف موجود |
create_file | إنشاء ملف جديد |
delete_file | حذف ملف |
run_pytest | تشغيل مجموعة اختبارات المشروع؛ يعيد تقريرًا بصيغة JSON |