
DockSec v2026.9.21
ماسح أمان Docker مدعوم بالذكاء الاصطناعي يشرح الثغرات الأمنية بلغة إنجليزية بسيطة. مشروع معملي من OWASP.
ما هو DockSec؟
DockSec هو مشروع مختبري ضمن OWASP يسد الفجوة بين نتائج الفحص الأمني المعقدة والإصلاحات العملية التي ينفذها المطور. يدمج أدوات الفحص المعيارية في المجال (Trivy وHadolint وDocker Scout) مع الذكاء الاصطناعي لتقديم تحليل أمني مدرك للسياق.
بدلاً من إغراقك بقائمة تضم أكثر من 200 ثغرة CVE، يقوم DockSec بما يلي:
- يرتب الأولويات لما يؤثر فعلاً على إعداد الحاوية الخاص بك.
- يشرح الثغرات بلغة واضحة، وليس فقط بالمصطلحات الأمنية المتخصصة.
- يقترح إصلاحات محددة لملف Dockerfile الخاص بك.
- ينشئ تقارير أمنية احترافية وتفاعلية لفريقك.
كل شيء يُفحص محلياً؛ والشيء الوحيد الذي يغادر جهازك هو محتوى الملف (بعد حجب البيانات السرية) المُرسل إلى مزود الذكاء الاصطناعي الذي تختاره - ومع نموذج محلي أو وضع الفحص فقط، لا يغادر أي شيء على الإطلاق. راجع تدفق البيانات والخصوصية.
كيف يعمل
سير عمل DockSec: من الفحص إلى رؤى قابلة للتنفيذ
يتبع DockSec خط أنابيب من خمس مراحل:
- الفحص: يشغّل Trivy (ثغرات الصورة وسوء إعدادات Dockerfile)، وHadolint، وDocker Scout محلياً على بيئتك.
- ترتيب الأولويات: يرتب كل نتيجة CVE حسب الخطورة مقترنةً باحتمالية استغلالها وفق EPSS، بحيث تكون القائمة مرتبة حسب ما يجب إصلاحه أولاً وليس حسب ما تم اكتشافه أولاً.
- الربط: يكتشف سلاسل الاستغلال حيث تتحد نتائج منفصلة في مسار هجوم واحد - فقاعدة بيانات تحمل بيانات اعتماد يمكن لخدمة مواجهة للإنترنت الوصول إليها تُعد سلسلة، وليست نتيجتين غير مترابطتين. ومع وجود مفتاح API، تمرّ عملية ذكاء اصطناعي على كامل مخرجات الفحص لترتيب ذلك وشرحه وتوسيعه.
- التوصية: ينتج أوامر إصلاح جاهزة للنسخ والتشغيل وتغييرات ملموسة في Dockerfile أو compose، ويوضح عدد النتائج التي تحلها.
- التقرير: يصدّر النتائج القابلة للتنفيذ بصيغ HTML وPDF وJSON وCSV وMarkdown وSARIF وCycloneDX SBOM.
البدء
1. المتطلبات الأساسية
يقوم DockSec بتنسيق أدوات الفحص المحلية، لذا يحتاج إلى:
| المتطلب | مطلوب من أجل | التثبيت |
|---|---|---|
| Python 3.12+ | DockSec نفسه | python.org |
| Trivy | جميع عمليات الفحص (مطلوب) | brew install trivy أو وثائق Trivy |
| Hadolint | فحص Dockerfile | brew install hadolint أو وثائق Hadolint |
| Docker | فحص الصور (-i) | وثائق Docker |
أو دع DockSec يثبّت Trivy وHadolint نيابةً عنك:```bash python -m docksec.setup_external_tools
### 2. تثبيت DockSec```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
3. قم بتشغيل أول فحص لك
لا حاجة لمفتاح API للفحص المحلي:```bash docksec Dockerfile --scan-only
كل فحص ينتهي بملخص للنتائج: جدول درجات الخطورة، ودرجة أمان من 0 إلى 100 مع
تقييم، وكتلة إجراء "Quick take"، والتقارير المُنشأة (المحفوظة افتراضيًا في
`~/.docksec/results/`)، وأمر مقترح للتالي.
### 4. تفعيل تحليل الذكاء الاصطناعي
يشرح تحليل الذكاء الاصطناعي النتائج ويقترح إصلاحات. اختر مزوّدًا، وعيّن مفتاح API الخاص به، ثم شغّل:```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
كل مزود لديه نموذج افتراضي مناسب (OpenAI: gpt-4o، Anthropic:
claude-haiku-4-5، Google: gemini-1.5-pro، Ollama: llama3.1)، لذا فإن --model
اختياري. لتجنب تكرار الأعلام، قم بتعيين متغيرات البيئة (أو ضعها في ملف .env
في الدليل الذي تشغّل منه - يقوم DockSec بتحميله تلقائيًا):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
قبل إرسال أي محتوى إلى مزوّد الذكاء الاصطناعي، تُقنَّع القيم التي تبدو كأسرار (كلمات المرور، الرموز،
مفاتيح API، كتل المفاتيح الخاصة) تلقائيًا. راجع
[تدفق البيانات والخصوصية](#data-flow-and-privacy).
### 5. أو شغّل صورة الحاوية (لا شيء لتثبيته)
الصورة المنشورة تتضمن إصدارات مثبّتة من Trivy وHadolint، لذا لا يوجد
شيء لتثبيته ولا شيء لتهيئته:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_DOCKERFILE=Dockerfile \
-e INPUT_SCAN_ONLY=true \
ghcr.io/owasp/docksec:latest
نُشرت متعددة المعماريات (amd64 وarm64) في كل إصدار. ثبّت على إصدار
محدد (ghcr.io/owasp/docksec:2026.9.21) أو سلسلة فرعية
(ghcr.io/owasp/docksec:2026.9) بدلاً من latest في CI. كل صورة تحمل
شهادة إثبات مصدر البناء:```bash
gh attestation verify oci://ghcr.io/owasp/docksec:latest --repo OWASP/DockSec
تقرأ الصورة نفس متغيرات `INPUT_*` التي تقرأها GitHub Action، لذا يعمل أي مُدخل Action هنا: `INPUT_IMAGE`، `INPUT_COMPOSE`، `INPUT_SEVERITY`، `INPUT_FAIL_ON`، `INPUT_FORMAT`، `INPUT_SARIF`، `INPUT_OUTPUT_DIR`. اكتب التقارير في مكان ما على نقطة التحميل للاحتفاظ بها بعد خروج الحاوية:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_COMPOSE=docker-compose.yml \
-e INPUT_SCAN_ONLY=true \
-e INPUT_FORMAT=json,html \
-e INPUT_OUTPUT_DIR=/github/workspace/docksec-reports \
ghcr.io/owasp/docksec:latest
6. أو استخدم إجراء GitHub```yaml
- name: Run DockSec AI Scanner uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' openai_api_key: ${{ secrets.OPENAI_API_KEY }}
## الأوامر الشائعة```bash
# Scan Dockerfile + Docker image (AI + scanners)
docksec Dockerfile -i myapp:latest
# Scan a Docker Compose file and all its services
docksec --compose docker-compose.yml
# Scan only a Docker image
docksec --image-only -i myapp:latest
# Fast local scan, no AI, no API key
docksec Dockerfile --scan-only
# Choose which severity levels the image scan reports (default: CRITICAL,HIGH)
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
# Fail the build (exit 1) if any finding is HIGH or above
docksec -i myapp:latest --image-only --fail-on high
# Write only the report formats you want, to a directory of your choice
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
# Write a Markdown report for posting directly into a pull request comment
docksec Dockerfile --scan-only --format markdown
# Print results as JSON to stdout for scripts and CI pipelines
docksec -i myapp:latest --image-only --json
# Write a SARIF report for GitHub Code Scanning
docksec Dockerfile --scan-only --sarif
# Write a CycloneDX SBOM of an image for supply-chain tooling
docksec --image-only -i myapp:latest --sbom
# Fully offline scan: local Trivy DB, no network, no AI
docksec --image-only -i myapp:latest --offline
# Save today's findings as a baseline, then only gate on new findings later
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
# Suppress triaged findings with an auditable ignore file
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
# Force a fresh scan, bypassing the results cache
docksec -i myapp:latest --image-only --no-cache
# Install AI-assistant skill files (Claude Code, Cursor, Copilot, and more)
docksec install-skill
# Output control
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only
docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr
docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log
docksec Dockerfile --scan-only --compact-output # shorter per-finding output
docksec Dockerfile --no-color # also honors NO_COLOR
# Apply the mechanical Dockerfile fixes (keeps a .bak, re-scans, shows the delta)
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix
# Rank findings by severity alone, with no EPSS lookup and no network call
docksec Dockerfile --scan-only --no-epss
# Treat a scan that could not complete as a failure, not a pass
docksec Dockerfile --scan-only --fail-on high --incomplete-policy fail
ملف الإعدادات
قم بعمل commit لملف .docksec.yml في جذر المستودع الخاص بك، وسيقوم الفريق بأكمله - وكل مهمة CI - بالفحص وفقًا لنفس السياسة، بدلاً من أن يمرر كل مطور أعلامه الخاصة.```yaml
yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH fail_on: HIGH formats: [json, html] output_dir: ./security-reports
rules: disabled: - compose-missing-healthcheck
كل إعداد اختياري؛ أي شيء تتركه يعود إلى متغير البيئة ثم إلى الإعداد الافتراضي المدمج. يوجد مثال كامل مشروح في
[`examples/.docksec.yml`](https://github.com/owasp/docksec/blob/main/examples/.docksec.yml).
### الأولوية
الأعلى أولوية أولاً:```
CLI flag > environment variable > .docksec.yml > built-in default
لذلك فإن severity: LOW المثبّت لا يزال يُتجاوَز بواسطة --severity CRITICAL على
سطر الأوامر، وبواسطة DOCKSEC_DEFAULT_SEVERITY في البيئة.
الاكتشاف
يبحث DockSec عن .docksec.yml (أو .docksec.yaml) في دليل العمل
ثم يصعد إلى جذر المستودع، بحيث ترث خدمة في دليل فرعي داخل monorepo
السياسة المثبّتة في المستوى الأعلى. يتوقف البحث عند
الدليل الذي يحتوي على .git، لذا لا يلتقط أبدًا ملفًا من خارج
المستودع.
--config FILEيستخدم ملفًا محددًا بدلاً من البحث.--no-configيتجاهل أي ملف إعدادات، من أجل تشغيلات CI قابلة لإعادة الإنتاج.
يُعرض ملف الإعدادات الساري في لافتة الفحص، لذا يتضح دائمًا أي سياسة تم تطبيقها.
الإعدادات
| الإعداد | العلامة المكافئة | ملاحظات |
|---|---|---|
severity | --severity | مستويات الخطورة لفحص الصورة |
fail_on | --fail-on | عتبة بوابة CI |
formats | --format | صيغة القائمة: [json, html] |
output_dir | --output-dir | وجهة التقرير |
provider | --provider | openai، anthropic، google، ollama |
model | --model | اسم النموذج للمزوّد |
offline | --offline | بلا شبكة؛ يتخطى الذكاء الاصطناعي وDocker Scout |
skip_ai_scoring | --skip-ai-scoring | مهمَل ومُتجاهَل؛ التقييم دائمًا حتمي |
no_redact | --no-redact | لا تُخفِ الأسرار قبل استدعاء الذكاء الاصطناعي |
no_cache | --no-cache | تجاوز ذاكرة التخزين المؤقت للفحص |
ignore_file | --ignore-file | مسار ملف التنازل |
baseline | --baseline | مسار ملف خط الأساس |
rules.disabled | - | معرّفات القواعد التي تُعطَّل كليًا |
ملف الإعدادات غير الصالح - مفتاح غير معروف، أو درجة خطورة خاطئة - هو خطأ صارم
يخرج بالرمز 2 بدلاً من أن يكون تحذيرًا، لذا لا يمكن أبدًا لملف سياسة معطوب
أن يتسبب في تشغيل فحص وفق قواعد لم يثبّتها الفريق.
الإكمال التلقائي في المحرر
يمنح التعليق # yaml-language-server: في السطر الأول الإكمال و
التحقق المضمّن في محرري VS Code وJetBrains. المخطط منشور في
docs/docksec-config-schema.json ويمكن
إعادة توليده باستخدام docksec --print-config-schema.
تعطيل القواعد
يُعطّل rules.disabled فحصًا معينًا كليًا، في كل مكان - إذ يُزال
قبل التقييم والتقارير و--json وبوابة --fail-on. استخدمه للفحوصات
التي لا تنطبق على بيئتك. أما النتائج الفردية التي
فرّزها فريقك وقبلها، ففضّل ملف التنازل،
الذي تحمل مدخلاته سببًا وتاريخ انتهاء وبالتالي تبقى قابلة للتدقيق.
تكامل CI/CD
رموز الخروج
يستخدم DockSec رموز خروج ملائمة لـ CI حتى تتمكن عمليات البناء والأصداف من التفاعل مع النتائج:
| الرمز | المعنى |
|---|---|
0 | نجاح، لا توجد نتائج عند --fail-on أو أعلى |
1 | نتائج عند عتبة --fail-on أو أعلى |
2 | خطأ في الاستخدام أو الوسائط |
3 | خطأ في الأداة أو وقت التشغيل (فشل الفحص، الصورة غير موجودة، أدوات مفقودة) |
تُبوّب --fail-on على كل نتيجة مُهيكلة: ثغرات الصورة، وسوء إعدادات Dockerfile،
وسوء إعدادات compose. عندما تكون --fail-on أقل من
--severity المطلوبة، تُوسَّع درجة خطورة الفحص تلقائيًا حتى تتمكن البوابة من
رصد تلك النتائج.
الفحوصات غير المكتملة
إذا تعذّر تشغيل أحد الماسحات، فقد تكون النتائج ناقصة لنتائج بدلاً من كونها
نظيفة فعلاً. يُبلّغ DockSec عن ذلك كفجوة اكتشاف في كتلة Coverage وفي
--json تحت scan_info.completeness. استخدم --incomplete-policy fail للخروج بالرمز 3
في تلك الحالة، حتى لا يتمكن CI من النجاح في فحص لم يكتمل:```bash
docksec Dockerfile --incomplete-policy fail
### الأولوية: ما يجب إصلاحه أولاً
يتم تقييم كل اكتشاف CVE مقابل [EPSS](https://www.first.org/epss/)، الذي
يقدّر احتمال استغلاله خلال الثلاثين يومًا القادمة. ودمج ذلك
مع الخطورة يعطي أربع فئات:
| الفئة | المعنى |
|---|---|
| **أصلح الآن** | خطورة حرجة أو عالية، وضمن أعلى 10% من CVEs من حيث احتمالية الاستغلال |
| **أصلح قريبًا** | خطورة حرجة أو عالية، لكن الاستغلال أقل شيوعًا |
| **راقب** | خطورة أقل، لكنه يُستغل فعليًا |
| **أولوية منخفضة** | خطورة أقل، والاستغلال غير شائع |
هذا هو نداء الشبكة الوحيد الذي يجريه DockSec خارج مرحلة الذكاء الاصطناعي، وهو
ضيق النطاق عمدًا: **يتم إرسال معرّفات CVE فقط** - لا أسماء صور، ولا محتويات ملفات،
ولا مسارات. يتم تخزين النتائج مؤقتًا لمدة 24 ساعة. ويعطّل `--offline` و`--no-epss` ذلك،
وأي فشل يتراجع إلى الترتيب حسب الخطورة فقط بدلاً من إفشال الفحص.
### سلاسل الاستغلال
يعرض العرض لكل خدمة على حدة الاكتشافات واحدًا تلو الآخر. كما يبلّغ DockSec عن المواضع
التي تتحد فيها اكتشافات منفصلة لتشكّل مسار هجوم واحد:```text
Exploit chains
[HIGH] 'web' is internet-facing and can reach 'db' with a committed credential
services: web, db
combines: compose-plaintext-secret-env, compose-no-network-segmentation
'web' accepts connections from outside the host and shares the default
network with 'db'. 'db' is not exposed directly, but its credential is in
the compose file, so compromising 'web' yields authenticated access to it.
Neither service looks critical on its own.
break it: Put 'db' on its own network that 'web' does not join, or move
POSTGRES_PASSWORD to a Docker secret.
اكتشاف السلاسل يعتمد على القواعد، لذا يعمل مع --scan-only، دون اتصال، وبدون
مفتاح API، ويعيد نفس النتيجة في كل تشغيل. تمريرة الذكاء الاصطناعي ترتبها وتوسعها
بدلاً من أن تكون مطلوبة لها. تظهر السلاسل أيضاً في --json تحت
exploit_chains.
راجع دليل سلاسل الاستغلال للقائمة الكاملة و مرجع قواعد compose لكل قاعدة تجمعها.
أوامر الإصلاح
تنتهي عمليات الفحص بأوامر ملموسة بدلاً من قائمة معرفات، وبيان واضح لعدد النتائج التي تحلها:```text Fix commands
apt-get install --only-upgrade -y libgnutls30=3.7.9-2+deb12u7 CRITICAL - 3.7.9-2+deb12u4 -> 3.7.9-2+deb12u7 (CVE-2026-33845 +6)
Dockerfile changes
- [CRITICAL] Move the secret out of ENV; inject it at runtime (line 4)
- [HIGH] Add a non-root USER before CMD/ENTRYPOINT (line 7)
Applying all of the above resolves 37 of 93 finding(s); 56 have no mechanical fix yet.
### مخرجات قابلة للقراءة آليًا
يطبع `--json` كائن JSON واحدًا إلى stdout (معلومات الفحص، والثغرات، وعدد مرات الخطورة، وأي نتائج ذكاء اصطناعي) بدلًا من الملخص القابل للقراءة البشرية، بحيث يمكن تمريره مباشرة إلى أدوات أخرى:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
مع --json وحده، لا تُكتب أي ملفات تقرير؛ اجمعها مع --format لكتابة
الملفات وطباعة JSON في نفس التشغيل. تنتقل جميع الرسائل القابلة للقراءة البشرية إلى stderr في
وضع --json، لذا لا يحتوي stdout أبدًا إلا على حمولة JSON.
تنسيقات التقارير
يقبل --format قائمة مفصولة بفواصل من مخرجات الملفات:
| التنسيق | ما تحصل عليه |
|---|---|
json | ملف .json يحتوي على بيانات وصفية للمسح، وعدد الخطورة، وقائمة الثغرات الكاملة (نفس شكل حمولة stdout الخاصة بـ --json، لكن مكتوبة على القرص). |
csv | جدول .csv بالنتائج (المعرّف، الخطورة، الحزمة، الإصدار، العنوان، والحقول ذات الصلة). |
pdf | ملخص PDF قابل للطباعة مع معلومات المسح، والدرجات، وتفاصيل الثغرات. |
html | تقرير HTML منسّق لتصفح النتائج في المتصفح. |
markdown | تقرير .md يُعرض أصلاً في تعليقات طلبات السحب وملخصات مهام CI. اختياري: لا يُكتب إلا عند طلبه. |
تُكتب json وcsv وpdf وhtml افتراضيًا؛ أضف markdown صراحةً
للحصول عليه.
CSV مع صفر نتائج: إذا لم يُبلّغ المسح عن أي ثغرات لكن csv موجود في قائمة
--format الخاصة بك، فإن DockSec لا يزال يكتب ملف CSV يحتوي فقط على رؤوس الأعمدة.
هذا مقصود (التصدير صالح، وليس كتابة فاشلة) حتى تتمكن الأدوات اللاحقة من
الاعتماد على مخطط مستقر حتى في عمليات المسح النظيفة.
بالنسبة إلى stdout JSON والتمرير إلى أدوات أخرى، راجع مخرجات قابلة للقراءة الآلية
أعلاه. بالنسبة إلى CI وGitHub Code Scanning، استخدم --sarif (راجع القسم التالي)؛ SARIF
منفصل عن --format ويُصدر دائمًا عند طلبه.
مخرجات SARIF لـ GitHub Code Scanning
يكتب --sarif تقرير SARIF 2.1.0 إلى جانب تنسيقات التقارير الأخرى. ارفعه
باستخدام إجراء github/codeql-action/upload-sarif القياسي لرؤية النتائج معلّقة
مباشرةً على طلبات السحب وفي علامة تبويب Security:```yaml
-
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
-
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` مهم: بدونه، يتم تخطي خطوة الرفع كلما تسبب
> `--fail-on` في خروج DockSec بقيمة غير صفرية، مما يفقد النتائج في اللحظة التي
> تكون فيها أكثر أهمية.
### وضع خط الأساس / السقاطة
يتيح لك `--baseline FILE` تبنّي `--fail-on` في مشروع موجود دون جدار من
النتائج الموجودة مسبقًا يعيق كل عملية بناء. شغّل مرة واحدة مع `--update-baseline` لأخذ لقطة
لنتائج اليوم، ثم التزم بملف خط الأساس؛ من ذلك الحين فصاعدًا، يتحكم `--fail-on` فقط في
النتائج غير الموجودة بالفعل في خط الأساس:```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
تُطابَق النتائج حسب معرّف الثغرة والهدف واسم الحزمة، لذا يبقى خط الأساس
صالحًا مع ظهور النتائج غير ذات الصلة واختفائها. أعد التشغيل مع --update-baseline متى أردت
قبول الحالة الحالية كخط الأساس الجديد.
تجاهل النتائج (الإعفاءات)
يُخفي --ignore-file FILE النتائج الفردية التي قام الفريق بفرزها وقبولها.
وعلى عكس خط الأساس (لقطة زمنية)، فإن ملف التجاهل قائمة صريحة
قابلة للمراجعة، حيث يحمل كل إدخال سببًا وتاريخ انتهاء صلاحية اختياريًا.
إذا وُجد ملف .docksec-ignore.yml في الدليل الحالي، فسيتم التقاطه
تلقائيًا.```yaml
.docksec-ignore.yml
ignores:
- id: CVE-2023-45853 # Trivy vulnerability ID or DockSec rule ID reason: "zlib CVE; code path not reachable, vendor fix pending" expires: 2026-12-31 # optional; entry stops applying after this date
- id: compose-missing-healthcheck reason: "healthchecks are handled by the orchestrator"
تُزال النتائج المُثبَّطة (suppressed) قبل التقييم والتقارير ومخرجات `--json` وبوابة `--fail-on`. تتوقف الإدخالات المنتهية الصلاحية عن التطبيق تلقائيًا (مع تحذير)، وتُعلَّم الإدخالات التي تفتقر إلى سبب لتبقى حالات الإعفاء قابلة للتدقيق. أضف الملف إلى نظام التحكم في الإصدارات حتى تخضع حالات التثبيط للمراجعة مثل أي تغيير آخر.
---
## التقارير
### صيغ التقارير
بشكل افتراضي، يكتب كل فحص أربعة ملفات تقارير؛ استخدم `--format` لاختيار مجموعة فرعية:
- **html**: تقرير ويب تفاعلي ومرتب بصريًا: بطاقات الخطورة، وتقييم الدرجة، وجدول كامل للثغرات مع الإصدارات المُصلَّحة، ونتائج الذكاء الاصطناعي الكاملة.
- **pdf**: مستند محمول جاهز للعرض.
- **json**: بيانات فحص كاملة قابلة للقراءة آليًا (بنفس شكل مخرجات `--json` على stdout).
- **csv**: جدول جاهز للجداول الحسابية للثغرات الفردية.
- **markdown**: تقرير خفيف وقابل للقراءة (ملخص الخطورة + جدول الثغرات مع الإصدارات المُصلَّحة) يُعرض أصليًا في تعليقات طلبات السحب وملخصات مهام CI. اختياري: أضف `markdown` إلى `--format`؛ فهو لا يُكتب افتراضيًا.
> ملاحظة حول سلوك CSV: عند عدم وجود ثغرات، لا يزال DockSec يكتب ملف CSV
> يحتوي على الترويسة فقط (أسماء الأعمدة، بدون صفوف) حتى لا تتعطل الأتمتة اللاحقة أبدًا
> بسبب ملف مفقود أو فارغ. هذا مقصود.
### CycloneDX SBOM
يكتب `--sbom` قائمة مكونات برمجية بصيغة CycloneDX (`<image>.cdx.json`) للصورة
المفحوصة، مع سرد كل مكوّن حزمة بالإضافة إلى الثغرات المعروفة. تُنتَج قائمة المكونات
بواسطة مُصدِّر Trivy الأصلي (لذا فهي متوافقة مع المواصفات) ويطبع DockSec نفسه
في بيانات تعريف الأداة. أدخلها في Dependency-Track، أو رسم بياني للتبعيات من GitHub، أو أي
مستهلك آخر لـ SBOM:```bash
docksec --image-only -i myapp:latest --sbom
--sbom يحتاج إلى صورة واحدة (-i)، لذا يتم تخطيه في تشغيلات compose. مثل --sarif،
فهو مستقل عن --format.
تدفق البيانات والخصوصية
صُمم DockSec بحيث تعرف دائمًا ما يغادر جهازك:
- الفحص محلي بالكامل. يعمل Trivy وHadolint ودرجة الأمان على جهازك. لا يتم رفع محتويات الصورة إلى أي مكان بواسطة DockSec.
- تحليل الذكاء الاصطناعي يرسل الملف المفحوص فقط. عند تشغيل تمريرة الذكاء الاصطناعي، يُرسل محتوى Dockerfile أو ملف compose (إضافة إلى ملخص قصير لأعداد الثغرات لأغراض التقييم) إلى مزود LLM الذي قمت بتكوينه. لا يُنقل أي شيء آخر.
- يتم حجب الأسرار قبل مغادرتها. القيم التي تبدو كأسرار (كلمات المرور،
الرموز، مفاتيح API، كتل المفاتيح الخاصة) في الملف يتم إخفاؤها قبل إرسال المحتوى
إلى مزود الذكاء الاصطناعي. تبقى أسماء المفاتيح ظاهرة حتى تظل بيانات الاعتماد المكشوفة
مُعلَّمة. استخدم
--no-redactلإلغاء ذلك. - الذكاء الاصطناعي المحلي بالكامل مدعوم. استخدم
--provider ollamaلإبقاء تحليل الذكاء الاصطناعي على أجهزتك الخاصة، أو--scan-only/--offlineلتخطي الذكاء الاصطناعي تمامًا. - لا توجد قياسات عن بُعد. لا يجمع DockSec أي بيانات استخدام ولا يتصل بأي شيء.
وضع عدم الاتصال
يشغّل --offline فحصًا بدون وصول إلى الشبكة. يستخدم قاعدة بيانات ثغرات Trivy
الموجودة بالفعل على القرص (بدون تحديث قاعدة البيانات) ويتخطى تحليل الذكاء الاصطناعي والفحص
المتقدم من Docker Scout، وكلاهما يتطلب الشبكة. هذه أبسط طريقة للفحص في بيئة معزولة
أو مقيّدة:```bash
docksec --image-only -i myapp:latest --offline
تأكد من تنزيل قاعدة بيانات Trivy مرة واحدة على الأقل (أي فحص عبر الإنترنت سابق
يقوم بذلك) قبل الاعتماد على `--offline`.
### ذاكرة التخزين المؤقت لنتائج الفحص
يتم تخزين نتائج فحص الصور مؤقتًا (الافتراضي: 24 ساعة، يمكن تجاوزه باستخدام
`DOCKSEC_CACHE_TTL_HOURS`) وتُربط ببصمة محتوى الصورة (content digest)، لذا فإن وسمًا
أُعيد بناؤه مثل `:latest` المُعاد استخدامه يحصل دائمًا على فحص جديد. استخدم `--no-cache` (أو
`DOCKSEC_USE_CACHE=false`) لتجاوز ذاكرة التخزين المؤقت لتشغيل واحد.
### سحب الصور غير الموجودة محليًا
فحص صورة غير موجودة محليًا يؤدي إلى سحبها أولًا. غالبًا ما تُسمّي حزمة compose
صورًا لم تسحبها الآلة قط، وبدون ذلك يُبلَّغ عن كل واحدة
من تلك الخدمات على أنها غير مفحوصة.
اضبط `DOCKSEC_PULL_MISSING_IMAGES=false` لإيقاف هذا والفشل بدلًا من ذلك، وهو أمر
يستحق القيام به على اتصال محدود البيانات أو على runner مشترك. لا يقوم `--offline` أبدًا
بالسحب، بغض النظر عن هذا الإعداد.
---
## مهارات مساعد الذكاء الاصطناعي (`install-skill`)
يكتب `docksec install-skill` تعليمات استخدام DockSec في ملفات السياق
المعروفة لمساعدي البرمجة بالذكاء الاصطناعي الشائعين، حتى يعرف المساعد العامل في مستودعك كيفية
استدعاء DockSec:```bash
docksec install-skill
هذا يُنشئ أو يُحدّث:
.claude/commands/docksec.md(أمر الشرطة المائلة/docksecفي Claude Code).cursor/rules/docksec.mdc(Cursor)AGENTS.md(Codex CLI)،GEMINI.md(Gemini CLI).github/copilot-instructions.md(GitHub Copilot)
الملفات نصية عادية يمكنك مراجعتها وإيداعها؛ لا يتم تنفيذ أي شيء. إعادة تشغيل الأمر تُحدّث قسم DockSec في مكانه بدلاً من تكراره.
الميزات
- تحليل ذكي: يشرح الذكاء الاصطناعي ما تعنيه الثغرات لـإعدادك المحدد.
- دعم نماذج لغوية متعددة: OpenAI، أو Anthropic Claude، أو Google Gemini، أو نماذج محلية عبر Ollama.
- الخصوصية أولاً: يتم حجب قيم الأسرار قبل وصول أي محتوى إلى مزوّد الذكاء الاصطناعي، والفحص محلي بالكامل، ولا توجد أي قياسات عن بُعد.
- فحص Docker Compose: اكتشاف الأخطاء في إعدادات التنسيق وفحص جميع الخدمات في ملف compose.
- تكامل عميق: يجمع بين Trivy (الثغرات)، وHadolint (فحص الشيفرة)، وDocker Scout.
- تقييم أمني: درجة من 0 إلى 100 مع تصنيف لتتبّع وضعك الأمني بمرور الوقت.
- صيغ غنية: HTML (تفاعلي)، وPDF، وJSON، وCSV، وSARIF، وCycloneDX SBOM.
- جاهز لـ CI/CD: رموز خروج
--fail-on، ووضع baseline/ratchet، وإعفاءات قابلة للتدقيق، وJSON إلى stdout، وإجراء GitHub Action على Marketplace. - وضع عدم الاتصال: الفحص بالكامل في بيئة معزولة (
--offline) باستخدام قاعدة بيانات Trivy المحلية. - مهارات مساعد الذكاء الاصطناعي: يعلّم
docksec install-skillكلاً من Claude Code وCursor وCopilot وغيرها كيفية تشغيل DockSec في مستودعك.
كيف تقارن DockSec
| القدرة | DockSec | Trivy (مستقل) | Snyk Container | Aikido |
|---|---|---|---|---|
| الترخيص والتكلفة | مجاني، مفتوح المصدر (MIT) | مجاني، مفتوح المصدر (Apache 2.0) | تجاري (طبقة مجانية محدودة) | تجاري (طبقة مجانية محدودة) |
| الحوكمة | مشروع OWASP Lab، محايد تجاه الموردين | مفتوح المصدر، تديره Aqua | مورّد واحد | مورّد واحد |
| اكتشاف CVEs وأخطاء إعداد Dockerfile | نعم | نعم | نعم | نعم |
| شرح النتائج بلغة واضحة | نعم (سياق وتأثير مكتوبان بالذكاء الاصطناعي) | لا (بيانات CVE خام) | جزئي (تلميحات الخطورة والإصلاح) | جزئي (ملخصات ذكاء اصطناعي في المنصة) |
| معالجة سياقية لـ Dockerfile | نعم (إعادات كتابة محددة مع شرح) | لا (اكتشاف فقط) | نعم (نصائح ترقية الصورة الأساسية، طلبات سحب الإصلاح) | نعم (طلبات سحب AI AutoFix) |
| فحص Docker Compose (متعدد الخدمات) | نعم (فحوصات التنسيق وفحص لكل خدمة) | جزئي (فحص الإعداد، دون توزيع لكل خدمة) | جزئي | جزئي |
| وضع Baseline / ratchet (الفشل فقط عند النتائج الجديدة) | نعم | لا | جزئي (سياسات المنصة) | جزئي (سياسات المنصة) |
| إعفاءات قابلة للتدقيق لكل نتيجة مع الأسباب وتاريخ الانتهاء | نعم | جزئي (.trivyignore، دون فرض الأسباب) | جزئي (سياسات المنصة) | جزئي (سياسات المنصة) |
| مخرجات أصلية لـ CI (SARIF لـ GitHub Code Scanning) | نعم | نعم | نعم | نعم |
| تصدير SBOM (CycloneDX) | نعم (--sbom) | نعم | نعم | نعم |
| تثبيت مهارة مساعد الذكاء الاصطناعي (Claude Code، Cursor، Copilot) | نعم (install-skill) | لا | لا | لا |
| يعمل بالكامل دون اتصال / في بيئة معزولة | نعم (نموذج لغوي محلي عبر Ollama، وضع الفحص فقط، دون مفتاح API) | الفحص فقط (دون طبقة معالجة) | لا (منصة سحابية) | لا (منصة مستضافة) |
| بيانات صورتك تبقى على شبكتك | نعم | نعم | لا | لا |
| إحضار نموذجك اللغوي / اختيار النموذج | نعم (OpenAI، أو Anthropic، أو Gemini، أو Ollama المحلي) | لا ينطبق | لا (ذكاء اصطناعي خاص) | لا (ذكاء اصطناعي خاص) |
| قابلية الاستضافة الذاتية، دون نشر منصة | نعم | نعم | لا | لا |
| الارتباط بالمورّد | لا يوجد | لا يوجد | نعم | نعم |
| تقييم أمني (0-100) وتقارير متعددة الصيغ | نعم | جزئي (صيغ آلية، دون تقرير معالجة) | جزئي (تقارير لوحة التحكم) | جزئي (تقارير لوحة التحكم) |
DockSec هو الوحيد من بين هذه الذي يجمع بين المعالجة السياقية لـ Dockerfile وتصميم مفتوح المصدر بالكامل، ومحكوم من OWASP، وقابل للتشغيل محلياً. يقدّم Snyk وAikido معالجة قادرة بالذكاء الاصطناعي، لكن فقط كمنصات سحابية تجارية ترسل بياناتك إلى خدمتها. Trivy مفتوح المصدر ومحلي لكنه يتوقف عند الاكتشاف ولا يساعدك في إصلاح أي شيء. يسدّ DockSec الفجوة للمطورين وللفرق الخاضعة للتنظيم أو المعزولة التي تحتاج إلى إرشادات الإصلاح والتحكم الكامل في بياناتها، دون أي تكلفة.
تطبيق الإصلاحات تلقائياً
يطبّق --fix المجموعة الميكانيكية من تغييرات Dockerfile المقترحة،
ويعيد الفحص، ويبلّغ عن الفرق:```bash
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix # apply, keeping a .bak
## ما الجديد
- إضافة دعم لـ `--proxy` في `nuclei`
- إصلاح مشكلة في `httpx` عند استخدام `-json` مع `-silent`
- تحسين أداء `subfinder` عند استخدام مصادر متعددة
- تحديث قوالب `nuclei` إلى الإصدار الأخير
## التثبيت
```bash
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
الاستخدام
nuclei -u https://example.com -t cves/
الترخيص
هذا المشروع مرخص تحت رخصة MIT. راجع ملف LICENSE لمزيد من التفاصيل.```text Applied 4 change(s)
- added --no-install-recommends on line(s) 2 [DS029]
- converted ADD to COPY on line(s) 3 [DL3020]
- replaced 'USER root' with 'USER appuser' on line 5 [DS002]
- inserted a placeholder HEALTHCHECK before line 6 [DS026]
Original saved to Dockerfile.bak Dockerfile findings: 7 -> 2 (5 resolved)
إنه متحفظ عن قصد. لن يختار إصدار صورة أساسية، أو ينقل سرًا، أو يحوّل `ADD` الذي يجلب عنوان URL أو يفك ضغط أرشيف، أو يعدّل ملف compose - يتم الإبلاغ عن تلك بدلاً من ذلك ضمن "Needs review". كما يرفض تعديل ملف يحتوي على تغييرات غير مُثبَّتة إلا إذا تم تمرير `--force`، بحيث يكون git دائمًا في وضع يسمح بالتراجع عن التغيير.
## Documentation
| Guide | What it covers |
| --- | --- |
| [Evaluation guide](https://github.com/owasp/docksec/blob/main/docs/evaluation-guide.md) | 15-minute assessment, including what DockSec does *not* do |
| [Exploit chains](https://github.com/owasp/docksec/blob/main/docs/exploit-chains.md) | Cross-service attack paths, and their limits |
| [Compose rule reference](https://github.com/owasp/docksec/blob/main/docs/rules/README.md) | All 17 rules: what each catches, and when keeping it is reasonable |
| [CI integration](https://github.com/owasp/docksec/blob/main/docs/ci/README.md) | Jenkins, GitLab, Azure Pipelines, pre-commit |
| [Examples](https://github.com/owasp/docksec/blob/main/examples/README.md) | Ten Dockerfiles and compose stacks with their expected findings |
| [Case studies](https://github.com/owasp/docksec/blob/main/docs/case-studies/README.md) | Real scans of official images, with the numbers |
## Roadmap
راجع [ROADMAP.md](https://github.com/owasp/docksec/blob/main/ROADMAP.md) لمعرفة إلى أين يتجه DockSec: فحص السجلات (registry) دون خادم Docker محلي، وملف تكوين سياسات على مستوى المستودع، وقوالب Jenkins/GitLab/Azure DevOps، وصورة حاوية رسمية، وفحص Kubernetes وHelm، والمزيد. نرحب بالملاحظات والتصويت على الأولويات في
[issues](https://github.com/OWASP/DockSec/issues) وعلى
[OWASP Slack](https://owasp.slack.com/archives/C0APXGCUW7M).
---
## Contributing
يزدهر DockSec بمساهمات المجتمع. سواء كنت مطورًا أو مصممًا أو متحمسًا للأمن، فهناك طرق عديدة للمشاركة:
- **Code Contributions**: إصلاح الأخطاء أو إضافة ميزات جديدة.
- **Documentation**: تحسين الأدلة أو إنشاء دروس تعليمية.
- **Issue Reporting**: تحديد الأخطاء والإبلاغ عنها.
- **Feedback**: شارك تجربتك واقتراحاتك.
للبدء، اطّلع على [Contributing Guidelines](https://github.com/owasp/docksec/blob/main/CONTRIBUTING.md) و[Code of Conduct](https://github.com/owasp/docksec/blob/main/CODE_OF_CONDUCT.md) و[Sponsorship Guide](https://github.com/owasp/docksec/blob/main/SPONSORSHIP.md).
---
## Leaders and Community
يقود DockSec فريق مخصص ملتزم بجعل أمن الحاويات في متناول الجميع:
- [Advait Patel](https://github.com/advaitpatel) - Project Lead
- [Arkadii Yakovets](https://github.com/arkid15r) - Project Co-lead
تجدنا هنا:
- **OWASP Project Page**: [owasp.org/DockSec/](https://owasp.org/DockSec/)
- **OWASP Slack**: [#project-docksec](https://owasp.slack.com/archives/C0APXGCUW7M)
- **PyPI**: [pypi.org/project/docksec/](https://pypi.org/project/docksec/)
- **Issues**: [Report a bug](https://github.com/OWASP/DockSec/issues)
- **Changelog**: [CHANGELOG.md](https://github.com/owasp/docksec/blob/main/CHANGELOG.md)
---
<div align="center">
<strong>If DockSec helps you, star the repo to help others discover it.</strong><br>
Built by <a href="https://github.com/advaitpatel">Advait Patel</a> and the OWASP community.
</div>