
SecureAI-Scan هي أداة CLI تفحص قواعد أكواد TypeScript وJavaScript بحثًا عن مشكلات أمنية خاصة بالتطبيقات المدعومة بالذكاء الاصطناعي — حقن البرومبت، إساءة استخدام أدوات MCP، تسميم بيانات RAG، انتهاكات ثقة الوكلاء، والمزيد.
معظم الماسحات الضوئية في هذا المجال تطابق كلمة مفتاحية وتعتبرها نتيجة. يتتبع SecureAI-Scan المسار الفعلي المصدر ← التدفق ← نقطة الاستهلاك عبر كود حقيقي محلول بالاستيراد — والفحص الافتراضي يُظهر لك فقط ما يمكنه إثباته. لا حساب، لا رفع سحابي، لا شيء يغادر جهازك.
يغطي OWASP Top 10 لتطبيقات LLM 2026 الرسمي، وTop 10 للتطبيقات الوكيلة (2026)، وMCP Top 10 منذ أسبوع الإطلاق.
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/main/docs/benchmarks/v0.9.0.json) · [المنهجية والقيود](https://github.com/akanthed/secureai-scan/blob/main/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/الوكلاء — حقن المطالبات، تسميم الأدوات، التعامل غير الآمن مع المخرجات، التحكم في الوصول إلى مخازن المتجهات، تسميم مهارات الوكلاء. إنه ليس ماسحًا عامًا لـ SAST أو كاشفًا للأسرار، ولا يحاول أن يكون كذلك؛ الحزمة المعروفة بأنها خبيثة دون حمولة على شكل LLM (مثل عنوان تصدير مكتوب بشكل ثابت في استدعاء واجهة برمجة بريد إلكتروني) يتم اكتشافها عبر قائمة الاستشارات دون اتصال (DEP003)، وليس عبر قاعدة نمطية. إذا كانت قاعدة الشيفرة الخاصة بك تتواصل مع LLM أو خادم MCP أو مخزن متجهات أو تشحن مهارات وكيل، فهذه الأداة مصممة لك.
جديد: فحص إعدادات ثابتة لـ LiteLLM Proxy (config.yaml) — أسرار مكتوبة بشكل ثابت، نقاط نهاية مزود بنص عادي، غياب حواجز الحماية. انظر القواعد (LLC001–LLC003).
proven (تدفق بيانات مُتتبَّع أو حقيقة إعداد مُحلَّلة)، أو likely (نقطة نهاية محلولة، قفزة استدلالية واحدة)، أو heuristic. الفحص الافتراضي يعرض فقط proven + likely. الاستدلالات اختيارية عبر --paranoid.openai, @anthropic-ai/sdk, ai, @google/genai, LangChain, Bedrock, …). لن يتم وضع علامة على عميل خرائط Google الخاص بك كـ LLM مرة أخرى.npm run regression مستودعات عامة حقيقية (OpenAI/Anthropic/Vercel AI SDKs، خوادم MCP الرسمية، LlamaIndex) مقابل خط أساس مُلتزم به ومراجع يدويًا ويفشل عند أي نتيجة جديدة من نوع proven/likely. انظر الاختبار والمعايير للأرقام الفعلية قبل/بعد، أو ما وجدناه بفحص مستودعات حقيقية للقصة وراءها — معدل اكتشاف 6/6 على مجموعة مهارات خبيثة مُصنَّفة، ولماذا لا نسمي llama_index "ضعيفة" بسبب نتيجة صادقة على مستوى المكتبة. الكتابة للنقاش ←--output report.sarif النتائج مباشرة على طلبات السحب وفي تبويب الأمان.secureai-scan bom . جردًا مشتقًا من الصياغة لـ SDKs ومعرفات النماذج ومخازن المتجهات وأطر الوكلاء وخوادم MCP، مرتبطًا باحتياجات توثيق OWASP LLM Top 10 / EU AI Act..mcp.json وclaude_desktop_config.json و.cursor/mcp.json: خوادم npx -y غير مثبتة الإصدار، أسرار مضمّنة، نقل HTTP بنص عادي.command/args لنقل stdio في MCP المبنية من بيانات الطلب — النمط وراء كشف RCE في MCP STDIO لعام 2026.SKILL.md — مهارات الوكلاء تُحمَّل في السياق بالكامل، لذا فإن المهارة المسمومة هي وصف أداة مسموم باسم آخر.SKILL.md الخاص بها، وكل فحص محتوى يعمل على متغيرات مُزيلة للغموض من النص. يستهدف هذا التقنيات المنشورة — الحروف المتجانسة، التقسيم بأصفار العرض، الحمولات المخزنة في .git/ أو build/، التصدير المخفي في ملف *.test.ts — التي تجاوزت أكثر من 90% من الماسحات التسعة التي شملها الاستطلاع في Cloak and Detonate (arXiv:2607.02357). انظر مقاومة التهرب.scripts/sync-advisories.js. يعمل دون اتصال في كل فحص، دون الحاجة إلى علامة. لا يُطلق CVE إلا عندما يكون إصدارك المثبت مثبتًا داخل النطاق المتأثر؛ الحزمة الموثقة كخبيثة تُطلق حتى على نطاق غامض، لأن تثبيت باب خلفي لا يمكن التراجع عنه.SecureAI-Scan ليس بديلًا عن أداة SAST عامة أو ماسح حاويات/IaC — شغّله بجانبها، وليس بدلًا منها. إنه مصمم خصيصًا لسطح هجوم LLM/MCP/RAG ويؤكد على أدلة تدفق البيانات بدلًا من نتائج الكلمات المفتاحية المسطحة.
| SecureAI-Scan | Semgrep (قواعد OSS) | Trivy | GitHub Advanced Security | |
|---|---|---|---|---|
| حقن المطالبات (مصدر→نقطة نهاية مُتتبَّع) | ✅ تدفق بيانات محلول بالاستيراد | ⚠️ قواعد نمطية فقط، مُدارة من المجتمع | ❌ | ⚠️ CodeQL يمكنه، لكن لا توجد مجموعة قواعد خاصة بالذكاء الاصطناعي |
| تسميم أدوات MCP / مخاطر الإعدادات | ✅ MCP007–010، ماسح الإعدادات | ❌ | ❌ | ❌ |
تسميم مهارات الوكلاء (SKILL.md) | ✅ مقاوم للتهرب، واعٍ بالحزمة | ❌ | ❌ | ❌ |
| سوء إعداد RAG / مخازن المتجهات | ✅ VEC001–004 | ❌ | ❌ | ❌ |
| استشارات حزم AI معروفة الخبث | ✅ DEP003، دون اتصال، واعية بالإصدار | ❌ | ⚠️ خلاصة CVE عامة، ليست خاصة بالذكاء الاصطناعي | ⚠️ Dependabot، خلاصة CVE عامة |
| SAST عام (SQLi، XSS، اجتياز المسارات) | ❌ خارج النطاق بالتصميم | ✅ | ❌ | ✅ |
| فحص الحاويات / IaC | ❌ | ❌ | ✅ | ⚠️ عبر CodeQL/Actions |
| مستويات الأدلة (proven/likely/heuristic) | ✅ | ❌ النتائج مسطحة | ❌ | ⚠️ CodeQL لديه بعض، غير مضبوط للذكاء الاصطناعي |
| مخرجات SARIF (فحص شيفرة GitHub) | ✅ | ✅ | ✅ | أصلي |
| يعمل دون اتصال، دون حساب | ✅ | ✅ (قواعد OSS) | ✅ | ❌ يتطلب GitHub |
إذا كنت تشغّل Semgrep أو GHAS بالفعل، فأبقِهما — أضف SecureAI-Scan لسطح المخاطر الذي لا يصممونه إطلاقًا.
تفضل طرح الأسئلة أولًا؟ جرّب مستشار أمان SecureAI-Scan للذكاء الاصطناعي على ChatGPT المجاني.
على وشك تشغيل خادم MCP وجدته على GitHub أو Twitter؟ الصق وصف أداته في MCP X-Ray أولًا — يفحصه بحثًا عن يونيكود مخفي وتعليمات محقونة وحزم معروفة الخبث في متصفحك، دون تثبيت.
secureai-scan scan . من البداية إلى النهاية، مخرجات حقيقية ضد ملف حقيقي (صغير وضعيف عمدًا) — المصدر:

أشكال الهجوم التي يتتبعها الماسح من البداية إلى النهاية:
| تدفق بيانات تسميم أدوات MCP | تدفق بيانات حقن سياق RAG |
|---|---|
![]() | ![]() |
الأمر الذي تحتاجه 95% من الوقت:```bash secureai-scan scan .
كل ما تحتاجه موجود هناك عندما تحتاجه. يُظهر `secureai-scan scan . --help` كل هذا في الطرفية، مجمّعًا بنفس الطريقة:
**الاستخدام اليومي**
| العلم | ما يفعله |
|------|---------------|
| *(لا شيء)* | نتائج `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` proven / `0.65` likely / `0.35` heuristic) |
| `--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 — الملف المضغوط فقط، بدون install، وبدون سكربتات دورة الحياة — وهدف git هو مجرد git clone --depth 1. هذه هي اللحظة الأكثر أهمية: قبل أن يصل skill إلى ~/.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 — example: docs/examples/THREAT_MODEL.example.md secureai-scan init # policy file + CI workflow, one-time setup
قم بكتم نتيجة تمت مراجعتها في الكود:```ts
// secureai-ignore AI001: reviewed, input sanitized via allowlist
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.10.0 fail-on: high
تظهر النتائج كتعليقات توضيحية مضمّنة على الـ PR وفي تبويب الأمان (Security tab) في المستودع. (يقوم الأمر `secureai-scan init` بإنشاء سير عمل مكافئ باستخدام CLI مباشرةً.)
الفحص نظيف؟ أضف الشارة إلى ملف README الخاص بك:```md
[](https://github.com/akanthed/SecureAI-Scan)
هل تفضّل اكتشاف النتائج قبل دفعها؟ أضف هذا المستودع كمصدر خطاف pre-commit بدلاً من GitHub Action أو إلى جانبها:```yaml repos:
يتم فحص المشروع بأكمله في كل commit (وليس فقط الملفات المعدّلة — فمسار تتبع تدفق البيانات إلى الملف A قد يعتمد على الملف B، وهو ما قد يفوته الفحص الجزئي) ويقوم بحظر الـ commit عند وجود نتائج بخطورة `high`+ افتراضيًا. يمكنك تجاوز العتبة في الإعداد الخاص بك:```yaml
- id: secureai-scan
args: ["--fail-on", "critical"]
42 قاعدة، مرتبطة بقائمة 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 | كتابة محتوى الموجه أو الأسرار إلى السجلات (في الملفات التي تستخدم SDK لـ LLM) | LLM02 |
| AI003 | استدعاء LLM في معالج طلبات دون أي فحص مصادقة قبله | LLM06 |
| AI004 | تسلسل كائن المستخدم/الجلسة بالكامل في موجه (لا يتم الإبلاغ عن انتقاء الحقول) | LLM02 |
| AI005 | وصول مخرجات LLM إلى نقاط استهلاك eval/exec/SQL/HTML | LLM10 |
| AI006 | تعرّض أدوات عالية التأثير (حذف، دفع، نشر، …) دون بوابة موافقة | LLM03 |
| AI007 | إدراج محتوى RAG المسترجع في موجهات ممتازة الصلاحية | LLM01 |
| AI008 | أسرار مضمّنة في نص الموجه النظامي | LLM08 |
| AI009 | إدخال مستخدم غير محدود / حدود رموز مفقودة | LLM06 |
| AI010 | تدفق محتوى خارجي مُجلَب إلى الموجهات | LLM01 |
| AI011 | رفع مخرجات الوكيل إلى دور النظام في الاستدعاءات اللاحقة | LLM03 |
| AI012 | تحليل مخرجات LLM دون التحقق من المخطط | LLM10 |
| MCP001 | وصول بيانات وصفية لأداة MCP إلى الموجه النظامي دون تحقق | LLM01 |
| MCP002 | إنشاء عنوان URL لخادم MCP من إدخال المستخدم | LLM04 |
| MCP003 | رفع نتائج أدوات MCP إلى دور النظام | LLM10 |
| MCP004 | تشغيل خادم MCP كحزمة npx -y غير مثبّتة الإصدار | LLM04 |
| MCP005 | سر مضمّن في إعداد MCP مُلتزَم في المستودع | LLM02 |
| MCP006 | خادم MCP عبر HTTP بنص عادي | LLM04 |
| MCP007 | يونيكود غير مرئي/ثنائي الاتجاه مخفي في أسماء أو أوصاف أدوات MCP | LLM01 · MCP03 |
| MCP008 | عبارات حقن موجّهة للوكيل في أوصاف أدوات MCP | LLM01 · MCP03 |
| MCP009 | وصف أداة يوجّه الاستدعاءات إلى أداة مختلفة (تظليل) | LLM01 · MCP03 |
| MCP010 | بناء أمر/وسائط خادم MCP stdio من إدخال المستخدم (RCE) | LLM04 · MCP05 |
| SKL001 |
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/main/docs/Architecture.md) للتفصيل الكامل لكل سطح، و[`docs/DetectionEngine.md`](https://github.com/akanthed/secureai-scan/blob/main/docs/DetectionEngine.md) لكيفية عمل عقد طبقة الأدلة.
## خادم MCP (استخدمه من Claude)
تشتمل الحزمة على خادم MCP يعرض `scan_repository` و`explain_rule` و`generate_bom` و`scan_untrusted_target` (جلب وفحص مهارة أو خادم MCP قبل أن يوصي Claude بتثبيته — نفس سلوك الجلب-بدون-تنفيذ كأوامر CLI الخاصة بـ `skill`/`mcp`):```json
{
"mcpServers": {
"secureai-scan": {
"command": "node",
"args": ["/path/to/secureai-scan/mcp-server/index.js"]
}
}
}
لمستخدمي Claude Code / Claude.ai، skills/secureai-scan/SKILL.md يعلّم Claude متى يشغّل فحصًا (عند مراجعة كود AI/LLM، أو عند التحقق من خادم MCP/مهارة وكيل قبل تثبيتها) وكيفية قراءة النتائج — دون الحاجة إلى عملية منفصلة للتشغيل، على عكس خادم MCP أعلاه. انسخ دليل skills/secureai-scan/ إلى .claude/skills/ لاستخدامه.
في يوليو 2026، أظهر بحثان عامان أن ماسحات مهارات الوكيل يمكن تجاوزها بسهولة.
Cloak and Detonate (Ji, Xu, Li, Gao, Wei, Wang & Cheung — HKUST, arXiv:2607.02357) أجرى دراسة عدائية ضد تسعة ماسحات مهارات منشورة باستخدام 1,613 مهارة ضارة من الواقع. عائلتان من الهجمات، كلاهما يحافظ على الحمولة كما هي تمامًا:
.git/، مع SKILL.md غطاء غير ضار يعيد بنائها عند أول تشغيل. تجاوز ≥90% على كل ماسح تم اختباره، و≥96% على معظمها. انخفض معدل اكتشاف أحد الماسحات الهجينة من ~99% إلى ~10%.بشكل منفصل، Gecko Security (VentureBeat) شحنت حمولة في ملف *.test.ts. تخطّاه كل ماسح عام — لكن Jest وVitest يكتشفان وينفذان تلك الملفات تلقائيًا عند تشغيل npm test التالي.
يتعامل SecureAI-Scan مع كل تقنية منشورة. كل صف أدناه له اختبار مقابل في test/deobfuscate.test.js أو نموذج في test-fixtures/vulnerable/skills/:
| التقنية (اسم الورقة) | مثال | كيفية التعامل معها |
|---|---|---|
| إدراج عرض الصفر | Ignore all previous… | يُطابق النص مقابل متغيرات مجرّدة من الأحرف غير المرئية |
| الحروف المتشابهة | сurl (حرف с السيريلي) | طي الحروف المتجانسة إلى ASCII قبل المطابقة |
| قلب حالة الأحرف | EvAl | جميع أنماط المحتوى غير حساسة لحالة الأحرف |
| تقسيم المتغيرات | 'cu' + 'rl' | دمج السلاسل الحرفية المتجاورة قبل المطابقة |
| التقسيم لكل سطر | ev⏎al(x) | دمج فواصل الأسطر داخل الكلمة كمتغير إضافي |
| الاستخراج لكل ملف | حمولة في ملف مساعد مستدعى | يُفحص الحزمة بأكملها، وليس SKILL.md فقط |
| نقل الدليل | scripts/x.sh → build/x.sh | لا توجد قائمة تخطي للأدلة داخل الحزمة |
| إعادة تسمية الامتداد | x.sh → x.txt | تُفحص الملفات حسب المحتوى، وليس الامتداد |
| حشو الحجم | حشو يتجاوز سقف الماسح | تُقرأ الملفات كبيرة الحجم من البداية، ولا تُتخطى أبدًا |
| تعبئة SFS | حمولة في .git/skillpack.dat | أي ملف غير تابع لـ git داخل .git/ للحزمة يُعتبر proven (SKL004) |
| تخزين ملفات الاختبار | حمولة في *.test.ts | فحص الحزمة لا يخفض مسارات الاختبار عمدًا (SKL005) |
إزالة التعتيم عادةً ما تكون خطرًا على الدقة — مطابقات أكثر، ضوضاء أكثر. هنا المنطق معكوس: المطابقة التي تظهر فقط بعد إزالة التعتيم تُرفع إلى proven، ولا تُخفض. الوثائق العادية لا تحتوي على موصل عرض صفر داخل "تجاهل التعليمات السابقة"، ولا حرف с سيريلي داخل curl. الإخفاء بحد ذاته دليل إيجابي على النية.
المقارنة تتم ضد مجموعة المطابقات الخام، وليس فقط "هل طابق النص الخام على الإطلاق" — وإلا يمكن للمهاجم إخفاء الإشارة بترك عبارة واحدة غير ضارة واضحة.
قاعدتا الحزمة الجديدتان تعملان فقط على الاقترانات، وليس أبدًا على كلمة مفتاحية:
tar -x بجانب أصل ثنائي غير مرتبط ليس كافيًا. الأرشيفات الحقيقية (gzip/zip/png/pdf/wasm — تُفحص ببايتات السحر، وليس بالامتداد) ليست "معتمة" أبدًا في المقام الأول، مهما كانت طريقة ضغطها.~/.aws/credentials، وليس كلمة "token") أو تعداد جماعي لمتغيرات البيئة (os.environ.items()، وليس os.environ["API_KEY"]) — و إرسالًا إلى مضيف خارجي مكتوب بشكل ثابت، ضمن 25 سطرًا من بعضهما البعض في نفس الملف، أو جلبًا عن بُعد يُنفَّذ بعد إعادة تعيينه عبر إعادة تسمية واحدة أو أكثر. أداة نشر تقرأ ~/.npmrc في دالة واحدة وتستدعي سجلًا بعد أربعين سطرًا تبقى نظيفة، وقراءة متغير بيئة واحد مسمى لاستدعاء API لا يُعلَّم أبدًا — كلا الشكلين مثبتان كنماذج آمنة.تم التحقق مقابل مجموعتين حقيقيتين من العالم الواقعي، وليس فقط نماذج كتبناها بأنفسنا: 0 نتائج عبر جميع حزم المهارات الحقيقية الـ18 في anthropics/skills وجميع الـ14 في vercel/ai، و6/6 صحيحة على مجموعة التقييم المصنّفة لـ cisco-ai-defense/skill-scanner (20 مهارة، كل منها بحكم _expected.json) مع صفر نتائج إيجابية خاطئة على أي شيء مصنّف كآمن. انظر الاختبار والمعايير.
حدود صادقة: استنتاج الورقة هو أن التفجير في وقت التشغيل يتفوق على التحليل الثابت، وهذا صحيح. خصم متكيف يعرف هذه القواعد يمكنه كتابة تحويل لا تغطيه. ما يتغير هنا هو تكلفة التهرب — التقنيات المنشورة والمتداولة حاليًا لم تعد تعمل، والتعتيم المطلوب لهزيمتها يرفع الآن شدة النتيجة بحد ذاته. المسح الثابت هو مرشح، وليس حدودًا أمنية. تعامل مع أي مهارة غير موثوقة ككود غير موثوق بغض النظر عن ما يقوله أي ماسح.
prepublishOnly.هذا مشروع بمشرف واحد بدون SLA تعاقدي أو شهادة مستقلة. الضوابط أعلاه تقلل المخاطر؛ ولا تحول الفحص الثابت إلى دليل على الأمان.
النتائج الإيجابية الخاطئة تقتل الماسحات. محرك قواعد SecureAI-Scan يتبع ثلاث قواعد صارمة:
test-fixtures/safe/ يحتوي الأنماط التي كانت تسبب نتائج إيجابية خاطئة (حمولات PII منقحة، عملاء Google Maps، مفاتيح API لمتغيرات البيئة بجانب عملاء LLM، تسجيل استجابات عادي، حقول بيانات OAuth الوصفية، chunks استجابات التدفق، نص مطالبات خيالي/سردي). أي نتيجة هناك تفشل المجموعة.ثلاث طبقات، لأن طبقة واحدة وحدها ليست كافية للثقة في ادعاءات الماسح — الدقة والاسترجاع وضعا فشل مختلفان، وكلاهما يُفحص.
1. مجموعة النماذج — الدقة + الاسترجاع، تُشغَّل في كل بناء.```bash npm test
[`test-fixtures/vulnerable/`](https://github.com/akanthed/secureai-scan/blob/main/test-fixtures/vulnerable) و[`test-fixtures/safe/`](https://github.com/akanthed/secureai-scan/blob/main/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 لتغطية حزم المهارات — تشمل TypeScript و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" لمصارف نمط حقن SQL، لكن "query" هو أيضًا فعل استدعاء شرعي لنموذج/وكيل LLM — تم الإشارة إلى claudeSdk.query({ prompt, options })، استدعاء النموذج الخاص بـ Claude Agent SDK، كـ "مخرجات LLM مرت إلى مصرف خطير" فقط بسبب اسم الطريقة المشترك.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
covers: `[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/main/src/scanner/semver.ts).
يُحل الغموض بشكل مختلف حسب نوع التنبيه، عن قصد. الحزمة **الخبيثة** تُطلق إنذارًا حتى عندما يتعذر حل النسخة المُعلَنة — تثبيت باب خلفي لا يمكن التراجع عنه، لذا يفشل نحو الإعلام. بينما يُطلق **CVE** عند `proven` فقط عندما تكون النسخة المُعلَنة تثبيتًا دقيقًا يقع بشكل مؤكد داخل النطاق المتأثر؛ أما غير المثبَّتة والتي قد تكون متأثرة فتنخفض إلى `heuristic` (فقط مع `--paranoid`). تطبيق قاعدة النوع الخبيث على لقطة CVE من 162 إدخالًا سيضع نتيجة حرجة على كل مستودع يُعلن `langchain>=0.1.0` — ضجيج غير قابل للتنفيذ على نطاق واسع.
## خارطة الطريق
انظر [`ROADMAP.md`](https://github.com/akanthed/secureai-scan/blob/main/ROADMAP.md) لما تم إصداره وما هو مخطط له. كلا محركي اللغة مبنيان على AST: ts-morph لـ TypeScript/JavaScript وTree-sitter لـ Python. استيرادات Python، والاستدعاءات، والإسنادات، والمُزيِّنات، والنطاقات، والوسائط المسماة، وحقول القواميس، والسلاسل هي عُقد صياغة؛ لا يتم أبدًا استيراد الكود الهدف أو تنفيذه، ولا يتطلب مترجم Python. الفجوة المتبقية في Python هي عمق التلوث المحدود عبر الدوال/الملفات، وليس التحليل. أداء الفحص والقيود المعروفة موثقة في [`docs/Performance.md`](https://github.com/akanthed/secureai-scan/blob/main/docs/Performance.md).
## المساهمة
المساهمات مرحب بها — انظر [`CONTRIBUTING.md`](https://github.com/akanthed/secureai-scan/blob/main/CONTRIBUTING.md) لسير العمل، و[`docs/WritingRules.md`](https://github.com/akanthed/secureai-scan/blob/main/docs/WritingRules.md) / [`docs/RuleDevelopment.md`](https://github.com/akanthed/secureai-scan/blob/main/docs/RuleDevelopment.md) لكيفية إضافة قاعدة كشف تلبي معيار الدقة أعلاه. كل قاعدة جديدة تحتاج إلى نموذج اختبار في كل من [`test-fixtures/vulnerable/`](https://github.com/akanthed/secureai-scan/blob/main/test-fixtures/vulnerable) و[`test-fixtures/safe/`](https://github.com/akanthed/secureai-scan/blob/main/test-fixtures/safe)، وإدخالًا في `src/scanner/catalog.ts`، وحالة في `test/corpus.test.js` — `npm test` يفرض الثلاثة جميعًا.
## الترخيص
MIT © Akshay Kanthed
| يونيكود غير مرئي/ثنائي الاتجاه في أي مكان داخل حزمة مهارات وكيل |
| LLM01 |
| SKL002 | صياغة حقن موجّهة للوكيل في وصف المهارة أو محتواها (مطابقة عبر التمويه) | LLM01 |
| SKL003 | توجيه محتوى المهارة لمتى/كيف تُستخدم مهارة مختلفة (تظليل) | LLM01 |
| SKL004 | حمولة مرحلية/ذاتية الاستخراج: كتلة معتمة + تعليمات لفك تشفيرها وتشغيلها | LLM04 · MCP04 |
| SKL005 | قراءة بيانات اعتماد + إرسال خارجي مشفّر في ملف مرافق للحزمة | 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 | بحث متجهي دون فلتر مستأجر/مستخدم | LLM09 |
| VEC002 | حد بحث غير محدود أو يتحكم فيه المستخدم | LLM06 |
| VEC003 | إدخال محتوى المستخدم في مخزن متجهي مشترك | LLM05 |
| VEC004 | إدخال دون وسم مستأجر/مساحة أسماء | LLM09 |
| DEP001 | اسم تبعية غير موجود في السجل (اختياري --check-dependencies) | LLM04 |
| DEP002 | اسم تبعية على بُعد تعديل واحد من حزمة شائعة (اختياري) | LLM04 |
| DEP003 | تبعية ذات إصدار ضار موثّق أو CVE حرج — يُفحص دون اتصال في كل عملية فحص، مع مراعاة نطاق الإصدار (postmark-mcp، mcp-remote CVE-2025-6514، …) | LLM04 · MCP04 |
| LLC001 | سر مشفّر في config.yaml لوكيل LiteLLM | LLM02 |
| LLC002 | api_base لوكيل LiteLLM يمكن الوصول إليه عبر HTTP بنص عادي | LLM04 |
| LLC003 | إعداد وكيل LiteLLM دون قسم guardrails: (استدلالي، --paranoid فقط) | LLM03 |