
SecureAI-Scan v0.6.0
SecureAI-Scan هي أداة سطر أوامر تفحص قواعد بيانات TypeScript و JavaScript بحثًا عن مشكلات أمنية خاصة بالتطبيقات المدعومة بالذكاء الاصطناعي — حقن البرومبت، إساءة استخدام أدوات MCP، تسميم بيانات RAG، انتهاكات ثقة الوكلاء، والمزيد.
SecureAI-Scan
ماسح الأمان الذكي الذي يُثبت نتائجه.
يكتشف SecureAI-Scan ثغرات LLM وMCP وAgent Skill وRAG في TypeScript وJavaScript وPython — ويعرض لك الدليل: مسار المصدر ← التدفق ← نقطة الوصول الدقيق لكل نتيجة تحليل تدفق بيانات، مُحلّلاً عبر الاستيرادات الفعلية، وليس مجرد مطابقة كلمات.
يوفر دعمًا فوريًا عند الإطلاق لقائمة OWASP Top 10 لتطبيقات LLM 2026 الرسمية، إلى جانب Top 10 للتطبيقات الوكيلة (2026) وMCP Top 10. يميّز كل نموذج تهديد بين التغطية الثابتة والمخاوف المتعلقة بوقت التشغيل.
ابدأ خلال 30 ثانية```bash
npx --yes [email protected] scan .
لا يتطلب حسابًا أو رفعًا سحابيًا أو مترجم بايثون أو أي إعداد. يتم اكتشاف TypeScript وJavaScript وPython وإعدادات MCP وحزم Agent Skill تلقائيًا.
**مرشح الإصدار `0.9.0` المُقاس:** 136/136 اختبارًا · تغطية جمل 88.08% · 12,676 ملفًا عبر 9 مستودعات عامة · 0 بصمة جديدة من الطبقة الافتراضية مقابل خط الأساس المُستعرض. [الأدلة](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/benchmarks/v0.9.0.json) · [المنهجية والقيود](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/ReleaseAssurance.md)```
▌ HIGH AI001 Prompt injection via user input
PROVEN LLM01:2026 Prompt Injection
source src/chat.ts:8 request data `req.body.input`
flow src/chat.ts:13 passed as `systemPrompt`
sink src/chat.ts:10 openai.chat.completions.create — system role (OpenAI)
fix Keep system prompts static; pass user input as a user-role message.
هل هذا مناسب لك؟ تم تصميم SecureAI-Scan عمدًا ليشمل مخاطر LLM وMCP وRAG/الوكلاء — حقن البرومبت (prompt injection)، تسميم الأدوات (tool poisoning)، المعالجة غير الآمنة للمخرجات، التحكم في الوصول إلى مخزن المتجهات، تسميم مهارات الوكلاء. إنه ليس ماسح SAST عامًا أو ماسح أسرار، ولا يحاول أن يكون كذلك؛ أي حزمة معروفة بأنها خبيثة بدون حمولة على شكل LLM (مثل عنوان استخراج بيانات مكتوب بشكل ثابت في استدعاء واجهة برمجة تطبيقات بريد إلكتروني) يتم اكتشافها بواسطة قائمة الاستشارات دون اتصال (DEP003)، وليس بواسطة قاعدة نمطية. إذا كانت قاعدة التعليمات البرمجية لديك تتفاعل مع LLM، أو خادم MCP، أو مخزن متجهات، أو تشحن مهارات وكيل، فهذه الأداة مصممة لك.
المحتويات
- لماذا يختلف هذا الماسح
- كيف يقارن بالآخرين
- ابدأ خلال 30 ثانية
- شاهده يعمل
- الأوامر
- إجراء GitHub
- القواعد
- البنية المعمارية
- خادم MCP (استخدمه من Claude)
- مهارة Claude
- الثقة وضمان الإصدار
- عقد الدقة
- الاختبار والمقارنة المعيارية
- خارطة الطريق
- المساهمة
لماذا يختلف هذا الماسح
- مستويات الأدلة، ليست ضجيجًا. كل اكتشاف هو
proven(تدفق بيانات مُتتبَّع أو حقيقة إعداد مُحلَّلة)، أوlikely(وجهة مؤكدة، خطوة استدلالية واحدة)، أوheuristic. الفحص الافتراضي يُظهر فقطproven+likely. الاستدلالات اختيارية عبر--paranoid. - كشف يعتمد على حلّ الاستيراد. لا يُعتبر الاستدعاء "استدعاء LLM" إلا إذا حُلَّ إلى استيراد SDK حقيقي (
openai,@anthropic-ai/sdk,ai,@google/genai, LangChain, Bedrock, …). لن يتم الإبلاغ عن عميل Google Maps الخاص بك كـ LLM مجددًا. - مقيّد بالدقة، ومُقيَّم بمقارنة مع مستودعات حقيقية. تؤكد مجموعة الاختبارات أن كل كيان اختبار ضعيف يُطلق اكتشافًا و أن كل كيان آمن يبقى نظيفًا — وأي نتيجة إيجابية خاطئة على المجموعة الآمنة تُفشل البناء. بعد ذلك، يفحص
npm run regressionمستودعات عامة حقيقية (OpenAI/Anthropic/Vercel AI SDKs، خوادم MCP الرسمية، LlamaIndex) مقابل خط أساس مُلتزم به ومُراجع يدويًا، ويفشل عند أي اكتشاف جديد من نوعproven/likely. راجع الاختبار والمقارنة المعيارية للأرقام الفعلية قبل وبعد، أو ما وجدناه عند فحص مستودعات حقيقية للقصة وراءها — معدل التقاط 6/6 على مجموعة مهارات خبيثة مُصنَّفة، ولماذا لن نسمي llama_index "ضعيفة" بسبب اكتشاف صادق على مستوى المكتبة. - SARIF لفحص كود GitHub. يضع
--output report.sarifالاكتشافات داخل طلبات السحب وفي تبويب Security. - AI-BOM. ينشئ
secureai-scan bom .جردًا مشتقًا من البنية النحوية لـ SDKs، ومعرّفات النماذج، ومخازن المتجهات، وأُطر الوكلاء، وخوادم MCP، مُربوطة باحتياجات توثيق OWASP LLM Top 10 / EU AI Act. - فحص إعدادات MCP. يوزّع
.mcp.json,claude_desktop_config.json,.cursor/mcp.json: خوادمnpx -yغير مثبتة على إصدار محدد، أسرار مضمّنة، ونقل HTTP بنص عادي. - كشف تسميم أدوات MCP. يلتقط النمط وراء عملية rug-pull في WhatsApp MCP والبوابة الخلفية postmark-mcp — رموز Unicode غير مرئية، وعبارات حقن موجّهة للوكيل، وتظليل عبر الأدوات في أسماء/أوصاف الأدوات، بشكل ثابت، قبل تشغيل الخادم أبدًا.
- كشف حقن الأوامر في MCP. يعلّم على
command/argsلنقل stdio في MCP المُبنية من بيانات الطلب — النمط وراء إفصاح 2026 عن ثغرة RCE في MCP STDIO. - كشف تسميم مهارات الوكلاء. نفس فحوصات Unicode غير المرئية، وعبارات الحقن، والتظليل تُطبَّق على ملفات
SKILL.md— تُحمَّل مهارات الوكلاء في السياق بالكامل، لذا فالمهارة المسمومة هي وصف أداة مسموم باسم آخر. - فحص مهارات مقاوم للتهرب. تُفحص حزم المهارات كـ مجلدات، وليس فقط ملفات
SKILL.mdالخاصة بها، ويُجرى كل فحص محتوى على نسخ مُزالة الإبهام من النص. يستهدف هذا التقنيات المنشورة — homoglyphs (أشكال متشابهة)، تقسيم بعرض صفر، حمولات موضوعة في.git/أوbuild/، استخراج بيانات مخفي في ملف*.test.ts— التي تجاوزت أكثر من 90% من الماسحات التسعة التي شملتها دراسة Cloak and Detonate (arXiv:2607.02357). راجع مقاومة التهرب. - استشارات الحزم المعروفة بأنها ضعيفة أو خبيثة، واعية بالإصدار. يفحص كل تبعية وكل حزمة تُطلق عبر MCP مقابل لقطة استشارات مرفقة — قائمة مُنسقة يدويًا من البوابات الخلفية الموثقة في البرية، بالإضافة إلى استشارات OSV بمستوى HIGH/CRITICAL لقائمة مراقبة حزم LLM/MCP/RAG، يُعاد توليدها بواسطة
scripts/sync-advisories.js. يعمل دون اتصال في كل فحص، دون الحاجة إلى أي علامة (flag). لا يُطلق CVE إلا عندما يكون إصدارك المثبت بشكل مؤكد داخل النطاق المتأثر؛ أما الحزمة الموثقة كخبيثة فتُطلق حتى على نطاق غامض، لأن تثبيت بوابة خلفية لا يمكن التراجع عنه. - محلي أولًا. لا يغادر أي شيء جهازك.
كيف يقارن بالآخرين
SecureAI-Scan ليس بديلًا عن أداة SAST عامة أو ماسح حاويات/بنية تحتية كرمز (IaC) — شغّله إلى جانبها، وليس بدلًا منها. صُمم خصيصًا لسطح الهجوم الخاص بـ LLM/MCP/RAG ويُركز على أدلة تدفق البيانات بدلًا من اكتشافات الكلمات المفتاحية المسطحة.
| SecureAI-Scan | Semgrep (OSS rules) | Trivy | GitHub Advanced Security | |
|---|---|---|---|---|
| حقن البرومبت (تتبّع المصدر→الوجهة) | ✅ تدفق بيانات مُحلَّل عبر الاستيراد | ⚠️ قواعد نمطية فقط، مُصانة من المجتمع | ❌ | ⚠️ CodeQL يمكنه ذلك، لكن لا توجد مجموعة قواعد خاصة بالذكاء الاصطناعي |
| تسميم أدوات MCP / مخاطر الإعدادات | ✅ MCP007–010، ماسح إعدادات | ❌ | ❌ | ❌ |
تسميم مهارات الوكلاء (SKILL.md) | ✅ مقاوم للتهرب، واعٍ بالحزم | ❌ | ❌ | ❌ |
| إعدادات خاطئة في RAG / مخزن المتجهات | ✅ VEC001–004 | ❌ | ❌ | ❌ |
| استشارات حزم الذكاء الاصطناعي المعروفة بأنها خبيثة | ✅ DEP003، دون اتصال، واعٍ بالإصدار | ❌ | ⚠️ موجز CVE عام، غير خاص بالذكاء الاصطناعي | ⚠️ Dependabot، موجز CVE عام |
| SAST عام (SQLi، XSS، اجتياز المسار) | ❌ خارج النطاق بحكم التصميم | ✅ | ❌ | ✅ |
| فحص الحاويات / البنية التحتية كرمز (IaC) | ❌ | ❌ | ✅ | ⚠️ عبر CodeQL/Actions |
| مستويات الأدلة (proven/likely/heuristic) | ✅ | ❌ الاكتشافات مسطحة | ❌ | ⚠️ CodeQL لديه بعضها، لكن غير مضبوطة للذكاء الاصطناعي |
| مخرجات SARIF (فحص كود GitHub) | ✅ | ✅ | ✅ | ✅ أصلي (native) |
| يعمل دون اتصال، بدون حساب | ✅ | ✅ (قواعد OSS) | ✅ | ❌ يتطلب GitHub |
إذا كنت تشغّل بالفعل Semgrep أو GHAS، فأبقِ عليهما — وأضف SecureAI-Scan لسطح المخاطر الذي لا يُغطّيانه على الإطلاق.
تفضّل طرح الأسئلة أولًا؟ جرّب مستشار أمان SecureAI-Scan المجاني على ChatGPT.
على وشك تشغيل خادم MCP وجدته على GitHub أو Twitter؟ الصق وصف أداته في MCP X-Ray أولًا — يفحصه بحثًا عن Unicode مخفي، وتعليمات محقونة، وحزم معروفة بأنها خبيثة في متصفحك، دون تثبيت.
شاهدها تعمل
أشكال الهجوم التي يتتبّعها الماسح من البداية إلى النهاية:
| تدفق بيانات تسميم أدوات MCP | تدفق بيانات حقن السياق في RAG |
|---|---|
![]() | ![]() |
الأوامر
الذي ستحتاجه 95% من الوقت:```bash secureai-scan scan .
كل شيء آخر موجود عندما تحتاج إليه. يعرض `secureai-scan scan . --help` كل هذا في الطرفية، مجمّعًا بنفس الطريقة:
**الاستخدام اليومي**
| الخيار | الوظيفة |
|------|---------------|
| *(none)* | اكتشافات `proven` + `likely` — الافتراضي، لا حاجة لأي خيارات |
| `--paranoid` | يشمل أيضًا اكتشافات فئة `heuristic` |
| `-s, --severity <level>` | اعرض فقط الاكتشافات عند مستوى `low`\|`medium`\|`high`\|`critical` أو أعلى |
| `--output <file>` | اكتب تقريرًا كاملًا — `.sarif` (فحص أكواد GitHub)، `.json`، `.md`، أو `.html` |
**نطاق القواعد التي سيتم تشغيلها**
| الخيار | الوظيفة |
|------|---------------|
| `-r, --rules <list>` | شغّل فقط معرّفات القواعد هذه، مثل `AI001,MCP007` |
| `--only-ai` / `--only-mcp` / `--only-vec` / `--only-skl` | شغّل فئة قواعد واحدة فقط |
| `--check-dependencies` | تحقق أيضًا من `package.json`/`requirements.txt` مقارنةً بسجلّ npm/PyPI بحثًا عن أخطاء كتابية وحزم مُتخيَّلة (`DEP001`/`DEP002`). يتم تفعيله تلقائيًا إذا حددت تلك القواعد مباشرة عبر `-r` — ولن تحتاج أبدًا إلى تذكر تمريرهما معًا. غير مطلوب لـ `DEP003` (الحزم الخبيثة المعروفة)، التي تعمل دائمًا دون اتصال |
**CI / سير العمل**
| الخيار | الوظيفة |
|------|---------------|
| `--fail-on <severity>` | اخرج بالرمز `1` إذا وُجدت اكتشافات عند هذا المستوى من الخطورة أو أعلى |
| `--baseline <file>` | تتبّع المشكلات الجديدة/المتغيّرة فقط مقارنةً بخط أساس محفوظ |
| `--policy <file>` | حمّل العتبات والمسارات المتخطاة والقواعد المحظورة من `.secureai-policy.json` (يتم اكتشافه تلقائيًا إذا كان موجودًا — `secureai-scan init` ينشئ واحدًا) |
**خيارات متقدمة**
| الخيار | الوظيفة |
|------|---------------|
| `--min-confidence <0-1>` | أدق من `--paranoid`: إخفاء الاكتشافات الأقل من درجة ثقة محددة (`0.9` مُثبَتة / `0.65` محتملة / `0.35` استدلالية) |
| `--limit <n>` | الحد الأقصى لمجموعات القواعد المعروضة في الطرفية (الافتراضي `10`) — التفاصيل الكاملة تذهب دائمًا إلى `--output` |
| `--debug` | اطبع كل ملف تم فحصه والقواعد التي تم تشغيلها |
**افحص قبل التثبيت — بدون استنساخ، بدون إعداد:**```bash
secureai-scan skill anthropics/skills # a GitHub "owner/repo" shorthand
secureai-scan skill https://github.com/… # or a full git URL
secureai-scan skill ./some/local/skill-dir # or a local path
secureai-scan mcp some-mcp-server-package # a bare npm package name
secureai-scan mcp owner/mcp-server-repo # or git, same as `skill`
يجلب skill و mcp الهدف ويَفحصانه، ثم يحذفان النسخة المجلوبة (استخدم --keep لتفقّدها بدلاً من ذلك). لا يُنفَّذ أبدًا أي شيء تم جلبه: يتم تنزيل هدف npm باستخدام npm pack — ملف tarball فقط، بدون install، وبدون سكربتات دورة الحياة — ويكون هدف git مجرد git clone --depth 1. هذه هي اللحظة الأكثر أهمية: قبل أن تصل مهارة إلى ~/.claude/skills/ أو خادم إلى .mcp.json، وليس بعد ذلك.
أوامر أخرى:```bash secureai-scan bom . --output AI_BOM.md # AI Bill of Materials secureai-scan explain AI001 # why + exploit + fix example, for any rule secureai-scan threat-model . # THREAT_MODEL.md with the OWASP coverage matrix secureai-scan init # policy file + CI workflow, one-time setup
كتم نتيجة تمت مراجعتها في الكود:```ts
// secureai-ignore AI001: reviewed, input sanitized via allowlist
GitHub Action```yaml
name: SecureAI-Scan on: [pull_request] permissions: contents: read security-events: write jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: akanthed/[email protected] with: scanner-version: 0.9.0 fail-on: high
تظهر النتائج كتعليقات توضيحية مضمّنة على طلب السحب (PR) وفي تبويب الأمان في المستودع. (يُنشئ `secureai-scan init` سير عمل مكافئًا باستخدام CLI مباشرةً.)
هل الفحص نظيف؟ أضف الشارة إلى ملف README الخاص بك:```md
[](https://github.com/akanthed/SecureAI-Scan)
القواعد
39 قاعدة، مرتّبة وفقًا لـ OWASP Top 10 لتطبيقات LLM (2026) — بالإضافة إلى، حيث ينطبق، OWASP Top 10 للتطبيقات الوكيلة (2026، ASI)، وOWASP MCP Top 10 (2025)، ومادة من قانون الذكاء الاصطناعي الأوروبي (EU AI Act). راجع تغطية وحدود إصدار 2026؛ يعرض threat-model المصفوفة لكل مشروع تم فحصه.
| القاعدة | ما تثبته | OWASP |
|---|---|---|
| AI001 | تدفق إدخال المستخدم إلى موجه النظام/المطوّر (تتبّع المصدر → الوجهة، بما في ذلك عبر حدود الدوال/الملفات) | LLM01 |
| AI002 | محتوى الموجه أو الأسرار المكتوبة في السجلات (في الملفات التي تستخدم LLM SDK) | LLM02 |
| AI003 | استدعاء LLM في معالج طلبات دون فحص مصادقة قبله | LLM06 |
| AI004 | تسلسل كائن المستخدم/الجلسة بالكامل داخل موجه (اختيار الحقول لا يتم الإبلاغ عنه) | LLM02 |
| AI005 | وصول مخرجات LLM إلى وجهات eval/exec/SQL/HTML | LLM10 |
| AI006 | أدوات عالية التأثير (حذف، دفع، نشر، …) معرّضة دون بوابة موافقة | LLM03 |
| AI007 | إدراج محتوى RAG المسترجع داخل الموجهات ذات الامتيازات | LLM01 |
| AI008 | أسرار مضمّنة في نص موجه النظام | LLM08 |
| AI009 | إدخال مستخدم غير محدود / غياب حدود الرموز (token limits) | LLM06 |
| AI010 | تدفق محتوى خارجي مُحضّر (fetched) إلى الموجهات | LLM01 |
| AI011 | رفع مخرجات الوكيل إلى دور النظام في الاستدعاءات اللاحقة | LLM03 |
| AI012 | تحليل مخرجات LLM دون التحقق من المخطط (schema) | LLM10 |
| MCP001 | وصول بيانات وصفية لأداة MCP إلى موجه النظام دون تحقق | LLM01 |
| MCP002 | بناء عنوان URL لخادم MCP من إدخال المستخدم | LLM04 |
| MCP003 | رفع نتائج أدوات MCP إلى دور النظام | LLM10 |
| MCP004 | تشغيل خادم MCP كحزمة npx -y غير مقيدة بالإصدار | LLM04 |
| MCP005 | سر مضمّن في إعداد MCP مُدرج في المستودع | LLM02 |
| MCP006 | خادم MCP عبر HTTP بنص واضح | LLM04 |
| MCP007 | يونيكود غير مرئي/ثنائي الاتجاه (bidi) مخفي في أسماء أو أوصاف أدوات MCP | LLM01 · MCP03 |
| MCP008 | عبارات حقن موجّهة للوكيل في أوصاف أدوات MCP | LLM01 · MCP03 |
| MCP009 | وصف أداة يوجّه الاستدعاءات إلى أداة أخرى (تظليل/shadowing) | LLM01 · MCP03 |
| MCP010 | بناء أمر/وسائط خادم MCP stdio من إدخال المستخدم (RCE) | LLM04 · MCP05 |
| SKL001 | يونيكود غير مرئي/ثنائي الاتجاه في أي مكان داخل حزمة مهارات الوكيل (Agent Skill) | LLM01 |
| SKL002 | صياغة حقن موجّهة للوكيل في وصف المهارة أو محتواها (يتم اكتشافها عبر التعتيم) | LLM01 |
| SKL003 | محتوى مهارة يوجّه متى/كيف تُستخدم مهارة أخرى (تظليل) | LLM01 |
| SKL004 | حمولة مرحلية/ذاتية الاستخراج: كتلة غير شفافة + تعليمات لفك تشفيرها وتشغيلها | LLM04 · MCP04 |
| SKL005 | قراءة بيانات اعتماد + إرسال خارجي مكتوب بثابت (hardcoded) في ملف مرافق للحزمة | LLM02 · MCP04 |
| SKL006 | تنفيذ أوامر وقت التحميل عبر صيغة حقن السياق الديناميكي في Claude Code (!`cmd`/```!) قبل أي بوابة إذن للأدوات | LLM04 · MCP05 |
| SKL007 | منح Bash غير مقيّد في ترويسة allowed-tools للمهارة | LLM03 |
| SKL008 | مهارة تجلب تعليمات من عنوان URL خارجي وتوجّه الوكيل لاتباعها («سيرك المهارات») | LLM04 |
| SKL009 | مهارة تثبّت بابًا خلفيًا بالكتابة في ملف سياق آخر (MEMORY.md/SOUL.md/AGENTS.md/CLAUDE.md) | LLM05 |
| SKL010 | وسم إلغاء تسلسل غير آمن لـ YAML/JSON في ترويسة المهارة أو ملف إعداد مرفق | LLM04 |
| VEC001 | بحث متجهي (vector search) دون فلتر مستأجر/مستخدم | LLM09 |
| VEC002 | حد بحث غير محدود أو يتحكم به المستخدم | LLM06 |
| VEC003 | إدخال محتوى مستخدم إلى مخزن متجهات مشترك | LLM05 |
| VEC004 | إدخال دون وسم مستأجر/مساحة اسم | LLM09 |
| DEP001 | اسم تبعية غير موجود في السجل (مفعّل اختياريًا --check-dependencies) | LLM04 |
| DEP002 | اسم تبعية يبعد تعديلًا واحدًا عن حزمة شائعة (مفعّل اختياريًا) | LLM04 |
| DEP003 | تبعية ذات إصدار خبيث موثّق أو CVE حرجة — يتم فحصها دون اتصال في كل مسح، مع مراعاة نطاق الإصدار (postmark-mcp, mcp-remote CVE-2025-6514, …) | LLM04 · MCP04 |
يوفر secureai-scan explain <RULE_ID> شرحًا تفصيليًا للاستغلال ومثالًا للكود قبل/بعد لأي قاعدة.
البنية
ثلاث أسطح فحص مستقلة تغذي قائمة نتائج موحّدة ومنزوعة التكرار:``` ┌─────────────────────┐ *.ts / *.js ───▶ │ ts-morph AST rules │───┐ │ (import-resolved │ │ │ sinks + dataflow) │ │ └─────────────────────┘ │ │ ┌─────────────────────┐ │ ┌──────────────┐ ┌─────────────────┐ *.py ───▶ │ tree-sitter AST + │───┼───▶ │ scan.ts │───▶ │ evidence filter │ │ local taint flow │ │ │ merge/dedupe│ │ → confidence │ └─────────────────────┘ │ │ + suppress │ │ → severity │ │ │ (// secure- │ │ → baseline diff │ .mcp.json, ┌─────────────────────┐ │ │ ai-ignore) │ │ → report │ SKILL.md ───▶ │ Config/bundle scan │──┘ └──────────────┘ └─────────────────┘ │ (off-disk, evasion- │ │ │ resistant) │ ▼ └─────────────────────┘ terminal · sarif · json · md · html
package.json, requirements.txt ─▶ dependency-guard.ts (advisories.ts, offline, version-aware)
كل قاعدة في AST لا تُطلق على دالة اسم "استدعاء LLM" إلا إذا تم حلها عبر الاستيرادات الحقيقية إلى SDK معروف — وليس أبدًا بمطابقة الأسماء فقط. راجع [`docs/Architecture.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/Architecture.md) للتفصيل الكامل لكل سطح، و [`docs/DetectionEngine.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/DetectionEngine.md) لمعرفة كيفية عمل عقد طبقة الأدلة.
## خادم MCP (استخدمه من Claude)
تتضمن الحزمة خادم MCP يوفر `scan_repository` و `explain_rule` و `generate_bom` و `scan_untrusted_target` (جلب وفحص مهارة أو خادم MCP قبل أن يوصي Claude بتثبيته — نفس سلوك الجلب دون تنفيذ الخاص بأوامر `skill`/`mcp` في CLI):```json
{
"mcpServers": {
"secureai-scan": {
"command": "node",
"args": ["/path/to/secureai-scan/mcp-server/index.js"]
}
}
}
مهارة Claude
لمستخدمي Claude Code / Claude.ai، يعلّم skills/secureai-scan/SKILL.md كلود متى يُجري مسحًا (مراجعة كود AI/LLM، أو التحقق من خادم MCP / مهارة وكيل (Agent Skill) قبل تثبيتها) وكيفية قراءة النتائج — دون الحاجة إلى تشغيل عملية منفصلة، على عكس خادم MCP أعلاه. انسخ مجلد skills/secureai-scan/ إلى .claude/skills/ لاستخدامها.
مقاومة التهرب
في يوليو 2026، أظهر بحثان منشوران أن ماسحات مهارات الوكلاء (Agent Skill) يمكن تجاوزها بسهولة تامة.
Cloak and Detonate (Ji, Xu, Li, Gao, Wei, Wang & Cheung — HKUST, arXiv:2607.02357) أجرى دراسة عدائية ضد تسعة ماسحات مهارات منشورة باستخدام 1,613 مهارة خبيثة منتشرة في البرية. عائلتا هجوم، وكلتاهما تحافظان على الحمولة كما هي تمامًا:
- Reify — إعادة كتابة البايتات التي تطابقها قاعدة، بينما يعيد الوكيل تجميع الأصل وقت التشغيل. تجاوز >80% على معظم الماسحات الثابتة.
- Disperse / تعبئة SFS — نقل الحمولة خارج نطاق القاعدة: إلى مجلد يتخطاه الماسح، أو خلف امتداد مُعاد تسميته، أو مؤرشفة ومُرمَّزة داخل
.git/، معSKILL.mdغير ضار كغطاء يعيد بنائها عند أول تشغيل. تجاوز ≥90% على كل ماسح تم اختباره، و≥96% على معظمها. انخفض معدل اكتشاف أحد الماسحات الهجينة من ~99% إلى ~10%.
بشكل منفصل، سلّمت Gecko Security (VentureBeat) حمولة في ملف *.test.ts. تخطّاها كل ماسح عام — لكن Jest وVitest يكتشفان تلك الملفات وينفّذانها تلقائيًا عند تشغيل npm test التالي.
يتعامل SecureAI-Scan مع كل تقنية منشورة. كل صف أدناه له اختبار مطابق في test/deobfuscate.test.js أو أداة (fixture) في test-fixtures/vulnerable/skills/:
| التقنية (اسم الورقة) | المثال | طريقة المعالجة |
|---|---|---|
| إدراج أحرف بعرض صفري | Ignore all previous… | يُطابَق النص مع نسخ مجرّدة من الأحرف غير المرئية |
| رموز قابلة للالتباس | сurl (الحرف السيريلي с) | طي الرموز المتشابهة (homoglyphs) إلى ASCII قبل المطابقة |
| عكس حالة الأحرف | EvAl | جميع أنماط المحتوى غير حساسة لحالة الأحرف |
| وصل المتغيرات | 'cu' + 'rl' | تُدمج السلاسل النصية المتجاورة قبل المطابقة |
| التقسيم لكل سطر | ev⏎al(x) | تُدمج فواصل الأسطر داخل الكلمة كنسخة إضافية |
| الاستخراج لكل ملف | حمولة في ملف مساعد مستدعى (sourced helper) | تُمسَح الحزمة بأكملها، وليس SKILL.md فقط |
| نقل المجلد | scripts/x.sh → build/x.sh | لا توجد قائمة تخطٍّ للمجلدات داخل الحزمة |
| إعادة تسمية الامتداد | x.sh → x.txt | تُمسَح الملفات بالمحتوى، لا بالامتداد |
| حشو الحجم | حشو يتجاوز سقف الماسح | تُقرأ الملفات الضخمة من رأسها (head-read) ولا تُتخطى أبدًا |
| تعبئة SFS | حمولة في .git/skillpack.dat | أي ملف غير تابع لـ git داخل .git/ في الحزمة يُعدّ proven (SKL004) |
| تهيئة ملفات الاختبار | حمولة في *.test.ts | مسح الحزمة لا يخفّض مسارات الاختبار عمدًا (SKL005) |
هذا لا يُضعف عقد الدقة
إزالة التعتيم عادةً ما تشكّل خطرًا على الدقة — مطابقات أكثر، ضوضاء أكثر. هنا المنطق معكوس: المطابقة التي تظهر فقط بعد إزالة التعتيم تُرقّى إلى proven، ولا تُخفَّض. التوثيق العادي لا يحتوي على أداة ربط بعرض صفري داخل "تجاهل التعليمات السابقة"، ولا على حرف سيريلي с داخل curl. الإخفاء في حد ذاته دليل إيجابي على النية.
المقارنة تتم مقابل مجموعة المطابقات الخام، وليس فقط "هل تطابق النص الخام أصلًا" — وإلا لاستطاع المهاجم إخفاء الإشارة بترك عبارة غير ضارة مكشوفة.
القاعدتان الجديدتان للحزم لا تعملان إلا عند اجتماع شروط (conjunctions)، وليس أبدًا على كلمة مفتاحية مفردة:
- SKL004 تحتاج كتلة بيانات معتمة (opaque blob) و توجيه فك ضغط يشير إلى تلك الكتلة بالاسم — ذكر README لـ
tar -xبجانب أصل ثنائي غير ذي صلة ليس كافيًا. الأرشيفات الحقيقية (gzip/zip/png/pdf/wasm — تُفحص بالبايتات السحرية (magic bytes)، لا بالامتداد) ليست "معتمة" أصلًا، مهما كانت طريقة ضغطها. - SKL005 تحتاج إشارة بيانات اعتماد ملموسة — مسارًا (
~/.aws/credentials، لا كلمة "token") أو تعدادًا واسعًا لمتغيرات البيئة (os.environ.items()، لاos.environ["API_KEY"]) — و اتصالًا صادرًا (egress) إلى مضيف غير محلي مكتوب بشكل ثابت (hardcoded)، على بُعد 25 سطرًا كحد أقصى من بعضهما في نفس الملف، أو جلبًا عن بُعد (remote fetch) يُنفَّذ بعد إعادة تعيينه عبر إعادة تسمية واحدة أو أكثر. أداة نشر تقرأ~/.npmrcفي دالة واحدة وتستدعي سجلّ الحزم (registry) بعدها بأربعين سطرًا تبقى نظيفة، وقراءة متغير بيئة واحد مُسمّى لاستدعاء API لا تُعلَّم أبدًا كاشتباه — كلا الشكلين مثبَّتان كأدوات (fixtures) آمنة.
تم التحقق منه مقابل مجموعتين نصيتين (corpora) من العالم الحقيقي، وليس فقط أدوات كتبناها بأنفسنا: 0 نتائج عبر جميع حزم المهارات الحقيقية الـ18 في anthropics/skills وكل الـ14 في vercel/ai، و6/6 صحيحة على مجموعة التقييم الموسومة لدى cisco-ai-defense/skill-scanner (20 مهارة، لكل منها حكم _expected.json) مع صفر نتائج إيجابية خاطئة على أي شيء مُوسوم بأنه آمن. انظر الاختبار والمعايرة.
ما ليس هذا
قيد صريح: خلاصة الورقة هي أن التفجير وقت التشغيل (runtime detonation) يتفوق على التحليل الثابت، وهذا صحيح. خصم متكيّف يعرف هذه القواعد يستطيع كتابة تحويل لا تغطيه هذه القواعد. ما يتغيّر هنا هو تكلفة التهرب — التقنيات المنشورة والمتداولة حاليًا لم تعد تعمل، والتعتيم المطلوب لهزيمتها أصبح الآن بحد ذاته يرفع خطورة النتيجة. المسح الثابت فلتر (filter)، وليس حدًّا أمنيًا. تعامل مع أي مهارة غير موثوقة بوصفها كودًا غير موثوق، بغض النظر عمّا يقوله أي ماسح.
الثقة وضمان الإصدار
- يعمل التكامل المستمر (CI) على Linux وWindows وmacOS عبر إصدارات Node المدعومة.
- توفّر CodeQL وتدقيق تبعيات الإنتاج وOpenSSF Scorecard وDependabot والفحص الذاتي الحاجز (blocking self-scan) الخاص بهذا الماسح فحوصات مستقلة.
- يستدعي كل نشر يدوي عبر npm الاختبارات والحدود الدنيا للتغطية وبوابة الانحدار (regression gate) للمستودع الحقيقي المراجَع وفحص الحزمة المضغوطة (tarball) عبر
prepublishOnly. - لا تتلقى GitHub Actions أي كلمة مرور أو توكن npm ولا يمكنها نشر الحزمة.
- ضمان الإصدار وحوكمة المشرف الواحد والإبلاغ عن الثغرات الأمنية وأدلة المعايرة المرتبطة بالإصدارات كلها علنية.
هذا مشروع بمشرف واحد دون اتفاقية مستوى خدمة (SLA) تعاقدية أو شهادة مستقلة. الضوابط أعلاه تقلّل المخاطر؛ لكنها لا تحوّل المسح الثابت إلى إثبات أمان.
عقد الدقة
النتائج الإيجابية الخاطئة (false positives) تقتل الماسحات. يتبع محرك قواعد SecureAI-Scan ثلاث قواعد صارمة:
- تُحلّ الـ Sinks عبر الاستيرادات. إذا حُلّ معرف (identifier) إلى وحدة ليست LLM SDK، فهو قطعًا ليس استدعاء LLM — مهما كان اسمه.
- الأدلة مُصنَّفة، ولا تُخلط أبدًا. تدفق البيانات المتتبَّع والمطابقة بالتقارب اللفظي ليسا الشيء نفسه، لذا لا يتشاركان أبدًا في نفس المرتبة.
- مجموعة الأنماط الآمنة تُعدّ بوابة لكل إصدار. يحتوي
test-fixtures/safe/على الأنماط التي كانت تسبب نتائج إيجابية خاطئة (حمولات PII منقّحة، عملاء Google Maps، مفاتيح API في متغيرات البيئة بجانب عملاء LLM، تسجيل استجابات عادي، حقول OAuth الوصفية،chunksاستجابات التدفق، نصوص مطالبات الخيال/السرد). أي نتيجة هناك تُفشل مجموعة الاختبارات.
الاختبار والمعايرة
ثلاث طبقات، لأن طبقة واحدة وحدها ليست كافية للثقة بادعاءات الماسح — الدقة (precision) والاستدعاء (recall) نمطان مختلفان من أنماط الفشل، وكلاهما يُفحص.
1. مجموعة الأدوات (fixtures) — الدقة + الاستدعاء، وتُشغَّل في كل بناء.```bash npm test
يتم فحص [`test-fixtures/vulnerable/`](https://github.com/akanthed/secureai-scan/blob/HEAD/test-fixtures/vulnerable) و [`test-fixtures/safe/`](https://github.com/akanthed/secureai-scan/blob/HEAD/test-fixtures/safe) معًا: يجب أن يُطلق كل مثال ضعيف القاعدة المتوقعة لديه عند دليل `proven`/`likely` (الاستدعاء)، ويجب أن يُنتج كل مثال آمن **صفر** من النتائج `proven`/`likely` (الدقة). سريع وحتمي — لكنه يثبت فقط أن الماسح يتصرف بشكل صحيح على كود كُتب خصيصًا لاختباره.
**2. معيار الانحدار الواقعي — ضد مستودعات عامة لم نكتبها نحن.**```bash
npm run regression # scan the full curated repo set
npm run regression -- --fresh # re-clone everything first
npm run regression -- openai-node # scan just one repo by name
npm run regression -- --update-baseline # accept the current findings
scripts/regression-scan.js يستنسخ مجموعة منسّقة ومتنوّعة من المستودعات العامة الحقيقية (OpenAI/Anthropic/Vercel AI SDKs، وخوادم MCP الرسمية وTypeScript SDK، وLlamaIndex، بالإضافة إلى anthropics/skills وcisco-ai-defense/skill-scanner لتغطية حزم المهارات — تشمل TS وPython، وأمثلة كود من مستهلكي SDK وكودًا مصدريًا من مؤلّفي SDK) ويفحص كلًا منها باستخدام CLI المبنية.
يُرجِع رمز خروج غير صفري عند أي نتيجة proven/likely غير موجودة بالفعل في test/regression-baseline.json — وهو سجلٌّ روجع يدويًا لنتائج قُرئت بالفعل مقابل سطرها المصدر. البصمات هي repo|rule|file وليست أرقام أسطر، لذا فإن التعديلات الروتينية في المستودعات المنبع لا تُحدث ضجيجًا. البصمة الجديدة ادعاء يجب على الماسح تبريره: إذا لم تكن مشكلة حقيقية فهي خلل في قاعدة، يُصلَح من جذره ويُثبَّت كتجهيزة جديدة تحت test-fixtures/safe/. إدراج نتيجة لم تطلع عليها في خط الأساس يُبطل الآلية بأكملها.
تغطية حزم المهارات تستحق سطرًا خاصًا بها لأن مجموعة evals/ الخاصة بـ cisco-ai-defense/skill-scanner مُصنَّفة — كل تجهيزة من تجهيزاته العشرين تأتي مع حكم _expected.json وتقع تحت دليل اسمه حرفيًا malicious/ أو safe/، لذا فهي تصلح أيضًا كفحص استرجاع وليس فحص دقة فقط: 6/6 من التجهيزات الخبيثة ضمن النطاق تُطلق إنذارات، و0 نتائج على أي شيء مُصنَّف safe/، و0 نتائج عبر جميع الحزم الحقيقية الـ18 في anthropics/skills وجميع الـ14 في vercel/ai. (الفئات المتبقية من Cisco — حقن SQL، وعبور المسار، واستنزاف الموارد، وeval() عامة لوسيط دالة، وحمولة مقسومة عمدًا عبر أربعة ملفات — إما خارج نطاق LLM/MCP/RAG الموثّق أو تتجاوز قدرة تحليل الاقتران داخل الملف نفسه؛ راجع إدخال سجل التغييرات 0.6.0 للأسباب المحددة لكل فئة.)
قبل/بعد تاريخي من التشغيل الذي قاد إلى إصلاحات الدقة الأصلية (النتائج على مستوى الأدلة الافتراضي، دون --paranoid):
| المستودع | قبل | بعد | ما المشكلة |
|---|---|---|---|
| vercel/ai | 773 | 1 | لم يتم التعرّف على أدلة examples/ وأدلة tests/ على المستوى الأعلى والأدلة ذات الواصلة بنمط ecosystem-tests/ باعتبارها مسارات منخفضة الثقة؛ وكان يتم التعامل مع chunks (متغير شائع لاستجابة البث) كدليل RAG لا لبس فيه |
| openai/openai-node | 47 | 0 | نفس الفجوة في كشف المسارات، مطبَّقة على examples//ecosystem-tests/ الخاصة بـ SDK نفسها |
| anthropics/anthropic-sdk-typescript | 2 | 0 | نفس الفجوة في كشف المسارات على دليل tests/ على المستوى الأعلى |
| modelcontextprotocol/typescript-sdk | 3 | 0 | حقول بيانات OAuth الوصفية بنمط token_endpoint/tokenType تم الإبلاغ عنها كأسرار مسرَّبة |
| run-llama/llama_index | 18 | 15 | أبلغ فحص Python عن أي حقل description= يحتوي على "system prompt" كتسميم أدوات MCP من نوع proven بغض النظر عن السياق. أما النتائج الـ15 المتبقية فهي إصابات VEC001 في تعريفات المسترجع العام الخاصة بالمكتبة نفسها — إذ يجري فحص المصدر الخاص بـ SDK لقاعدة بيانات متجهية نفسه، وليس كود تطبيق، لذا لا يمكن أن يوجد فلتر ليتحقق منه الفحص؛ حدّ جوهري صريح، وليس خللًا |
التشغيل الحالي (2026-08-06) — الأدلة المرتبطة بالإصدار مسجلة في docs/benchmarks/v0.9.0.json:
| المستودع | النتائج | القواعد | الحالة |
|---|---|---|---|
| openai-node, anthropic-sdk-typescript, anthropic-sdk-python, modelcontextprotocol/typescript-sdk, modelcontextprotocol/servers | 0 | — | نظيف |
| anthropics/skills (18 حزمة مهارات حقيقية) | 0 | — | نظيف — فحص دقة خالص لقواعد SKL001–005 |
| vercel/ai (5,691 ملفًا) | 0 | — | كانت 40 (AI001, AI003, AI005, AI010, MCP002) قبل الفرز — روجعت كل واحدة منها يدويًا مقابل المصدر وتأكد أنها إيجابية كاذبة، وتبين أنها ترجع إلى 3 أخطاء جذرية مستقلة (انظر أدناه)، أُصلحت جميعها، وأعيد تأكيد نظافتها في إعادة فحص كاملة |
| run-llama/llama_index | 46 | VEC001 | حدّ جوهري، ليس خللًا — تعريفات المسترجع العام الخاصة بالمكتبة نفسها، حيث لا يمكن أن يوجد فلتر مستأجر ليتحقق منه الفحص |
| cisco-ai-defense/skill-scanner | 7 | SKL001, SKL002, SKL005 | جميعها على تجهيزات مُصنَّفة malicious/ — 6/6 ضمن النطاق، و0 على أي شيء مُصنَّف safe/ |
كشف فرز vercel/ai عن ثلاثة أخطاء حقيقية حُدِّدت أسبابها الجذرية — لا يخص أيٌّ منها قواعد المهارات في v0.6.0، بل تقع جميعها في منطق مشترك يُستخدم عبر قواعد عديدة:
resolveLlmSinkكانت تعامل أي استدعاء يُحل إلى وحدة LLM SDK باعتباره استدعاء نموذج، بغض النظر عن اسم الطريقة — فأبلغت عنisToolUIPart(حارس نوع تصدّره حزمةaiجنبًا إلى جنب معgenerateText) كاستدعاء LLM. هذا وحده تسبب في 3 من مجموعات النتائج الخمس (AI001, AI003, AI010).- تتضمن
DANGEROUS_CALLEESفي AI005 القيمة"query"لـ sinks بنمط حقن SQL، لكن"query"هي أيضًا فعل استدعاء شرعي لـ LLM/وكلاء —claudeSdk.query({ prompt, options })، وهو استدعاء النموذج الخاص بـ Claude Agent SDK نفسه، تم الإبلاغ عنه على أنه "مخرجات LLM مُمرَّرة إلى sink خطير" فقط بسبب اشتراك اسم الطريقة. REQUEST_SOURCES(مكرَّرة حرفيًا عبر MCP002 وMCP010 وVEC003) كانت تطابق مجرّد"params."— أي وسيط دالة يُسمى تقليديًاparams، وليس بالضرورة بيانات طلب HTTP. فتم الإبلاغ عن مُتحقق من مخطط URL (assertOpenLinkParams(params: unknown)) على أنه "عنوان URL لخادم MCP من إدخال المستخدم."
أُصلحت الأخطاء الثلاثة كلها عند السبب الجذري (وليس في موقع الاستدعاء المحدد)، وثُبِّتت كتجهيزات دائمة تحت test-fixtures/. التفاصيل الكاملة في CHANGELOG.md.
3. التحقق من النسخ المعرَّضة للخطر مقابل المُصحَّحة — يثبت الاسترجاع وليس الدقة فقط.
الطبقتان أعلاه تتحققان فقط من أن الماسح لا يُصدر أي نتائج على الكود الآمن. أما فحوصات النشرات الأمنية الخاصة بـ DEP003 فتُتحقق من الاتجاه المعاكس: ثبِّت حزمة على نسخة موثّقة كمعرَّضة للخطر وتأكد من الإبلاغ عنها، ثم ثبِّتها على النسخة المُصحَّحة وتأكد من عدم الإبلاغ عنها.```bash
node --test test/dependency-guard.test.js
يغطي: `[email protected]` (CVE-2025-6514، معرّض) مُعلَّم / `[email protected]` (مصحَّح) نظيف؛ `[email protected]` (قبل الباب الخلفي) نظيف / `[email protected]` (بعد — لا يوجد تصحيح رسمي لحزمة خبيثة) ما يزال مُعلَّمًا؛ `llama-cpp-python==0.2.71` (CVE-2024-34359، من مجموعة OSV المُولّدة) مُعلَّم / `==0.2.72` (مصحَّح) نظيف، بما في ذلك تحت تسوية اسم PyPI (`llama_cpp_python`)؛ ومحددات غير مثبتة بأسلوب `langchain>=0.1.0` تُنتج **صفر** نتائج في التقرير الافتراضي. كشف بناء هذا الاختبار فجوة حقيقية: `DEP003` كان يطابق الاستشارات حسب اسم الحزمة فقط، دون مقارنة النسخة المعلنة فعليًا بالنطاق المتأثر في الاستشارة — تم إصلاحه في [`src/scanner/semver.ts`](https://github.com/akanthed/secureai-scan/blob/HEAD/src/scanner/semver.ts).
يُحل الغموض بشكل مختلف حسب نوع الاستشارة، عن قصد. الحزمة **الخبيثة** تُطلق التنبيه حتى عندما يتعذر تحديد النسخة المعلنة — تثبيت باب خلفي لا يمكن التراجع عنه، لذا فهي تُعلِم عند الفشل. أما **CVE** فيُطلق عند `proven` فقط عندما تكون النسخة المعلنة تثبيتًا دقيقًا يمكن إثبات وقوعه داخل النطاق المتأثر؛ بينما النسخ غير المثبتة والتي قد تكون متأثرة تنخفض إلى `heuristic` (فقط مع `--paranoid`). تطبيق قاعدة النوع الخبيث على لقطة CVE تضم 162 إدخالًا سيضع نتيجة حرجة على كل مستودع يصرّح بـ `langchain>=0.1.0` — ضجيج لا يمكن اتخاذ إجراء بشأنه على نطاق واسع.
## خارطة الطريق
انظر [`ROADMAP.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/ROADMAP.md) لما تم إصداره وما هو مخطط له. محركا اللغة كلاهما قائمان على AST: ts-morph لـ TypeScript/JavaScript وTree-sitter لـ Python. الواردات والاستدعاءات والإسنادات والمزيّنات والنطاقات والوسائط المسماة وحقول القواميس والسلاسل النصية في Python هي عُقد بناء جملة؛ لا يتم أبدًا استيراد الكود الهدف أو تنفيذه، ولا يتطلب أي مترجم Python. الفجوة المتبقية في Python هي عمق التلوث المحدود عبر الدوال وعبر الملفات، وليس التحليل. أداء الفحص والقيود المعروفة موثقة في [`docs/Performance.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/Performance.md).
## المساهمة
المساهمات مرحّب بها — انظر [`CONTRIBUTING.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/CONTRIBUTING.md) لسير العمل، و[`docs/WritingRules.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/WritingRules.md) / [`docs/RuleDevelopment.md`](https://github.com/akanthed/secureai-scan/blob/HEAD/docs/RuleDevelopment.md) لكيفية إضافة قاعدة كشف تفي بمعيار الدقة أعلاه. كل قاعدة جديدة تحتاج إلى نموذج اختبار في كل من [`test-fixtures/vulnerable/`](https://github.com/akanthed/secureai-scan/blob/HEAD/test-fixtures/vulnerable) و[`test-fixtures/safe/`](https://github.com/akanthed/secureai-scan/blob/HEAD/test-fixtures/safe)، وإدخال في `src/scanner/catalog.ts`، وحالة في `test/corpus.test.js` — و`npm test` يفرض الثلاثة جميعًا.
## الترخيص
MIT © Akshay Kanthed

