
خط أنابيب تحليل أمني آلي يقوم بتشغيل استعلامات CodeQL على مستودعات GitHub ويستخدم نماذج اللغة الكبيرة (LLMs) لتصنيف وتصفية الثغرات الحقيقية من الإيجابيات الكاذبة.
للحصول على نظرة عامة مفصلة حول البحث والدافع وراء Vulnhalla، راجع مقالة مدونة CyberArk لبحوث التهديدات الرسمية:
Vulnhalla: انتقاء الثغرات الحقيقية من كومة قش CodeQL
قبل البدء، تأكد من أن لديك:
Python 3.10 – 3.13 (يوصى باستخدام Python 3.11 أو 3.12)
CodeQL CLI
codeql موجود في PATH، أو ستقوم بتعيين المسار في .env (انظر الخطوة 2)(اختياري) رمز GitHub API
مفتاح API لـ LLM
كل الإعدادات موجودة في ملف واحد: .env
git clone https://github.com/cyberark/Vulnhalla
cd Vulnhalla
.env.example إلى .env:cp .env.example .env # macOS / Linux
Copy-Item .env.example .env # Windows (PowerShell)
.env واملأ القيم الخاصة بك:مثال لـ OpenAI:
CODEQL_PATH=codeql
GITHUB_TOKEN=ghp_your_token_here
PROVIDER=openai
MODEL=gpt-4o
OPENAI_API_KEY=your-api-key-here
LLM_TEMPERATURE=0.2
LLM_TOP_P=0.2
# اختياري: تكوين التسجيل
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FILE= # اختياري: مسار ملف السجل (مثل logs/vulnhalla.log)
LOG_FORMAT=default # default أو json
# LOG_VERBOSE_CONSOLE=false # إذا كان true، WARNING/ERROR يستخدمان التنسيق الكامل (الطابع الزمني - المسجل - المستوى - الرسالة)
📖 للمرجعية الكاملة للتكوين: انظر مرجع التكوين أدناه لجميع المزودين المدعومين (OpenAI، Azure، Gemini، Bedrock)، والمتغيرات المطلوبة/الاختيارية، والأمثلة التفصيلية.
Windows (PowerShell):
# قائمة إصدارات Python المتاحة
py -0p
# اختر أي إصدار Python مدعوم: 3.10 / 3.11 / 3.12 / 3.13
py -3.12 -m pip install --user -U pipx
py -3.12 -m pipx ensurepath
# أغلق وأعد فتح الطرفية (مطلوب)
pipx install poetry
poetry --version
macOS / Linux:
# تحقق من إصدار Python
python3 --version
# استخدم أي Python مدعوم: 3.10 / 3.11 / 3.12 / 3.13
python3 -m pip install --user -U pipx
python3 -m pipx ensurepath
# أعد تشغيل الطرفية (مطلوب)
pipx install poetry
poetry --version
Windows (PowerShell):
# اختر إصدارًا واحدًا مدعومًا لديك: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # فرض Poetry لاستخدام إصدار Python مدعوم إذا كان لديك عدة إصدارات مثبتة
poetry install
poetry run vulnhalla-setup
macOS / Linux:
# اختر إصدارًا واحدًا مدعومًا لديك: 3.10 / 3.11 / 3.12 / 3.13
poetry env use 3.12 # فرض Poetry لاستخدام إصدار Python مدعوم إذا كان لديك عدة إصدارات مثبتة
poetry install
poetry run vulnhalla-setup
# تحليل مستودع معين، على سبيل المثال:
poetry run vulnhalla redis/redis
# إعادة التنزيل حتى لو كانت قاعدة البيانات موجودة بالفعل
poetry run vulnhalla redis/redis --force
# عرض المساعدة
poetry run vulnhalla --help
هذا سيقوم تلقائيًا بما يلي:
output/results/إذا كان لديك بالفعل قاعدة بيانات CodeQL على القرص (على سبيل المثال، تم إنشاؤها يدويًا أو من تشغيل سابق)، يمكنك تخطي خطوة جلب GitHub باستخدام العلم --local / -l:
Windows (PowerShell):
poetry run vulnhalla --local C:\path\to\my-codeql-db
macOS / Linux:
poetry run vulnhalla --local /path/to/my-codeql-db
ملاحظة: العلم
--localيتوقع دليل قاعدة بيانات CodeQL، وليس مجلد كود مصدر. يمكنك التحقق من ذلك عن طريق التأكد من أن المجلد يحتوي على ملفcodeql-database.yml.
# فتح واجهة المستخدم لعرض النتائج الموجودة (دون تشغيل التحليل)
poetry run vulnhalla-ui
# التحقق من صحة التكوين: CodeQL, LLM, التسجيل (دون تشغيل التحليل)
poetry run vulnhalla-validate
# عرض قائمة المستودعات التي تم تحليلها وأعداد المشكلات فيها
poetry run vulnhalla-list
# تشغيل المسار النموذجي (يحلل videolan/vlc وredis/redis)
poetry run vulnhalla-example
تتضمن Vulnhalla واجهة مستخدم كاملة المواصفات لتصفح واستكشاف نتائج التحليل.
poetry run vulnhalla-ui
تعرض واجهة المستخدم منطقة علوية بلوحين مع شريط تحكم سفلي:
المنطقة العلوية (جنبًا إلى جنب، قابلة لتغيير الحجم):
اللوحة اليسرى (قائمة المشكلات):
اللوحة اليمنى (التفاصيل):
شريط التحكم السفلي:
↑/↓ - التنقل في قائمة المشكلات (صفًا تلو الآخر)Tab / Shift+Tab - تبديل التركيز بين اللوحاتEnter - عرض التفاصيل للمشكلة المحددة/ - تركيز مربع إدخال البحث (في اللوحة اليسرى)Esc - مسح البحث وإعادة التركيز إلى جدول المشكلاتr - إعادة تحميل النتائج من القرص[ / ] - تغيير حجم اللوحات اليسرى/اليمنى (ضبط موضع الانقسام)q - إنهاء التطبيق[ لتحريك الفاصل لليسار، ] لتحريكه لليمينبعد تشغيل المسار، يتم تنظيم النتائج في output/results/<LANG>/<ISSUE_TYPE>/:
output/results/c/Copy_function_using_source_size/
├── 1_raw.json # بيانات مشكلة CodeQL الأصلية
├── 1_final.json # محادثة LLM وتصنيفه
├── 2_raw.json
├── 2_final.json
└── ...
يحتوي كل ملف *_final.json على:
يحتوي كل ملف *_raw.json على:
output/databases/<LANG>/<ORG>/<REPO>)CodeQL CLI غير موجود:
قم بتعيين CODEQL_PATH في ملف .env الخاص بك إلى المسار الكامل لملف CodeQL التنفيذي.
في Windows: يجب أن ينتهي المسار بـ .cmd (مثل C:\path\to\codeql\codeql.cmd).
حدود معدل GitHub:
قم بتعيين GITHUB_TOKEN في ملف .env الخاص بك (احصل على الرمز من https://github.com/settings/tokens).
مشكلات LLM:
تحقق من مفاتيح API الخاصة بك في ملف .env تطابق المزود الذي اخترته.
أخطاء الاستيراد في واجهة المستخدم:
تأكد من أنك تشغل من الدليل الجذر للمشروع، أو استخدم python examples/ui_example.py الذي يتعامل مع إعداد المسار.
يتم إدارة جميع الإعدادات من خلال متغيرات البيئة في ملف .env الخاص بك. إليك المرجع الكامل:
| المتغير | مطلوب لـ | الوصف |
|---|---|---|
CODEQL_PATH | الكل | المسار إلى ملف CodeQL التنفيذي. القيمة الافتراضية هي codeql إذا كان CodeQL في PATH. استخدم المسار الكامل إذا لم يكن في PATH (مثل C:\path\to\codeql\codeql.cmd في Windows) |
PROVIDER | الكل | مزود LLM: openai, azure, gemini, bedrock, anthropic, mistral, groq, openrouter, ollama, إلخ. |
MODEL | الكل | اسم النموذج (على سبيل المثال gpt-4o, gpt-4-turbo, gemini-2.5-flash) |
OpenAI:
| المتغير | الوصف |
|---|---|
OPENAI_API_KEY | مفتاح API الخاص بـ OpenAI من platform.openai.com |
Azure OpenAI:
| المتغير | الوصف |
|---|---|
AZURE_OPENAI_API_KEY أو AZURE_API_KEY | مفتاح API الخاص بـ Azure OpenAI |
AZURE_OPENAI_ENDPOINT أو AZURE_API_BASE | URL نقطة النهاية الخاصة بـ Azure OpenAI (مثل https://your-resource.openai.azure.com) |
AZURE_OPENAI_API_VERSION أو AZURE_API_VERSION | إصدار API (القيمة الافتراضية: 2024-08-01-preview) |
Gemini (Google):
| المتغير | الوصف |
|---|---|
GOOGLE_API_KEY | مفتاح Google API الخاص بك من Google AI Studio |
AWS Bedrock:
| المتغير | مطلوب | الوصف |
|---|---|---|
AWS_REGION_NAME | نعم | منطقة AWS (مثل us-east-1, us-west-2) |
AWS_PROFILE | لا* | اسم ملف تعريف AWS لمصادقة SSO/ملف بيانات الاعتماد |
AWS_ACCESS_KEY_ID | لا* | مفتاح الوصول AWS (إذا كنت لا تستخدم ملف تعريف) |
AWS_SECRET_ACCESS_KEY | لا* | المفتاح السري AWS (إذا كنت لا تستخدم ملف تعريف) |
AWS_SESSION_TOKEN | لا | رمز الجلسة لبيانات اعتماد STS المؤقتة |
* المصادقة: استخدم AWS_PROFILE أو AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (+ AWS_SESSION_TOKEN اختياري لـ STS).
مثال .env لـ Bedrock (SSO):
PROVIDER=bedrock
MODEL=anthropic.claude-3-5-sonnet-20241022-v2:0
AWS_REGION_NAME=us-east-1
AWS_PROFILE=your-profile
⚠️ المتطلبات الأساسية:
- يجب تكوين بيانات اعتماد AWS (SSO، ملف تعريف IAM، أو مفاتيح الوصول) مع أذونات لاستدعاء نماذج Bedrock
- لمستخدمي SSO: قم بتشغيل
aws sso login --profile your-profileقبل استخدام Vulnhalla🔧 هام - اختيار النموذج: عند اختيار نموذج Bedrock، تأكد من أنه يدعم استدعاء الأدوات/الدوال (ليس كل نماذج Bedrock تفعل ذلك). استدعاء الأدوات هو جزء أساسي من تدفق تحليل Vulnhalla، لذا فإن اختيار نموذج متوافق يُحدث فرقًا كبيرًا في الوظائف والنتائج. النماذج المتوافقة تشمل: Claude 3.x، Mistral، أو Cohere Command R.
| المتغير | القيمة الافتراضية | الوصف |
|---|---|---|
GITHUB_TOKEN | - | رمز GitHub API لزيادة حدود المعدل. احصل عليه من GitHub Settings > Tokens |
GITHUB_API_URL | https://api.github.com | URL API GitHub. لـ GitHub Enterprise، قم بتعيينه إلى URL API الخاص بالخادم الخاص بك (مثل https://github.your-company.com/api/v3) |
GITHUB_SSL_VERIFY | true | التحقق من شهادة SSL. قم بتعيينه إلى false لـ GitHub Enterprise مع شهادات موقعة ذاتيًا أو شهادات CA داخلية |
LLM_TEMPERATURE | 0.2 | درجة حرارة LLM (0.0-2.0). الأقل = أكثر حتمية. موصى به: ابقِه عند 0.2 |
LLM_TOP_P | 0.2 | أخذ عينات top-p لـ LLM (0.0-1.0). الأقل = أكثر تركيزًا. موصى به: ابقِه عند 0.2 |
LOG_LEVEL | INFO | مستوى التسجيل: DEBUG, INFO, WARNING, أو ERROR. يتحكم في كثافة إخراج وحدة التحكم |
LOG_FILE | - | مسار اختياري لملف السجل (مثل logs/vulnhalla.log). إذا تم تعيينه، تتم كتابة السجلات في كل من وحدة التحكم والملف. يستخدم تسجيل الملف مستوى DEBUG لمخرجات مفصلة |
LOG_FORMAT | default | نمط تنسيق السجل: default (قابل للقراءة البشرية)، أو json (تنسيق JSON منظم) |
LOG_VERBOSE_CONSOLE | false | إذا كان true، WARNING/ERROR/CRITICAL تستخدم التنسيق الكامل (الطابع الزمني - المسجل - المستوى - الرسالة). الافتراضي: WARNING/ERROR تستخدم التنسيق البسيط (LEVEL - message)، INFO دائمًا بسيط (message فقط) |
THIRD_PARTY_LOG_LEVEL | ERROR | مستوى السجل للمكتبات الخارجية (LiteLLM, urllib3, requests). الخيارات: DEBUG, , , . الافتراضي يثبط معظم ضوضاء الطرف الثالث |
⚠️ هام: لا تزيد
LLM_TEMPERATUREأوLLM_TOP_Pإلا إذا كنت تفهم التأثير تمامًا. القيم المنخفضة تحافظ على استقرار النموذج وحتميته، وهو أمر بالغ الأهمية لتحليل الأمان. قد تؤدي القيم الأعلى إلى عدم اتساق النموذج أو إبداعه أو هلوسة النتائج.
📝 ملاحظة: للحصول على أمثلة إضافية للتكوين، راجع ملف
.env.exampleفي جذر المشروع.
يتحقق Vulnhalla من صحة تكوينك عند بدء التشغيل. إذا كانت المتغيرات المطلوبة مفقودة أو غير صالحة، سترى رسائل خطأ واضحة تشير إلى ما يجب إصلاحه.
أخطاء التحقق الشائعة:
PROVIDER للقيم المدعومة)CODEQL_PATH ولكن الملف غير موجود)يستخدم LLM رموز الحالة التالية:
تقوم واجهة المستخدم بتعيين هذه إلى:
1337 ← "إيجابي حقيقي"1007 ← "إيجابي كاذب"7331 أو 3713 ← "يحتاج إلى مزيد من البيانات"يتضمن المشروع بنية اختبار أساسية باستخدام pytest:
# تشغيل جميع الاختبارات
poetry run pytest
# تشغيل مع إخراج مفصل
poetry run pytest -v
تتضمن مجموعة الاختبارات اختبارات دخان للتحقق من إعداد بنية الاختبار بشكل صحيح.
يستخدم المشروع mypy للتحقق الثابت من الأنواع:
poetry run mypy src
تم تكوين التحقق من الأنواع في pyproject.toml تحت [tool.mypy].
يستخدم التكوين خط أساس محافظ مع تجاوزات لكل وحدة للسماح بالتبني التدريجي.
يتم إدارة التبعيات عبر Poetry في pyproject.toml:
requests - طلبات HTTP لواجهة GitHub APIpySmartDL - مدير تنزيل ذكي لقواعد بيانات CodeQLlitellm - واجهة LLM موحدة تدعم مزودين متعددينpython-dotenv - إدارة متغيرات البيئةPyYAML - تحليل YAML لملفات حزم CodeQLtextual - إطار واجهة مستخدم طرفيةpytest - إطار اختبار (تبعية تطوير)mypy - مدقق أنواع ثابت (تبعية تطوير)يتم تنظيم استعلامات CodeQL في data/queries/<LANG>/:
issues/ - استعلامات اكتشاف مشكلات الأمانtools/ - استعلامات مساعدة (أشجار الدوال، الفئات، المتغيرات العامة، الماكرو)يحتوي كل دليل على ملف qlpack.yml يحدد حزمة CodeQL.
حقوق النشر (ج) 2025 CyberArk Software Ltd. جميع الحقوق محفوظة.
هذا المستودع مرخص بموجب رخصة Apache، الإصدار 2.0 - راجع LICENSE.txt لمزيد من التفاصيل.
نرحب بمساهمات جميع الأنواع لهذا المستودع. للحصول على إرشادات حول كيفية البدء وأوصاف سير عمل التطوير لدينا، يرجى الاطلاع على دليل المساهمة.
يرجى قراءة واتباع مدونة قواعد السلوك. نحن ملتزمون بتوفير بيئة ترحيبية وشاملة لجميع المساهمين.
لا تتردد في الاتصال بنا عبر مشكلات GitHub إذا كان لديك أي طلبات ميزات أو مشكلات في المشروع.
INFOWARNINGERROR