العودة إلى التحديثات
New releaseJul 28, 2026

SecureAI-Scan v0.6.0

SecureAI-Scan هي أداة سطر أوامر تفحص قواعد بيانات TypeScript و JavaScript بحثًا عن مشكلات أمنية خاصة بالتطبيقات المدعومة بالذكاء الاصطناعي — حقن البرومبت، إساءة استخدام أدوات MCP، تسميم بيانات RAG، انتهاكات ثقة الوكلاء، والمزيد.

مشاركة

SecureAI-Scan

npm version npm downloads CI CodeQL OpenSSF Scorecard license Node OWASP

ماسح الأمان الذكي الذي يُثبت نتائجه.

يكتشف 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، أو مخزن متجهات، أو تشحن مهارات وكيل، فهذه الأداة مصممة لك.

المحتويات

لماذا يختلف هذا الماسح

  • مستويات الأدلة، ليست ضجيجًا. كل اكتشاف هو 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-ScanSemgrep (OSS rules)TrivyGitHub 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
تتبع هجوم 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
[![secureai-scan](https://img.shields.io/badge/secureai--scan-passing-brightgreen)](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/HTMLLLM10
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) مخفي في أسماء أو أوصاف أدوات MCPLLM01 · MCP03
MCP008عبارات حقن موجّهة للوكيل في أوصاف أدوات MCPLLM01 · 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/:

التقنية (اسم الورقة)المثالطريقة المعالجة
إدراج أحرف بعرض صفريIgn‍ore all pre‍vious…يُطابَق النص مع نسخ مجرّدة من الأحرف غير المرئية
رموز قابلة للالتباسсurl (الحرف السيريلي с)طي الرموز المتشابهة (homoglyphs) إلى ASCII قبل المطابقة
عكس حالة الأحرفEvAlجميع أنماط المحتوى غير حساسة لحالة الأحرف
وصل المتغيرات'cu' + 'rl'تُدمج السلاسل النصية المتجاورة قبل المطابقة
التقسيم لكل سطرeval(x)تُدمج فواصل الأسطر داخل الكلمة كنسخة إضافية
الاستخراج لكل ملفحمولة في ملف مساعد مستدعى (sourced helper)تُمسَح الحزمة بأكملها، وليس SKILL.md فقط
نقل المجلدscripts/x.shbuild/x.shلا توجد قائمة تخطٍّ للمجلدات داخل الحزمة
إعادة تسمية الامتدادx.shx.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 ثلاث قواعد صارمة:

  1. تُحلّ الـ Sinks عبر الاستيرادات. إذا حُلّ معرف (identifier) إلى وحدة ليست LLM SDK، فهو قطعًا ليس استدعاء LLM — مهما كان اسمه.
  2. الأدلة مُصنَّفة، ولا تُخلط أبدًا. تدفق البيانات المتتبَّع والمطابقة بالتقارب اللفظي ليسا الشيء نفسه، لذا لا يتشاركان أبدًا في نفس المرتبة.
  3. مجموعة الأنماط الآمنة تُعدّ بوابة لكل إصدار. يحتوي 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/ai7731لم يتم التعرّف على أدلة examples/ وأدلة tests/ على المستوى الأعلى والأدلة ذات الواصلة بنمط ecosystem-tests/ باعتبارها مسارات منخفضة الثقة؛ وكان يتم التعامل مع chunks (متغير شائع لاستجابة البث) كدليل RAG لا لبس فيه
openai/openai-node470نفس الفجوة في كشف المسارات، مطبَّقة على examples//ecosystem-tests/ الخاصة بـ SDK نفسها
anthropics/anthropic-sdk-typescript20نفس الفجوة في كشف المسارات على دليل tests/ على المستوى الأعلى
modelcontextprotocol/typescript-sdk30حقول بيانات OAuth الوصفية بنمط token_endpoint/tokenType تم الإبلاغ عنها كأسرار مسرَّبة
run-llama/llama_index1815أبلغ فحص 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/servers0نظيف
anthropics/skills (18 حزمة مهارات حقيقية)0نظيف — فحص دقة خالص لقواعد SKL001–005
vercel/ai (5,691 ملفًا)0كانت 40 (AI001, AI003, AI005, AI010, MCP002) قبل الفرز — روجعت كل واحدة منها يدويًا مقابل المصدر وتأكد أنها إيجابية كاذبة، وتبين أنها ترجع إلى 3 أخطاء جذرية مستقلة (انظر أدناه)، أُصلحت جميعها، وأعيد تأكيد نظافتها في إعادة فحص كاملة
run-llama/llama_index46VEC001حدّ جوهري، ليس خللًا — تعريفات المسترجع العام الخاصة بالمكتبة نفسها، حيث لا يمكن أن يوجد فلتر مستأجر ليتحقق منه الفحص
cisco-ai-defense/skill-scanner7SKL001, SKL002, SKL005جميعها على تجهيزات مُصنَّفة malicious/ — 6/6 ضمن النطاق، و0 على أي شيء مُصنَّف safe/

كشف فرز vercel/ai عن ثلاثة أخطاء حقيقية حُدِّدت أسبابها الجذرية — لا يخص أيٌّ منها قواعد المهارات في v0.6.0، بل تقع جميعها في منطق مشترك يُستخدم عبر قواعد عديدة:

  1. resolveLlmSink كانت تعامل أي استدعاء يُحل إلى وحدة LLM SDK باعتباره استدعاء نموذج، بغض النظر عن اسم الطريقة — فأبلغت عن isToolUIPart (حارس نوع تصدّره حزمة ai جنبًا إلى جنب مع generateText) كاستدعاء LLM. هذا وحده تسبب في 3 من مجموعات النتائج الخمس (AI001, AI003, AI010).
  2. تتضمن DANGEROUS_CALLEES في AI005 القيمة "query" لـ sinks بنمط حقن SQL، لكن "query" هي أيضًا فعل استدعاء شرعي لـ LLM/وكلاءclaudeSdk.query({ prompt, options })، وهو استدعاء النموذج الخاص بـ Claude Agent SDK نفسه، تم الإبلاغ عنه على أنه "مخرجات LLM مُمرَّرة إلى sink خطير" فقط بسبب اشتراك اسم الطريقة.
  3. 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

الفئات