
skill-scanner v2.0.14
ماسح أمني لمهارات الوكيل
Skill Scanner
ماسح أمان بأفضل جهد ممكن لمهارات وكلاء الذكاء الاصطناعي (AI Agent Skills) يكتشف حقن الأوامر (prompt injection)، وسرقة البيانات، وأنماط التعليمات البرمجية الخبيثة. يجمع بين الاكتشاف القائم على الأنماط (YAML + YARA)، وLLM-as-a-judge، وتحليل تدفق البيانات السلوكي لتعظيم تغطية اكتشاف التهديدات المحتملة مع تقليل النتائج الإيجابية الخاطئة.
مهم: يوفر هذا الماسح اكتشافًا بأفضل جهد ممكن، وليس تغطية شاملة أو كاملة. الفحص الذي لا يُرجع أي نتائج لا يضمن أن المهارة خالية من جميع التهديدات. راجع النطاق والقيود أدناه.
يدعم تنسيقات OpenAI Codex Skills وCursor Agent Skills وفقًا لمواصفات Agent Skills. مع خيار --lenient، يقوم أيضًا بفحص التنسيقات غير القياسية مثل .claude/commands/*.md الخاصة بـ Claude Code ومستودعات المهارات المسطحة بتنسيق markdown.
أبرز المزايا
- اكتشاف متعدد المحركات - تحليل ثابت، وتدفق بيانات سلوكي، وتحليل دلالي عبر LLM، وفحص قائم على السحابة لتغطية طبقية بأفضل جهد ممكن
- تصفية النتائج الإيجابية الخاطئة - المحلل الوصفي (Meta-analyzer) يقلل الضوضاء بشكل كبير مع الحفاظ على قدرة الاكتشاف
- جاهز لـ CI/CD - مخرجات SARIF لـ GitHub Code Scanning، وسير عمل GitHub Actions قابل لإعادة الاستخدام، ورموز خروج لفشل البناء
- خطاف Pre-commit - تكامل مع إطار عمل pre-commit القياسي لفحص المهارات قبل كل commit
- قابل للتوسعة - بنية إضافات (plugins) لمحللات مخصصة
انضم إلى Discord الخاص بـ Cisco AI للمناقشة أو مشاركة الملاحظات أو التواصل مع الفريق.
النطاق والقيود
Skill Scanner هو أداة اكتشاف. يحدد أنماط المخاطر المعروفة والمحتملة، لكنه لا يصدّق على الأمان.
القيود الرئيسية:
- عدم وجود نتائج ≠ عدم وجود خطر. الفحص الذي يُرجع "لا توجد نتائج" يشير إلى عدم اكتشاف أنماط تهديد معروفة. لا يضمن أن المهارة آمنة أو غير ضارة أو خالية من الثغرات.
- التغطية غير مكتملة بطبيعتها. يجمع الماسح بين الاكتشاف القائم على التوقيعات، والتحليل الدلالي عبر LLM، وتحليل تدفق البيانات السلوكي، والخدمات السحابية الاختيارية، وحزم القواعد القابلة للتكوين. بينما يحسّن هذا النهج التغطية، لا يمكن لأي أداة آلية اكتشاف كل تقنية، خاصة الهجمات الجديدة أو هجمات اليوم صفر.
- يمكن أن تحدث نتائج إيجابية خاطئة وسلبية خاطئة. أوضاع الإجماع والتحليل الوصفي تقلل الضوضاء، لكن لا يوجد تكوين يلغي جميع التصنيفات غير الصحيحة. اضبط سياسة الفحص وفقًا لتحملك للمخاطر.
- تبقى المراجعة البشرية ضرورية. الفحص الآلي هو أحد مكونات استراتيجية الدفاع المتعمق. يجب أن تقترن عمليات النشر عالية الخطورة أو الإنتاجية بنتائج الماسح مع مراجعة يدوية للكود و/أو نمذجة التهديدات.
التوثيق
| الدليل | الوصف |
|---|---|
| بدء سريع | ابدأ خلال 5 دقائق |
| البنية المعمارية | تصميم النظام ومكوناته |
| تصنيف التهديدات | تصنيف تهديدات AITech الكامل مع أمثلة |
| محلل LLM | تكوين واستخدام LLM |
| المحلل الوصفي | تصفية النتائج الإيجابية الخاطئة وتحديد الأولويات |
| المحلل السلوكي | تفاصيل تحليل تدفق البيانات |
| سياسة الفحص | السياسات المخصصة والإعدادات المسبقة ودليل الضبط |
| مرجع سريع للسياسة | مرجع مضغوط لأقسام السياسة وعناصر التحكم |
| تأليف القواعد | كيفية إضافة قواعد التوقيع وYARA وPython |
| GitHub Actions | سير عمل قابل لإعادة الاستخدام لتكامل CI/CD |
| مرجع API | توثيق REST API |
| دليل التطوير | المساهمة وإعداد التطوير |
التثبيت
المتطلبات الأساسية: Python 3.10+ وuv (موصى به) أو pip
# باستخدام uv (موصى به)
uv pip install cisco-ai-skill-scanner
# باستخدام pip
pip install cisco-ai-skill-scanner
إضافات مزودي السحابة
# دعم AWS Bedrock
pip install cisco-ai-skill-scanner[bedrock]
# دعم Google AI Studio / Gemini
pip install cisco-ai-skill-scanner[google]
# دعم Google Vertex AI
pip install cisco-ai-skill-scanner[vertex]
# دعم Azure OpenAI
pip install cisco-ai-skill-scanner[azure]
# جميع مزودي السحابة
pip install cisco-ai-skill-scanner[all]
بدء سريع
إعداد البيئة (اختياري)
# لمحلل LLM والمحلل الوصفي
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# اختياري: disabled, minimal, low, medium, high, xhigh, أو max
export SKILL_SCANNER_LLM_REASONING_EFFORT="low"
# لفحص الملفات الثنائية عبر VirusTotal
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# لـ Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
المعالج التفاعلي
لست متأكدًا من العلامات التي يجب استخدامها؟ شغّل skill-scanner بدون وسائط لإطلاق المعالج التفاعلي:
skill-scanner
يرشدك المعالج خلال اختيار هدف الفحص والمحللين والسياسة وتنسيق الإخراج، ثم يعرض الأمر المُجمّع قبل تشغيله. مثالي لتعلّم واجهة سطر الأوامر (CLI).
استخدام CLI
# فحص مهارة واحدة (المحللون الأساسيون: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# الفحص مع المحلل السلوكي (تحليل تدفق البيانات)
skill-scanner scan /path/to/skill --use-behavioral
# الفحص مع جميع المحركات
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# الفحص مع المحلل الوصفي لتصفية النتائج الإيجابية الخاطئة
skill-scanner scan /path/to/skill --use-llm --enable-meta
# الفحص مع محلل المشغلات لفحوصات الوصف الغامض
skill-scanner scan /path/to/skill --use-trigger
# تشغيل محلل LLM عدة مرات والاحتفاظ بالنتائج المتفق عليها بالأغلبية
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# فحص مهارات متعددة بشكل متكرر
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# فحص مهارات متعددة مع اكتشاف التداخل بين المهارات
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# فحص مستودع GitHub (اختصار owner/repo أو URL كامل)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# الوضع المتساهل: تحمّل المهارات غير الصالحة بدلاً من الفشل
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# الوضع المتساهل مع تنسيقات المهارات غير القياسية (بدون SKILL.md)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# استخدام اسم ملف بيانات وصفية مخصص بدلاً من SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: فشل البناء إذا تم العثور على تهديدات
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# إنشاء تقرير HTML تفاعلي مع مجموعات ارتباط الهجمات
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# استخدام قواعد YARA مخصصة
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# استخدام تصنيف تهديدات مخصص + ملفات تعيين التهديدات (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# فحص تجزئة VirusTotal مع رفع اختياري للملفات غير المعروفة
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# استخدام إعداد مسبق لسياسة الفحص (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# استخدام ملف سياسة مؤسسية مخصص
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# إنشاء ملف سياسة للتخصيص
skill-scanner generate-policy -o my_org_policy.yaml
# أداة تكوين السياسة التفاعلية (TUI)
skill-scanner configure-policy
يحتفظ وضع الإجماع بالنتيجة فقط عندما تظهر في أكثر من نصف عمليات التشغيل المُهيأة. عندما تختلف تلك الأصوات على مستوى الخطورة، يفوز أعلى مستوى خطورة مُلاحَظ، بغض النظر عن ترتيب الاستجابة. عمليات التشغيل الفاشلة وعمليات التشغيل الناجحة التي تحذف النتيجة لا تُدلي بصوت ولكنها تبقى في المقام. وهذا يجعل اختيار الخطورة مستقرًا للنتائج المتفق عليها بالأغلبية. لا يجعل عينة LLM الفردية حتمية، والحقول الوصفية من أصوات متساوية الخطورة، ومخرجات التشغيل الفردي، والنتائج غير الأغلبية يمكن أن تختلف بين عمليات الفحص.
ملاحظة حول مزود LLM: يقبل --llm-provider حاليًا anthropic أو openai. بالنسبة لـ Bedrock وVertex وAzure وGemini وخلفيات LiteLLM الأخرى، عيّن سلاسل نماذج ومتغيرات بيئة خاصة بالمزود (راجع توثيق محلل LLM).
Python SDK
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# إنشاء الماسح مع المحللين
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# فحص مهارة
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# ملاحظة: is_safe يشير إلى عدم اكتشاف نتائج HIGH/CRITICAL.
# لا يضمن أن المهارة خالية من جميع المخاطر.
if not result.is_safe:
print("Issues detected -- review findings before deployment")
محللات الأمان
| المحلل | طريقة الاكتشاف | النطاق | المتطلبات |
|---|---|---|---|
| Static | أنماط YAML + YARA | جميع الملفات | لا شيء |
| Bytecode | التحقق من سلامة .pyc | Python bytecode | لا شيء |
| Pipeline | تحليل تلوث الأوامر | خطوط أنابيب Shell | لا شيء |
| Behavioral | تحليل تدفق بيانات AST | ملفات Python | لا شيء |
| LLM | تحليل دلالي | SKILL.md + السكربتات | مفتاح API |
| Meta | تصفية النتائج الإيجابية الخاطئة | جميع النتائج | مفتاح API |
| VirusTotal | برمجيات خبيثة قائمة على التجزئة | الملفات الثنائية | مفتاح API |
| AI Defense | ذكاء اصطناعي قائم على السحابة | محتوى نصي | مفتاح API |
خيارات CLI
| الخيار | الوصف |
|---|---|
--policy | سياسة الفحص: اسم إعداد مسبق (strict, balanced, permissive) أو مسار إلى YAML مخصص |
--use-behavioral | تفعيل المحلل السلوكي (تحليل تدفق البيانات) |
--use-llm | تفعيل محلل LLM (يتطلب مفتاح API) |
--llm-provider | مزود LLM لتوجيه CLI: anthropic أو openai |
--llm-consensus-runs N | تشغيل تحليل LLM N مرات، والاحتفاظ بالنتائج المتفق عليها بالأغلبية مع أعلى خطورة مُلاحَظة |
--llm-max-tokens N | الحد الأقصى لرموز الإخراج لاستجابات LLM (الافتراضي: 8192) |
--llm-reasoning-effort LEVEL | عمق الاستدلال الاختياري (disabled, minimal, low, medium, high, xhigh, أو max)؛ عند عدم التعيين يحافظ على الافتراضي الخاص بالمزود |
--use-virustotal | تفعيل ماسح الملفات الثنائية VirusTotal |
--vt-api-key KEY | توفير مفتاح API الخاص بـ VirusTotal مباشرة (اختياري) |
--vt-upload-files | رفع الملفات الثنائية غير المعروفة إلى VirusTotal (اختياري) |
--use-aidefense | تفعيل محلل Cisco AI Defense |
--aidefense-api-url URL | تجاوز عنوان URL الخاص بواجهة برمجة تطبيقات AI Defense (اختياري) |
--use-trigger | تفعيل محلل خصوصية المشغلات |
--enable-meta | تفعيل المحلل الوصفي لتصفية النتائج الإيجابية الخاطئة |
--verbose | تضمين بصمات السياسة لكل نتيجة، وبيانات التكرار المشترك، والاحتفاظ بالنتائج الإيجابية الخاطئة للمحلل الوصفي |
--format | الإخراج: summary, json, markdown, table, sarif, html. ينتج تنسيق html تقريرًا تفاعليًا مكتفيًا بذاته مع مجموعات ارتباط قابلة للطي، ومقتطفات كود قابلة للتوسيع، ومخططات تدفق تلوث خطوط الأنابيب |
--detailed | تضمين النتائج التفصيلية في إخراج Markdown |
--compact | إخراج JSON مضغوط |
--output PATH | مسار ملف الإخراج الافتراضي (يتم تجاوزه بواسطة --output-<fmt>) |
--fail-on-findings | الخروج مع خطأ إذا تم العثور على HIGH/CRITICAL (اختصار لـ --fail-on-severity high) |
--fail-on-severity LEVEL | الخروج مع خطأ إذا كانت النتائج عند LEVEL أو أعلى موجودة (critical, high, medium, low, info) |
--custom-rules PATH | استخدام قواعد YARA مخصصة من دليل |
--taxonomy PATH | تحميل ملف تصنيف تهديدات مخصص (JSON/YAML) لهذا التشغيل |
--threat-mapping PATH | تحميل ملف تعيين تهديدات الماسح المخصص (JSON) لهذا التشغيل |
--lenient | تحمّل المهارات غير الصالحة (فرض الحقول السيئة، وملء الافتراضيات) بدلاً من الفشل. عند غياب SKILL.md، يتراجع إلى فحص ملفات .md في الدليل |
--skill-file FILENAME | اسم ملف بيانات وصفية مخصص لاستخدامه بدلاً من SKILL.md (مثل README.md) |
--check-overlap | (scan-all) تفعيل فحوصات تداخل الأوصاف بين المهارات |
| الأمر | الوصف |
|---|---|
| (بدون أمر) | إطلاق معالج الفحص التفاعلي (عند التشغيل في طرفية) |
interactive | إطلاق معالج الفحص التفاعلي (صريح) |
scan | فحص دليل مهارة واحدة |
scan-all | فحص مهارات متعددة (مع --recursive, --check-overlap) |
generate-policy | إنشاء YAML لسياسة الفحص للتخصيص |
configure-policy | TUI تفاعلي لبناء/تعديل سياسة فحص مخصصة (يدعم --input) |
list-analyzers | عرض المحللين المتاحين |
validate-rules | التحقق من توقيعات القواعد (يدعم --rules-file) |
مثال على الإخراج
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s
ملاحظة: "لا توجد نتائج" تعني أن الماسح لم يكتشف أي أنماط تهديد معروفة -- وهذا ليس ضمانًا بأن المهارة خالية من جميع المخاطر. راجع النطاق والقيود.
GitHub Actions
افحص المهارات تلقائيًا عند كل push أو PR باستخدام سير العمل القابل لإعادة الاستخدام:
# .github/workflows/scan-skills.yml
name: Scan Skills
on:
pull_request:
paths: [".cursor/skills/**"]
jobs:
scan:
uses: cisco-ai-defense/skill-scanner/.github/workflows/scan-skills.yml@main
with:
skill_path: .cursor/skills
permissions:
security-events: write
contents: read
تظهر النتائج كتعليقات توضيحية مضمّنة في PRs عبر GitHub Code Scanning. راجع الدليل الكامل لتكامل LLM وتكوين الأسرار وإعداد حماية الفروع.
خطاف Pre-commit
افحص المهارات قبل كل commit باستخدام إطار عمل pre-commit:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # استخدم أحدث علامة إصدار
hooks:
- id: skill-scanner
أو ثبّت الخطاف المدمج مباشرة:
skill-scanner-pre-commit --install
يربط الخطاف الملفات المتغيرة بأقرب SKILL.md ويفحص كل مهارة متأثرة مرة واحدة. أثناء commit عادي، يقرأ الفرق المُجهز (staged diff). في CI، قارن بين مراجعتين بحيث لا تكون هناك حاجة لفهرس مُجهز:
pre-commit run skill-scanner --from-ref "$BASE_SHA" --to-ref "$HEAD_SHA"
يجب أن توجد كلتا المراجعتين في النسخة المحلية (checkout). لفحص كل مهارة مُهيأة، استدعِ الخطاف مباشرة:
skill-scanner-pre-commit --scan-all
بدلاً من ذلك، قم بتكوين args: [--scan-all] للخطاف في .pre-commit-config.yaml.
المساهمة
نرحب بالمساهمات! يرجى الاطلاع على CONTRIBUTING.md للإرشادات.
الترخيص
Apache 2.0 - راجع LICENSE للتفاصيل.
حقوق النشر 2026 Cisco Systems, Inc. والشركات التابعة لها