
أداة تحليل ثابتة (CLI) تفحص قواعد البيانات البرمجية بحثًا عن ثغرات حقن التعليمات (prompt-injection)، تسريب البيانات (data-exfiltration)، كسر الحماية (jailbreak)، وثغرات الوكيل/الأداة غير الآمنة. تعمل دون اتصال بالإنترنت بالكامل، وتتكامل مع CI/CD، وتُخرج تقارير إلى وحدة التحكم، JSON، و SARIF.
أداة تحليل ثابتة تفحص قاعدة التعليمات البرمجية الخاصة بك بحثًا عن ثغرات أمنية في حقن الأوامر للنماذج اللغوية الكبيرة (LLM) والهجمات متعددة الوسائط. تعمل دون اتصال بالإنترنت، ولا تتطلب استدعاءات API.
ContextHound متاح عبر سير العمل التطويري والتصفح بالكامل:
| الأداة | ما تقوم به | التثبيت |
|---|---|---|
| حزمة CLI / npm | تفحص قاعدة التعليمات البرمجية بحثًا عن ثغرات حقن الأوامر. تتكامل مع GitHub Actions، وتُخرج SARIF وJSON وHTML والمزيد. | npm install -g context-hound |
| إضافة VS Code | عرض النتائج أثناء كتابة الكود، إجراءات الكود، قناة الإخراج، شريط الحالة. | سوق VS Code |
| إضافة المتصفح | مؤشر فحص فوري على أي واجهة دردشة ذكاء اصطناعي، لوحة DevTools لحركة API للنماذج اللغوية، ماسح ضوئي منبثق. متصفحات Chrome وFirefox. | Firefox: تثبيت مجاني · Chrome: بانتظار المراجعة · المصدر |
مع انتشار التطبيقات المدعومة بالنماذج اللغوية الكبيرة في قواعد التعليمات البرمجية الإنتاجية، برز حقن الأوامر كأحد أسطح الهجوم الأكثر قابلية للاستغلال؛ معظم ماسحات الأمان لا تدرك وجوده.
يجلب ContextHound التحليل الثابت إلى طبقة الأوامر الخاصة بك:
يتناسب مع سير عملك الحالي كأمر CLI، أو سكربت npm، أو GitHub Action، بدون أي تبعيات خارجية.
تثبيت عالمي — يضيف الأمر hound إلى PATH الخاص بك:```bash
npm install -g context-hound
**تثبيت لكل مشروع** — مقصور على مستودع واحد، يتم تشغيله عبر `npx hound` أو سكربت npm:```bash
npm install --save-dev context-hound
Zero-install — لا حاجة للتثبيت، يستخدم نسخة مخزنة مؤقتًا من سجل npm:```bash npx context-hound scan --dir .
---
## بداية سريعة```bash
# Scaffold a config file
hound init
# Scan your project
hound scan --dir ./my-ai-project
# Or via npm script (scans current directory)
npm run hound
# Verbose output, shows remediations and confidence levels
hound scan --verbose
# Fail the build on any critical finding
hound scan --fail-on critical
# Export JSON and SARIF reports
hound scan --format console,json,sarif --out results
# GitHub Annotations (for CI step summaries)
hound scan --format github-annotations
# Markdown report with findings tables
hound scan --format markdown --out report
# Stream findings as JSONL (one JSON object per line)
hound scan --format jsonl | jq '.severity'
# List all rules
hound scan --list-rules
# Explain a rule (or a rule family by prefix)
hound explain INJ-001
hound explain PST --format json
# Fast PR gate — scan only files changed vs. origin/main
hound scan --diff
# Interactive HTML report (self-contained, open in browser)
hound scan --format html --out report
# Re-scan on file changes
hound scan --watch
# Parallel scanning (default is 8; tune for your machine)
hound scan --concurrency 16
# Disable incremental cache for a clean run
hound scan --no-cache
# Baseline mode — only report findings new since the last saved scan
hound scan --format json --out baseline # save a baseline
hound scan --baseline baseline.json # compare future scans against it
# Load a custom rule from a local plugin file
hound scan # plugin declared in .contexthoundrc.json "plugins" field
# Only run high-confidence rules
hound scan --config .contexthoundrc.json # set minConfidence: "high"
# Fail if any single file scores >= 40
hound scan --fail-file-threshold 40
رموز الخروج:
أضف إلى سير العمل الخاص بك لمنع الدمج عندما تكون مخاطر المطالبة عالية جدًا:```yaml
name: Prompt Audit
on: [push, pull_request]
jobs: hound: runs-on: ubuntu-latest permissions: contents: read security-events: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g context-hound
- run: hound scan --format console,sarif,github-annotations --out results.sarif
- name: Upload to GitHub Code Scanning
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
ستظهر النتائج في علامة تبويب **الأمان > فحص الكود** في مستودعك. يقوم تنسيق `github-annotations` بنشر تعليقات داخل طلبات السحب (PR) وكتابة جدول ملخص إلى خلاصة خطوات GitHub.
---
## الإعدادات
قم بتشغيل `hound init` لإنشاء ملف `.contexthoundrc.json` بشكل تلقائي، أو قم بإنشائه يدويًا:```json
{
"include": ["**/*.ts", "**/*.js", "**/*.py", "**/*.go", "**/*.rs", "**/*.md", "**/*.txt", "**/*.yaml"],
"exclude": [
"**/node_modules/**",
"**/dist/**",
"**/tests/**",
"**/attacks/**"
],
"threshold": 60,
"formats": ["console", "sarif"],
"out": "results",
"verbose": false,
"failOn": "critical",
"maxFindings": 50,
"excludeRules": ["JBK-002"],
"includeRules": [],
"minConfidence": "medium",
"failFileThreshold": 80,
"concurrency": 8,
"cache": true,
"plugins": ["./rules/my-custom-rule.js"],
"baseline": "./baseline.json"
}
يمكن تجاوز جميع الإعدادات الرئيسية في وقت التشغيل دون تعديل ملف التكوين:
.houndignoreضع ملف .houndignore في جذر مشروعك لإضافة أنماط استبعاد دون تعديل .contexthoundrc.json. يتبع نفس بناء جملة glob؛ الأسطر التي تبدأ بـ # هي تعليقات.
قم بإسكات نتيجة إيجابية خاطئة معروفة مباشرة في المصدر — لا حاجة لتعطيل قاعدة على مستوى المستودع. يتم التعرف على التوجيهات في أي نوع ملف (لا يهم بناء جملة التعليق المحيط):```ts
// hound-disable-next-line INJ-001 -- userInput is a validated enum
const prompt = Summarise the ${userInput} report;
const cmd = run(${shell}); // hound-disable-line CMD-001
// hound-disable RAG-007 -- trusted internal corpus only context.push(doc.metadata.title); context.push(doc.metadata.author); // hound-enable RAG-007
- `hound-disable-line [RULE...]` — إخفاء النتائج في نفس السطر
- `hound-disable-next-line [RULE...]` — إخفاء النتائج في السطر التالي
- `hound-disable [RULE...]` … `hound-enable [RULE...]` — إخفاء كتلة (تُغلق تلقائياً في نهاية الملف)
- حذف معرفات القواعد لإخفاء **جميع** القواعد في ذلك الموضع؛ اذكر واحداً أو أكثر (مفصولة بمسافة/فاصلة) لتحديد النطاق
- النص بعد `--` هو مبرر حر، يظهر في التقارير
شغّل الأمر `--report-unused-suppressions` لعرض التوجيهات التي لم تعد تطابق أي نتيجة، وذلك لتنظيف الإخفاءات البالية:```bash
hound scan --report-unused-suppressions
تمكين مجموعة مختارة من القواعد باستخدام --preset بدلاً من سرد IDs. تتحد الإعدادات المسبقة مع أي includeRules لديك بالفعل، ويمكن دمج العديد منها:```bash
hound scan --preset owasp-llm-top10
hound scan --preset mcp,agentic
hound scan --list-presets # show all presets and their rule patterns
| الإعداد المسبق | القواعد |
|----------------|---------|
| `owasp-llm-top10` | INJ, JBK, EXF, OUT, RAG, TOOL, SCH, DOS, VIS |
| `injection` | INJ, RAG, ENC |
| `jailbreak` | JBK |
| `exfiltration` | EXF |
| `agentic` | AGT, MCP, TOOL |
| `mcp` | MCP |
| `supply-chain` | SCH |
| `prompt-files` | INJ, JBK, EXF, ENC, SKL |
### pre-commit hook
يأتي ContextHound مزودًا بـ [pre-commit](https://pre-commit.com) hook. أضفه إلى `.pre-commit-config.yaml` الخاص بك:```yaml
repos:
- repo: https://github.com/IulianVOStrut/ContextHound
rev: v2.0.0
hooks:
- id: contexthound
# optional — scan only changed files and fail on high-severity findings:
# args: ["--diff", "HEAD", "--fail-on", "high"]
يمكن تحميل أي ملف .js يصدر Rule أو Rule[] كإضافة:```js
// my-rule.js
module.exports = {
id: 'CUSTOM-001',
title: 'Proprietary data pattern in prompt',
severity: 'high',
confidence: 'high',
category: 'injection',
remediation: 'Remove internal identifiers from prompts.',
check(prompt) {
if (prompt.text.includes('INTERNAL_PATTERN')) {
return [{ evidence: 'INTERNAL_PATTERN', lineStart: 1, lineEnd: 1 }];
}
return [];
},
};
قم بالإشارة إليه في `.contexthoundrc.json`:```json
{ "plugins": ["./my-rule.js"] }
Plugin rules are subject to the same excludeRules, includeRules, and minConfidence filters as built-in rules.
Save a baseline after an initial scan, then only report findings that are new in subsequent scans:```bash
hound scan --format json --out baseline
hound scan --baseline baseline.json
### الملفات المتغيرة فقط (`--diff`)
لبوابات طلب السحب السريعة، امسح فقط الملفات التي تغيرت بالنسبة إلى مرجع git بدلاً من الشجرة بأكملها:```bash
hound scan --diff # vs. origin/main (default)
hound scan --diff main # vs. a named branch
hound scan --diff HEAD~5 # vs. an arbitrary ref
يغطي الملفات المُلتزمة، والمُعدلة والمُضافة إلى منطقة التتبع، والملفات غير المُضافة، والملفات غير المُتتبعة ولكن غير المُتجاهلة. إذا لم يكن git متاحًا أو تعذر حل المرجع (مثل استنساخ CI ضحل)، يطبع ContextHound تحذيرًا ويعود إلى الفحص الكامل بدلاً من المرور بصمت. يمكن دمجه مع --baseline للتفريق على مستوى النتائج، أو استخدام --diff بمفرده للحصول على أسرع ردود فعل على طلب السحب.
يحمل كل اكتشاف نقاط خطر تُحسب على النحو التالي:``` risk_points = severity_weight × confidence_multiplier
يتم جمع النقاط، وتحديدها عند 100، وتصنيفها:
| النتيجة | المستوى | الإجراء المقترح |
|---------|---------|-----------------|
| 0-29 | 🟢 منخفض | لا حاجة لإجراء |
| 30-59 | 🟡 متوسط | المراجعة قبل الدمج |
| 60-79 | 🟠 عالي | الإصلاح قبل الدمج |
| 80-100 | 🔴 حرج | حظر النشر |
إذا كانت استفساراتك تتضمن لغة أمان صريحة (محددات الإدخال، تعليمات منع الكشف، قوائم الأدوات المسموحة)، يتم تقليل نقاط المخاطرة لذلك الاستفسار بشكل متناسب.
---
## القواعد
### أ. الحقن (INJ)
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| INJ-001 | عالية | إدخال المستخدم المباشر مدمج في الاستفسار بدون محدد |
| INJ-002 | متوسطة | عدم وجود لغة حدودية "معالجة محتوى المستخدم كبيانات" |
| INJ-003 | عالية | تضمين سياق مسترجع/ RAG بدون فاصل غير موثوق |
| INJ-004 | عالية | تعليمات استخدام الأداة قابلة للتجاوز من قبل محتوى المستخدم |
| INJ-005 | عالية | كائن مستخدم مسلسل (`JSON.stringify`) مدمج مباشرة في قالب استفسار |
| INJ-006 | متوسطة | تعليق HTML يحتوي على تعليمات مخفية في محتوى يتحكم به المستخدم |
| INJ-007 | متوسطة | إدخال المستخدم ملفوف بمحددات كتلة برمجية دون إزالة علامات الاقتباس الخلفية أولاً |
| INJ-008 | عالية | بيانات طلب HTTP (`req.body`, `req.query`, `req.params`) مدمجة في سلسلة قالب `role: "system"` |
| INJ-009 | حرجة | تحليل كائن طلب HTTP مباشرة كمصفوفة رسائل — يتحكم المهاجم في الدور والمحتوى |
| INJ-010 | عالية | نسخة نصية لعلامة الدور (`User:`, `Assistant:`, `system:`) تم بناؤها بدمج إدخال غير موثوق |
| INJ-011 | عالية | مصدر DOM أو URL للمتصفح (`window.location`, `document.cookie`, `getElementById`) يُغذى مباشرة في استدعاء LLM |
| INJ-012 | عالية | نشر سجل المحادثة في مصفوفة الرسائل دون تنقية |
| INJ-013 | عالية | إدراج نتيجة استدعاء أداة/دالة في الرسائل دون تنقية |
| INJ-014 | عالية | إخراج LLM موجه كمحتوى دور المستخدم إلى استدعاء LLM لاحق |
| INJ-015 | عالية | تدفق إدخال خارجي غير موثوق (HTTP/CLI/DOM) إلى استفسار — **تحليل التلوث** غير معتمد على الاسم، يتبع الأسماء المستعارة، يحترم أدوات التنقية |
### ب. التسريب (EXF)
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| EXF-001 | حرجة | الاستفسار يشير إلى أسرار أو مفاتيح API أو بيانات اعتماد |
| EXF-002 | حرجة | الاستفسار يوجه النموذج للكشف عن استفسار النظام أو التعليمات المخفية |
| EXF-003 | عالية | الاستفسار يشير إلى الوصول إلى بيانات سرية أو خاصة |
| EXF-004 | عالية | الاستفسار يتضمن عناوين URL داخلية أو أسماء مضيف البنية التحتية |
| EXF-005 | عالية | متغير حساس (رمز، كلمة مرور، مفتاح) مشفر بصيغة Base64 في الإخراج |
| EXF-006 | عالية | الاستفسار الكامل أو مصفوفة الرسائل مسجلة عبر `console.log` / `logger.*` دون حذف |
| EXF-007 | حرجة | قيمة سرية فعلية مضمنة في الاستفسار إلى جانب تعليمة "لا تكشف أبداً" |
### ج. الاختراق (JBK)
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| JBK-001 | حرجة | اكتشاف عبارة اختراق معروفة ("تجاهل التعليمات"، "DAN"، إلخ) |
| JBK-002 | عالية | صياغة أمان ضعيفة ("الامتثال دائمًا"، "بغض النظر عن أي شيء") |
| JBK-003 | عالية | فتحة هروب لعب الأدوار تقوض قيود الأمان |
| JBK-004 | عالية | توجيه الوكيل للعمل دون تأكيد أو مراجعة بشرية ("المتابعة تلقائيًا"، "لا حاجة لتأكيد") |
| JBK-005 | عالية | تعليمة مسح الأدلة أو تغطية الآثار ("حذف السجلات"، "لا تترك أثرًا") |
| JBK-006 | عالية | صياغة شرعية السياسة مقترنة بطلب إجراء غير آمن ("كمخترق، رفع الصلاحيات") |
| JBK-007 | عالية | انتحال هوية النموذج — يدعي أنه نموذج AI مختلف مع توجيه يتجاوز الأمان |
| JBK-008 | عالية | هجوم ضغط الاستفسار — تعليمة بضغط أو تلخيص استفسار النظام |
| JBK-009 | عالية | حقن تعليمات متداخلة — أوامر حتمية مغلفة في إطار "تلخيص/ترجمة آمنة/غير ضارة" |
### د. استخدام الأدوات غير الآمن (TOOL)
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| TOOL-001 | حرجة | تنفيذ أداة غير محدود ("تشغيل أي أمر"، "تصفح أي مكان"، استبدال قذيفة بـ backtick) |
| TOOL-002 | متوسطة | وصف استخدام الأداة بدون قائمة مسموح بها أو سياسة استخدام |
| TOOL-003 | عالية | ذكر تنفيذ الكود دون قيود بيئة معزولة (sandbox) |
| TOOL-004 | حرجة | مصدر وصف الأداة أو مخططها من متغير يتحكم به المستخدم |
| TOOL-005 | حرجة | مصدر `name` الأداة أو `url` النقطة النهائية من إدخال يتحكم به المستخدم (`req.body`, `req.query`, إلخ) |
### هـ. حقن الأوامر (CMD)
يكشف الأنماط الضعيفة في الكود المحيط بأدوات AI، حيث يمكن لحقن الاستفسار الناجح أن يتصاعد إلى تنفيذ أوامر كامل. مستند إلى CVEs حقيقية وجدت في Gemini CLI من Google بواسطة Cyera Research Labs (2025).
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| CMD-001 | حرجة | بناء أمر قذيفة مع استيفاء متغير غير منقى — JS/TS (`execSync(\`cmd ${var}\``)، Python (`subprocess.run(f"cmd {var}")`)، PHP (`shell_exec($var)`)، Go (`exec.Command` + `fmt.Sprintf`)، Rust (`Command::new` + `format!`) |
| CMD-002 | عالية | تصفية غير كاملة لاستبدال الأمر: يمنع `$()` ولكن ليس backticks، أو العكس |
| CMD-003 | عالية | مسار ملف من `glob.sync` أو `readdirSync` يُستخدم مباشرة في أمر قذيفة دون تنقية |
| CMD-004 | حرجة | استدعاء `subprocess.run`/`subprocess.call` في Python مع `shell=True` ومتغير أو وسيطة أمر f-string |
| CMD-005 | حرجة | استدعاء `shell_exec`, `system`, `passthru`, `exec`, أو `popen` في PHP مع وسيطة `$variable` |
### و. تسميم RAG (RAG)
يكشف الأخطاء المعمارية في خطوط أنابيب الاسترجاع المعزز بالتوليد (RAG) التي تسمح للمحتوى المسترجع أو المستورد بتجاوز التعليمات على مستوى النظام.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| RAG-001 | عالية | تعيين المحتوى المسترجع أو الخارجي إلى `role: "system"` في مصفوفة رسائل |
| RAG-002 | عالية | اكتشاف عبارات شبيهة بالتعليمات ("system prompt:"، "أعد دائمًا"، "لا تحذف أبدًا") داخل حلقة استيعاب المستندات |
| RAG-003 | عالية | كتابة مخزن ذاكرة الوكيل مباشرة من إدخال يتحكم به المستخدم دون تحقق |
| RAG-004 | متوسطة | توجيه الاستفسار النموذج لمعالجة السياق المسترجع كأولوية قصوى، متجاوزًا تعليمات المطور |
| RAG-005 | متوسطة | استرجاع بدون مصدر — إدراج أجزاء في الاستفسار دون التحقق من بيانات المصدر الوصفية |
| RAG-006 | عالية | عدم تطبيق مرشح ACL أو مستوى الثقة قبل دخول الاسترجاع إلى الاستفسار |
### ز. الترميز (ENC)
يكشف تقنيات الحقن والتهرب القائمة على الترميز حيث تُستخدم ترميزات Base64 أو ما شابه لتهريب التعليمات عبر مرشحات تعتمد على النصوص.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| ENC-001 | متوسطة | استدعاء `atob`, `btoa`, أو `Buffer.from(x, 'base64')` على متغير يتحكم به المستخدم بالقرب من بناء الاستفسار |
| ENC-002 | عالية | اكتشاف أحرف تحكم Unicode مخفية (مسافات بعرض صفر، تجاوزات اتجاه الكتابة) بالقرب من كلمات تعليمات رئيسية |
### ح. معالجة الإخراج (OUT)
يغطي جانب الإخراج من خط أنابيب LLM — كيفية استهلاك تطبيقك لاستجابات النموذج. الاستهلاك غير الآمن يمكن أن يحول حمولة حقن الاستفسار إلى استغلال على مستوى التطبيق.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| OUT-001 | حرجة | استدعاء `JSON.parse()` (JS/TS) أو `json.loads()` (Python) على إخراج LLM دون التحقق من المخطط (Zod, AJV, Joi, Pydantic, Marshmallow, إلخ) |
| OUT-002 | حرجة | تقديم Markdown أو HTML مولد من LLM دون استخدام DOMPurify أو ما يعادله من أدوات التنقية |
| OUT-003 | حرجة | استخدام إخراج LLM مباشرة كوسيطة لـ `exec()`, `eval()`, أو `db.query()` |
| OUT-004 | حرجة | استدعاء `eval()` أو `exec()` في Python مع إخراج LLM كوسيطة |
### ط. متعدد الوسائط (VIS)
يغطي انتهاكات حدود الثقة الخاصة بخطوط أنابيب الرؤية والصوت/الفيديو وOCR. المدخلات متعددة الوسائط هي ناقل حقن ناشئ: المهاجم الذي يتحكم في عنوان URL لصورة أو ملف صوتي أو مستند ممسوح ضوئيًا يمكنه استخدام أنماط هذه القواعد لتهريب التعليمات إلى النموذج.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| VIS-001 | حرجة | إعادة توجيه عنوان URL لصورة أو بيانات base64 يقدمها المستخدم إلى API رؤية (gpt-4o, Claude 3, Gemini Vision) دون التحقق من النطاق أو MIME |
| VIS-002 | حرجة | استدعاء `fs.readFile`/`readFileSync` مع مسار يتحكم به المستخدم في ملف يبني أيضًا رسالة API رؤية — تجاوز المسار إلى إدخال متعدد الوسائط |
| VIS-003 | عالية | تغذية مخرجات النسخ الصوتي/الفيديو (Whisper, AssemblyAI, Deepgram, إلخ) مباشرة في رسائل الاستفسار دون تنقية — تسميم RAG عبر مصدر صوتي |
| VIS-004 | عالية | استيفاء مخرجات OCR (Tesseract, Google Vision) في رسالة `role: "system"` أو متغير استفسار النظام |
### ي. سوق المهارات (SKL) — الإصدار 1.1
يستهدف ملفات `SKILL.md` في OpenClaw وأي ملفات markdown داخل أدلة `skills/`. يتم تفعيله عند هجمات التأليف الذاتي، تحميل المهارات عن بُعد، التعليمات المحقونة، إرسال الأوامر غير الآمنة، الوصول إلى مسارات حساسة، ادعاءات رفع الصلاحيات، وبيانات اعتماد مثبتة في YAML frontmatter.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| SKL-001 | حرجة | نص المهارة يوجه الوكيل لكتابة أو تعديل ملفات مهارات أخرى — هجوم تأليف ذاتي يستمر عبر عمليات إعادة تشغيل الوكيل |
| SKL-002 | حرجة | نص المهارة يوجه الوكيل لجلب أو تحميل مهارات من URL خارجي — يسمح للمهاجم بتغيير سلوك المهارة بعد التثبيت |
| SKL-003 | حرجة | نص المهارة يحتوي على عبارات حقن استفسار تستهدف التعليمات الأساسية للوكيل (`تجاهل التعليمات السابقة`, `أنت الآن غير مقيد`, إلخ) |
| SKL-004 | عالية | frontmatter المهارة يستخدم `command-dispatch: tool` مع `command-arg-mode: raw` — يمرر إدخال المستخدم الخام إلى أداة، متجاوزًا التفكير الأمني للنموذج |
| SKL-005 | عالية | نص المهارة يشير إلى مسارات نظام ملفات حساسة (`~/.ssh`, `~/.env`, `/etc/passwd`, `../../`) ليقرأها الوكيل ويحتمل تسريبها |
| SKL-006 | عالية | نص المهارة يدعي صلاحيات مرتفعة أو يوجه الوكيل لتجاوز أو تعطيل المهارات الأخرى المثبتة |
| SKL-007 | حرجة | العثور على قيمة بيان اعتماد مثبتة (مفتاح API، رمز، كلمة مرور) في YAML frontmatter — مكشوفة لأي شخص يستلم أو يثبت المهارة |
| SKL-008 | حرجة | نبض C2 — المهارة تجلب عن بعد دوريًا لاستبدال تعليماتها بصمت بعد تثبيت نظيف |
| SKL-009 | حرجة | إنكار هوية الوكيل — المهارة توجّه الوكيل لإنكار كونه AI، أو الادعاء بأنه بشري، أو تبني شخصية خادعة |
| SKL-010 | حرجة | تهرب من الماسح الضوئي — المهارة تحتوي على نص مصمم صراحةً لتضليل أدوات التدقيق الأمني |
| SKL-011 | حرجة | استمرار SOUL.md / IDENTITY.md — المهارة تكتب تعليمات إلى ملفات هوية الوكيل التي تبقى بعد إلغاء التثبيت |
| SKL-012 | عالية | دودة ذاتية الانتشار — المهارة توجّه الوكيل للانتشار عبر SSH أو `curl\|bash` إلى المضيفات القابلة للوصول |
| SKL-013 | عالية | معاملات مالية مستقلة — المهارة تنفذ معاملات عملات رقمية أو تحتفظ بمفاتيح خاصة دون تأكيد المستخدم لكل معاملة |
> **مسح مهارات OpenClaw:** قم بتشغيل `npx hound scan --dir ./skills` أو أضف `**/skills/**/*.md` و `**/SKILL.md` إلى تكوين `include` الخاص بك. يقوم ContextHound تلقائيًا بإصدار ملفات المهارات كـ `code-block` لتحليل القواعد متعددة الأسطر.
### ك. وكيل (AGT) — الإصدار 1.3 / 1.9
يستهدف المخاطر الخاصة بالأنظمة الوكيلة متعددة الخطوات: حلقات التنفيذ غير المحدودة، كتابات الذاكرة غير المحققة، تسرب إدخال المستخدم إلى تخطيط الوكيل، انتهاكات حدود الثقة بين الوكلاء، وثغرات OWASP الأمنية للذكاء الاصطناعي الوكيل (ASI).
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| AGT-001 | حرجة | معلمة استدعاء الأداة تتلقى محتوى استفسار النظام — قيمة وسيطة `tool_call`/`function_call` تحتوي على محتويات حقول `system:` أو `instructions:` |
| AGT-002 | عالية | حلقة وكيل بدون حد للتكرار أو مهلة — لا يوجد `max_iterations`, `max_steps`, `max_turns`, `timeout`, أو `recursion_limit` في تكوين الوكيل أو الكود |
| AGT-003 | عالية | كتابة ذاكرة الوكيل من إخراج LLM غير محقق — استدعاء `memory.save()`, `memory.add()`, أو `vectorstore.upsert()` مع متغير استجابة نموذج خام |
| AGT-004 | عالية | حقن الخطة — إدخال المستخدم مستوفى مباشرة في استفسار تخطيط الوكيل أو المهمة أو الهدف بدون غلاف حدود الثقة |
| AGT-005 | حرجة | الوكيل يثق في هوية مدعاة دون تحقق تشفيري — قرار الثقة بناءً على حقل `agentId`, `sender`, `source`, أو `from_agent` بدون HMAC, JWT, أو تحقق من سر مشترك |
| AGT-006 | عالية | ربط إخراج الوكيل الخام كمدخل لوكيل آخر دون تحقق — استدعاء `.run()`, `.invoke()`, أو `.generate()` مع `.output`/`.content`/`.result` لوكيل آخر مباشرة كوسيطة |
| AGT-007 | حرجة | تعديل الوكيل لذاته — الوكيل يعيد كتابة `system_prompt`, `instructions`, أو `tools` الخاص به مع محتوى مولّد من LLM في وقت التشغيل |
| AGT-008 | حرجة | ASI03 — الوكيل يستدعي `assumeRole`, `grantAccess`, أو `setPermissions` بقيمة مشتقة من إخراج LLM; رفع صلاحيات عبر حقن الاستفسار |
| AGT-009 | عالية | ASI04 — الوكيل يحمل أداة أو إضافة في وقت التشغيل من مسار متغير أو استيراد ديناميكي، مما يتيح استبدال سلسلة التوريد |
| AGT-010 | عالية | ASI07 — إخراج الوكيل الخام يُمرر إلى وكيل آخر عبر `send`/`route`/`dispatch` بدون HMAC, توقيع JWT, أو تحقق من المخطط |
| AGT-011 | عالية | ASI08 — خطأ في خطوة خطة الوكيل يتم التقاطه بصمت (بدون إعادة رمي، بدون علامة حالة خطأ); تستمر الخطوات اللاحقة على حالة سيئة أو غير كاملة |
### ل. أمان MCP (MCP) — الإصدار 1.7 / 1.8
يغطي مخاطر حدود الثقة وسلسلة التوريد الخاصة ببروتوكول سياق النموذج (MCP). يقدم MCP سطح هجوم جديد: أوصاف الأدوات، عناوين URL للنقل، حمولات الأحداث، والحالة المشتركة عبر الخوادم يمكن أن تحمل حمولات حقن أو رفع صلاحيات.
| المعرف | الخطورة | الوصف |
|--------|---------|-------|
| MCP-001 | حرجة | حقن وصف أداة MCP في استفسار LLM دون تنقية — قيمة `tool.description` الخام تُستخدم في `role: "system"` أو `messages.push()` |
| MCP-002 | عالية | تسجيل أداة MCP باسم أو وصف ديناميكي — الوسيطة الأولى لـ `server.tool()` هي متغير أو قالب نصي، مما يتيح هجمات السحب بعد الموافقة |
| MCP-003 | عالية | معالج `sampling/createMessage` في MCP بدون حارس موافقة بشرية — `setRequestHandler(CreateMessageRequestSchema)` بدون فحص `requireHumanApproval`, `confirm`, أو `approve` |
| MCP-004 | متوسطة | عنوان URL لنقل MCP مبني من متغير — تهيئة `SSEClientTransport` أو `WebSocketClientTransport` بـ `new URL(variable)` بدلاً من سلسلة ثابتة |
| MCP-005 | عالية | نقل stdio في MCP يستخدم `shell: true` — يجعل سلسلة الأمر قابلة لاستيفاء القذيفة وقابلة للحقن إذا كانت أي وسيطة متحكم بها من المستخدم |
| MCP-006 | حرجة | نائب مشوش في MCP — رمز المصادقة من طلب MCP يُمرر إلى API لاحق دون إعادة تحقق; قيمة رأس `Authorization` مصدرها مباشرة من `request.params`, `context`, أو `event` |
| MCP-007 | عالية | تسميم سياق عبر MCP — مخزن سياق مشترك/عمومي مكتوب من إخراج MCP بدون فحص التجزئة أو التوقيع أو المصدر |
| MCP-008 | عالية | أمر نقل stdio في MCP محمل من مسار متغير — حقل `command:` في `StdioClientTransport`/`StdioServerTransport` هو متغير بدلاً من سلسلة نصية ثابتة |
| MCP-009 | عالية | استخدام معرف جلسة MCP كقرار مصادقة دون فحص انتهاء الصلاحية — مقارنة مساواة `sessionId`/`connectionId` بدون TTL, `expiresAt`, أو حارس `isExpired` (هجوم إعادة تشغيل) |
| MCP-010 | حرجة | حقن حمولة حدث نقل MCP في سياق LLM دون تنقية — `.data`, `.content`, أو `.payload` للحدث/الرسالة يُستخدم مباشرة في `messages.push()` أو حقل `content:` |
---
## مثال على الإخراج```
=== ContextHound Prompt Audit ===
src/prompts/assistant.ts (file score: 73)
[HIGH] INJ-001: Direct user input concatenation without delimiter
File: src/prompts/assistant.ts:12
Evidence: Answer the user's question: ${userInput}
Confidence: medium
Risk points: 23
Remediation: Wrap user input with clear delimiters (e.g., triple backticks)
and label it as "untrusted user content".
[CRITICAL] EXF-001: Prompt references secrets, API keys, or credentials
File: src/prompts/assistant.ts:8
Evidence: The database password is: secret123.
Confidence: high
Risk points: 50
Remediation: Remove all secret values from prompts. Use environment
variables server-side; never embed credentials in prompt text.
────────────────────────────────────────────────────────
Repo Risk Score: 87/100 (CRITICAL)
Threshold: 60
Total findings: 5
By severity: critical: 2 high: 2 medium: 1
✗ FAILED - score meets or exceeds threshold.
src/ ├── cli.ts # CLI entry point (Commander.js) ├── types.ts # Shared TypeScript types ├── config/ │ ├── defaults.ts # Default include/exclude globs and settings │ └── loader.ts # .contexthoundrc.json loader + env var overrides ├── scanner/ │ ├── discover.ts # File discovery via fast-glob │ ├── extractor.ts # Prompt extraction (raw, code, structured) │ ├── languages.ts # LLM API trigger patterns per language extension │ ├── cache.ts # Incremental scan cache (.hound-cache.json) │ └── pipeline.ts # Orchestrates the full scan; parallel + cache + plugins ├── rules/ │ ├── types.ts # Rule interface and scoring helpers │ ├── injection.ts # INJ-* rules │ ├── exfiltration.ts # EXF-* rules │ ├── jailbreak.ts # JBK-* rules │ ├── unsafeTools.ts # TOOL-* rules │ ├── commandInjection.ts # CMD-* rules │ ├── rag.ts # RAG-* rules │ ├── encoding.ts # ENC-* rules │ ├── outputHandling.ts # OUT-* rules │ ├── multimodal.ts # VIS-* rules │ ├── skills.ts # SKL-* rules │ ├── agentic.ts # AGT-* rules │ ├── mcp.ts # MCP-* rules │ ├── supplyChain.ts # SCH-* rules │ ├── dos.ts # DOS-* rules │ ├── mitigation.ts # Mitigation presence detection │ └── index.ts # Rule registry ├── runtime/ │ ├── index.ts # createGuard() — runtime message inspection API │ ├── inspect.ts # Core inspection logic for live message arrays │ └── types.ts # RuntimeMessage, InspectResult, GuardConfig types ├── scoring/ │ └── index.ts # Risk score calculation and rule filtering └── report/ ├── console.ts # ANSI-coloured terminal output ├── json.ts # JSON report builder ├── sarif.ts # SARIF 2.1.0 report builder ├── githubAnnotations.ts# GitHub Actions annotation formatter ├── markdown.ts # Markdown report with findings tables ├── jsonl.ts # JSONL streaming formatter └── html.ts # Self-contained interactive HTML report attacks/ # Example injection strings (not executed against models) tests/ ├── fixtures/ # Sample prompts for testing ├── rules.test.ts # Unit tests for all rules ├── scoring.test.ts # Unit tests for scoring logic ├── scanner.test.ts # Integration tests for the scan pipeline ├── extractor.test.ts # Unit tests for prompt extraction ├── formatters.test.ts # Unit tests for all report formatters ├── mitigation.test.ts # Unit tests for mitigation detection └── cli.test.ts # CLI integration tests (init, list-rules, exit codes) .github/ ├── action.yml # Reusable composite GitHub Action └── workflows/ └── context-hound.yml # CI workflow
## المعيار
يتضمن ContextHound مجموعة بيانات معيارية موسومة لقياس معدلات الإيجابيات الكاذبة والكشف. قم بتشغيلها بعد البناء:```bash
npm run benchmark
المعيار يفحص مجلدي اختبار:
| الدليل | الغرض |
|---|---|
benchmarks/safe/ | 5 ملفات تحتوي أنماط آمنة حقيقية — توقع 0 نتائج |
benchmarks/unsafe/ | 8 ملفات تحتوي ثغرات حقيقية — قاعدة واحدة لكل ملف |
النتائج على الإصدار v1.4.0:``` File-level FP rate: 0.0% (0 / 5 safe files produced findings) Detection rate: 100.0% (8/8 expected findings triggered)
ينهي المعيار البرمجي (benchmark) تنفيذه برمز خطأ 1 إذا تم العثور على أي إيجابيات خاطئة أو سلبيات خاطئة، مما يجعله مناسبًا كبوابة جودة للدمج المستمر (CI) لتغييرات القواعد. لإضافة عينة اختبار (fixture)، ضع ملفًا في `benchmarks/safe/` أو `benchmarks/unsafe/` وقم بتحديث `benchmarks/labels.json` بالنتائج المتوقعة.
### الدقة / الاستدعاء لكل قاعدة
يطبع المعيار البرمجي أيضًا **جدول إشارات لكل قاعدة** (أسوأ F1 أولاً) بحيث يسهل اكتشاف القواعد منخفضة الدقة — الإيجابيات الخاطئة/الصحيحة، والسلبيات الخاطئة، والدقة، والاستدعاء، وF1 لكل قاعدة معنونة. تأتي أعداد الإيجابيات الخاطئة من عينات الاختبار في `safe/` (الحقيقة الأساسية: صفر نتائج)؛ وتأتي الإيجابيات الصحيحة/السلبيات الخاطئة من عينات الاختبار المعنونة في `unsafe/`. مرر `--report <path>` لإصدار تقرير JSON قابل للقراءة آليًا للوحات المعلومات أو تتبع الاتجاهات في CI:```bash
npm run benchmark -- --report bench-report.json
يجلب ملحق المتصفح ContextHound الكشف الفوري عن حقن الأوامر (prompt injection) إلى Chrome وFirefox. يستخدم نفس محرك القواعد مثل CLI، مُجمَّع ومُحزَّم محليًا — لا طلبات شبكة، ولا خادم خلفي.
الحالة: ملحق Firefox مُباشر — التثبيت من إضافات Firefox. إرسال Chrome في انتظار مراجعة متجر ويب. المصدر متاح على github.com/IulianVOStrut/ContextHound-Extensions.
حبة المسح يظهر مؤشر خفيف بجوار أي إدخال محادثة ذكاء اصطناعي على أي موقع ويب. أثناء الكتابة، يقوم الملحق بمسح النص مقابل 70 قاعدة كشف ويعرض درجة المخاطرة والنتائج في لوحة منسدلة — لا حاجة للتنقل بين الصفحات.
لوحة DevTools افتح أدوات المطور DevTools في المتصفح واختر علامة التبويب ContextHound لمراقبة حركة مرور API لنماذج اللغة الكبيرة (LLM) الحية. يعترض الملحق الطلبات الصادرة إلى OpenAI وAnthropic وGoogle Gemini وMistral وGroq وCohere وDeepSeek وغيرها من الخدمات، ويمسح كل من جسم الطلب والاستجابة بحثًا عن محتوى حقن. تعرض شارة شريط الأدوات أعلى درجة مخاطرة شوهدت في الجلسة الحالية.
ماسح النافذة المنبثقة انقر على أيقونة شريط الأدوات للصق ومسح أي نص يدويًا. مفيد لمراجعة طلب (prompt) أو تعليمات نظام مستلمة من طرف ثالث قبل استخدامها.
لا يتضمن واجهة برمجة تطبيقات HAR الخاصة بأدوات المطور في Chrome وFirefox (onRequestFinished) بشكل موثوق بايتات جسم الطلب للاستجابات المتدفقة/SSE، التي تستخدمها معظم خدمات الدردشة الذكاء الاصطناعي. يحل الملحق هذه المشكلة بنهج من طبقتين:
chrome.webRequest.onBeforeRequest يعترض بايتات الطلب الخام في عامل الخدمة قبل إرسال الطلب، ويخزنها مؤقتًا في chrome.storage.session (مدة الصلاحية: 5 دقائق).onRequestFinished وغياب postData، تجلب صفحة DevTools الجسم المخبأ من عامل الخدمة عبر رسالة POP_BODY_CACHE.لا يجمع الملحق أي بيانات للمستخدم. جميع عمليات المسح محلية. راجع سياسة الخصوصية.
المساهمات مرحب بها. لإضافة قاعدة جديدة:
src/rules/ (أو أنشئ ملفًا جديدًا لفئة جديدة)src/rules/index.tstests/rules.test.tsnpm test للتحقق من اجتياز جميع الاختباراتMIT
| 95 قاعدة أمنية | عبر 14 فئة: الحقن، التسريب، الاختراق، استخدام الأدوات غير الآمن، حقن الأوامر، تسميم RAG، الترميز، معالجة المخرجات، الوسائط المتعددة، سوق المهارات، الوكيل، MCP، سلسلة التوريد، هجمات الحرمان من الخدمة |
| درجة المخاطر الرقمية (0-100) | درجة طبيعية على مستوى المستودع مع عتبات منخفضة ومتوسطة وعالية وخطيرة |
| كشف التخفيف | اللغة الأمنية الصريحة في أوامرك تقلل من درجتك |
| 7 صيغ إخراج | وحدة التحكم، JSON، SARIF، التعليقات التوضيحية في GitHub، Markdown، تدفق JSONL، وHTML تفاعلية |
| GitHub Action مضمنة | تفشل CI عند المخاطر العالية وترفع نتائج SARIF تلقائياً |
| فحص متعدد اللغات | يكتشف استخدام API للنماذج اللغوية في Python وGo وRust وJava وC# وPHP وRuby وSwift وKotlin وVue وBash — وليس فقط TypeScript/JavaScript |
| تصفية القواعد | excludeRules/includeRules مع تركيب glob ذي البادئة (CMD-*)؛ مرشح minConfidence |
| ذاكرة تخزين مؤقت تزايدية | .hound-cache.json يتجاوز الملفات غير المعدلة في عمليات الإعادة؛ --no-cache لتعطيل |
| نظام الإضافات | تحميل قواعد مخصصة من ملفات .js محلية عبر "plugins": ["./my-rule.js"] في التهيئة |
| وضع الأساس / الفرق | --baseline results.json — الإبلاغ والفشل فقط عن النتائج غير الموجودة في فحص سابق |
| وضع المراقبة | --watch يعيد الفحص عند تغيير الملفات ويظهر النتائج التفاضلية |
| فحص متوازي | معالجة متزامنة للملفات (--concurrency <n>، الافتراضي 8) |
| غير متصل بالكامل | لا استدعاءات API، لا تتبع، لا تبعات مدفوعة |
| الرمز | المعنى |
|---|
0 | ناجح — النتيجة أقل من الحد الأدنى، بدون انتهاك failOn |
1 | خطأ غير معالج أو وسائط خاطئة |
2 | تم تجاوز الحد — نتيجة المستودع ≥ الحد، أو تجاوز حد الملف |
3 | انتهاك --fail-on — تم العثور على انتهاك بالخطورة المحددة |
| الخيار | الافتراضي | الوصف |
|---|
include | **/*.{ts,tsx,js,jsx,py,go,rs,java,kt,cs,php,rb,swift,vue,sh,bash,hs,md,txt,yaml,yml,json} | أنماط glob للمسح |
exclude | **/node_modules/**, **/dist/**، إلخ. | أنماط glob لتجاهلها |
threshold | 60 | يفشل إذا كانت درجة المستودع عند هذه القيمة أو أعلى (رمز الخروج 2) |
formats | ["console"] | صيغ الإخراج: console، json، sarif، github-annotations، markdown، jsonl، html |
out | تلقائي | المسار الأساسي لإخراج الملفات |
verbose | false | إظهار التصحيحات والثقة لكل نتيجة |
failOn | غير مضبوط | رمز الخروج 3 عند أول نتيجة من: critical، high، أو medium |
maxFindings | غير مضبوط | التوقف بعد عدد N من النتائج |
excludeRules | [] | معرفات القواعد أو أنماط glob البادئة لتخطيها (مثال: "CMD-*"، "JBK-002") |
includeRules | [] | تشغيل معرفات القواعد هذه فقط (فارغ = تشغيل الكل) |
minConfidence | غير مضبوط | تخطي القواعد الأقل من مستوى الثقة هذا: low، medium، أو high |
failFileThreshold | غير مضبوط | يفشل (رمز الخروج 2) إذا سجل أي ملف منفرد درجة عند هذه القيمة أو أعلى |
concurrency | 8 | الحد الأقصى للملفات التي تتم معالجتها بالتوازي |
cache | true | تمكين ذاكرة التخزين المؤقت للمسح التدريجي (.hound-cache.json)؛ اضبط false أو استخدم --no-cache لتعطيله |
plugins | [] | مسارات لملحقات القواعد المحلية .js؛ يجب أن يقوم كل منها بتصدير Rule أو Rule[] |
baseline | غير مضبوط | مسار إلى تقرير JSON سابق؛ يتم الإبلاغ فقط عن النتائج غير الموجودة في خط الأساس |
| متغير | يتجاوز |
|---|
HOUND_THRESHOLD | threshold |
HOUND_FAIL_ON | failOn |
HOUND_MIN_CONFIDENCE | minConfidence |
HOUND_VERBOSE | verbose (قيمة صحيحة: 1, true, yes) |
HOUND_CONFIG | مسار ملف التكوين |