
DakshSCRA v0.38-beta
أداة تحليل كود ثابتة مدركة للإطار لمراجعة تلقائية للكود المصدري مع قواعد خاصة بالمنصة، وتحليل التلوث، وتقدير الجهد، وخطوط أساس للكبت.
Daksh SCRA (Source Code Review Assist)```
Author:
- Debasis Mohanty ([email protected])
- Twitter / X: @coffeensecurity
- www.coffeeandsecurity.com
## حول Daksh SCRA
تم تصميم Daksh SCRA (مساعد مراجعة الكود المصدري) لتعزيز كفاءة عملية مراجعة الكود المصدري، مما يوفر نهجاً منظماً ومنسقاً جيداً لمراجعي الكود.
بدلاً من الإبلاغ العشوائي عن كل شيء كمشكلة محتملة، يشجع Daksh SCRA على التحليل المدروس، ويحث على التحقيق في المشكلات المحتملة وتأكيدها. يقلل هذا النهج من التسرع في وضع علامة على كل مصدر قلق محتمل كخلل، مما يقلل من الارتباك والوقت الضائع في النتائج الإيجابية الخاطئة.
### الظهور الأول
تم تقديم Daksh SCRA في البداية خلال جلسة تدريبية لمراجعة الكود المصدري في Black Hat USA 2022 (6-9 أغسطس)، حيث تم عرضه بشكل خفي على جمهور محدد. وكان ظهوره العام الرسمي في Black Hat USA 2023 في لاس فيغاس.
## الميزات والوظائف
- **تحديد مجالات الاهتمام في الكود المصدري:** يشجع على التحقيق والتركيز والتأكيد بدلاً من تصنيف كل شيء بشكل عشوائي كخلل.
- **تحديد مجالات الاهتمام في مسارات الملفات (الأول عالمياً):** يتعرف على الأنماط في مسارات الملفات لتحديد الأقسام ذات الصلة للمراجعة.
- **استطلاع على مستوى البرمجيات لتحديد التقنيات المستخدمة:** يحدد تقنيات المشروع، مما يمكن مراجعي الكود من إجراء عمليات فحص دقيقة بقواعد مناسبة.
- **تقدير الجهد العلمي الآلي لمراجعة الكود (الأول عالمياً):** يوفر نهجاً قابلاً للقياس لتقدير الجهد المطلوب لمراجعة الكود.
- **الفحص المدرك للأطر:** يطبق تلقائياً قواعد خاصة بإطار العمل عند اكتشاف إطار عمل المشروع.
- **تقارير تحليل التلوث:** تقارير تدفق التلوث بتنسيق HTML لكل منصة مع سمات وضع الهاكر ووضع المحترفين.
- **RDL (لغة وصف القواعد):** منطق قواعد خارجي يُشار إليه بـ `rdl_ref` ويُنفذ عبر خط أنابيب `core/rdl_engine.py` - يدعم بوابات مدركة للملفات، وتعبيرات منطقية، وملاحظات المشروع، وبيانات وصفية للمنطق المُصدَّر في التقارير.
- **حالة الفحص / الاستئناف:** حفظ نقاط تفتيش للفحوصات الطويلة واستئنافها بعد الانقطاع.
- **خط الأساس للقمع:** إنشاء وتطبيق خط أساس من النتائج الإيجابية الخاطئة المعروفة لقمعها من التقارير المستقبلية.
- **واجهة الويب:** مشغل فحص قائم على المتصفح مع تغذية وحدة تحكم في الوقت الفعلي ومتصفح لأصول المهام.
> التحسينات النشطة مستمرة. تم التخطيط للعديد من الميزات والتحسينات الجديدة للإصدارات القادمة.
لا تتردد في المساهمة في تحديث أو إضافة قواعد جديدة والتطوير المستقبلي.
إذا وجدت أي أخطاء، أبلغ عنها إلى [[email protected]](mailto:[email protected]).
التوثيق المفصل: [https://dakshlabs.com/#docs](https://dakshlabs.com/#docs)
---
## البدء
هناك طريقتان لتشغيل Daksh SCRA - اختر ما يناسب سير عملك:
| | الأفضل لـ | الانتقال إلى |
|---|---|---|
| 🌐 **واجهة الويب (Docker)** | أسهل طريقة للبدء - أمر واحد، لوحة تحكم في المتصفح، تقدم فحص مباشر، ومتصفح للتقارير والأصول. موصى به لمعظم المستخدمين. | [واجهة الويب (Docker)](#web-ui-docker) |
| 💻 **سطر الأوامر (Python)** | البرمجة النصية، خطوط أنابيب CI، أو تشغيل الفحوصات بدون Docker. | [إعداد سطر الأوامر](#cli-setup) |
يعمل كلا المسارين على نفس محرك الفحص تماماً - واجهة الويب هي واجهة أمامية للمتصفح فوق نفس سطر الأوامر، لذا تكون النتائج متطابقة في كلتا الحالتين.
---
## واجهة الويب (Docker)
أسرع طريقة لتشغيل Daksh SCRA هي من خلال واجهة الويب القائمة على المتصفح، والتي يتم تشغيلها بأمر Docker Compose واحد. تمنحك مشغل فحص، وتغذية وحدة تحكم مباشرة، وسجلاً قابلاً للتصفح للتقارير السابقة، دون الحاجة إلى بيئة Python محلية.
يعمل إعداد Docker على تشغيل واجهة الويب وسطر الأوامر كخدمات مستقلة مبنية من نفس الصورة، لذا يمكنك استخدام أي منهما (أو كليهما) من نفس الحاوية.
### تشغيل واجهة الويب
وضع المقدمة (تتدفق السجلات إلى الطرفية):```bash
docker compose up --build
وضع الفصل / الخلفية:```bash docker compose up --build -d
ثم افتح [http://localhost:8080](http://localhost:8080).
لاستخدام منفذ مختلف:```bash
DAKSH_PORT=9090 docker compose up
أوقف الحزمة باستخدام:```bash docker compose down
### تسجيل الدخول
تتطلب واجهة الويب حسابًا. عند أول تشغيل، يتم إنشاء حساب مسؤول أولي من `DAKSH_ADMIN_USERNAME` / `DAKSH_ADMIN_PASSWORD` (قم بتعيينهما في `.env`)؛ إذا تُرك `DAKSH_ADMIN_PASSWORD` غير معيّن، يتم إنشاء كلمة مرور عشوائية وطباعتها مرة واحدة في سجل بدء تشغيل API - احفظها، حيث لا يمكن استعادتها لاحقًا.
سيُطلب منك تعيين كلمة المرور الخاصة بك (واختياريًا اسم المستخدم) في أول مرة تسجل فيها الدخول. يمكن لحساب المسؤول إنشاء حسابات إضافية عبر نقطة نهاية API `POST /api/v1/auth/users` (لا توجد واجهة مخصصة لهذا بعد). راجع `.env.example` للحصول على القائمة الكاملة لإعدادات المصادقة (مدة الجلسة، أمان ملفات تعريف الارتباط، CORS).
### ما ستحصل عليه
- منشئ أوامر متجاوب لأوضاع الفحص، والاستطلاع، والتقدير، والاستطلاع+التقدير، والقائمة، وPDF من JSON
- بث وحدة التحكم في الوقت الفعلي وتقدم مباشر لكل مرحلة أثناء التنفيذ
- لقطات مصنّفة لكل مهمة لمخرجات HTML / PDF / JSON
- تنقل سريع داخل المتصفح عبر نموذج التشغيل، والبث المباشر، والملفات المصنّفة، والمهام الأخيرة
- متصفح أدلة مدمج لاختيار مسارات الهدف (مراعٍ لنظام التشغيل: Windows، macOS، Linux / Docker)
تحت الغطاء، يظل CLI هو مصدر الحقيقة - فهو يقوم بكل الفحص ويولّد كل مخرجات HTML / PDF / JSON. تشغّل واجهة الويب مهمة نشطة واحدة في كل مرة وتلتقط لقطات لمخرجات كل مهمة مكتملة في `runtime/webui/jobs/<job-id>/artifacts/` بحيث تبقى التقارير السابقة قابلة للوصول.
### تشغيل CLI في Docker
لا تحتاج إلى بيئة Python محلية لاستخدام CLI أيضًا - فهو متاح كخدمة Compose خاصة به، مبنية من نفس الصورة:```bash
docker compose run --rm cli -h
docker compose run --rm cli -r auto -t /scan-targets/path/to/source
ما في الصورة
- خلفية FastAPI + واجهة أمامية لـ Web UI
- كامل واجهة Daksh SCRA CLI، كخدمة منفصلة
- Playwright Chromium، لتوليد ملفات PDF
- وحدات تخزين دائمة
reports/وruntime/ - تثبيت مسارات المضيف بحيث يمكن للفحوصات الوصول إلى أشجار المصدر من داخل الحاوية
نقاط التثبيت الرئيسية:
| نقطة التثبيت | المسار داخل الحاوية |
|---|---|
| مصدر المشروع | /app |
| جذر الفحص الافتراضي | /scan-targets |
| أسماء محركات أقراص المضيف | /host, /host/c, /host/d |
| تثبيتات WSL | /mnt, /run/desktop/mnt/host |
متغيرات البيئة (قم بتكوينها في .env):
| المتغير | الوصف |
|---|---|
DAKSH_PORT | منفذ Web UI (الافتراضي: 8080) |
DAKSH_SCAN_ROOT | دليل الهدف الافتراضي داخل الحاوية |
DAKSH_HOST_SOURCE | مسار المضيف لتثبيته كـ /scan-targets (الافتراضي: /tmp) |
DAKSH_HOST_MOUNT | جذر تثبيت مضيف إضافي |
DAKSH_HOST_C | مسار محرك الأقراص C: في Windows (WSL) |
DAKSH_HOST_D | مسار محرك الأقراص D: في Windows (WSL) |
DAKSH_DESKTOP_MOUNT | مسار تثبيت سطح المكتب في WSL |
DAKSH_BROWSE_ROOTS | تجاوز جذور متصفح الدليل (مفصولة بفواصل) |
DAKSH_ADMIN_USERNAME | اسم مستخدم المسؤول الأولي (الافتراضي: admin) |
DAKSH_ADMIN_PASSWORD | كلمة مرور المسؤول الأولية - يُوصى بشدة بتعيينها صراحةً |
انسخ .env.example إلى .env واضبط المسارات وبيانات الاعتماد لجهازك قبل تشغيل Docker.
إعداد CLI
هل تفضل تشغيل Daksh SCRA مباشرةً مع Python؟ إليك كيفية إعداده محليًا.
المتطلبات الأساسية
- Python 3.8+
- جميع المكتبات المدرجة في
requirements.txt
1. تنزيل Daksh SCRA```bash
git clone https://github.com/coffeeandsecurity/DakshSCRA.git
أو قم بتنزيل أحدث ملف مضغوط من [https://github.com/coffeeandsecurity/DakshSCRA](https://github.com/coffeeandsecurity/DakshSCRA) وفك ضغطه.
### 2. إعداد بيئة افتراضية
> 💡 يمكن إنشاء البيئة الافتراضية في أي مجلد - لا يلزم أن تكون داخل مجلد DakshSCRA.
**الخيار أ: الإعداد بخطوة واحدة (موصى به)**```bash
python setup_env.py
هذا السكربت ينشئ البيئة الافتراضية، ويُثبّت جميع التبعيات، ويُثبّت متصفح Chromium الخاص بـ Playwright (المطلوب لتصدير PDF).
الخيار ب: الإعداد اليدوي
Windows:```bash python -m venv daksh-env .\daksh-env\Scripts\activate
macOS / Linux:```bash
python3 -m venv daksh-env
source daksh-env/bin/activate
ثم قم بتثبيت التبعيات:```bash cd path/to/DakshSCRA pip install -r requirements.txt playwright install chromium
---
## استخدام سطر الأوامر
استخدم `python` داخل بيئة افتراضية، أو `python3` خارجها.
### خيارات سطر الأوامر```
usage: dakshscra.py [-h] [-r RULES] [-f FILE_TYPES] [-v] [-t TARGET_DIR]
[-l {R,RF}] [--recon] [--rs] [--estimate]
[-rpt FORMATS] [--pdf-from-json]
[--json-input-dir PATH] [--pdf-output PATH]
[--pdf-multi-dir PATH] [--pdf-single-only]
[--skip-analysis] [--loc]
[--baseline-file PATH] [--baseline-generate] [--no-baseline]
[--review-config PATH]
[--resume-scan] [--state-file PATH] [--no-state] [--state]
| الخيار | الوصف |
|---|---|
-r RULES | قواعد المنصة (مثل php، java، php,java) أو auto للاكتشاف التلقائي |
-f FILE_TYPES | تجاوز أنواع الملفات الافتراضية للفحص |
-v | مستوى التفصيل (-v، -vv، -vvv) |
-t TARGET_DIR | دليل الكود المصدري المستهدف |
-l {R,RF} | عرض قواعد المنصة + الأطر [R] أو تضمين أنواع الملفات [RF] |
--recon | تشغيل الاستطلاع (اكتشاف المنصة / الإطار / اللغة) |
--rs, --recon-strict | استطلاع صارم: اكتشافات عالية الثقة فقط (يُستخدم مع --recon) |
--estimate | تقدير جهد مراجعة الكود بناءً على حجم قاعدة الكود |
-rpt, --report FORMATS | صيغ التقرير: html، pdf، أو html,pdf (الافتراضي: html) |
--pdf-from-json | إنشاء تقارير PDF من مخرجات JSON الموجودة دون إعادة الفحص |
--json-input-dir PATH | دليل تقارير JSON (الافتراضي: ./reports/data) |
--pdf-output PATH | مسار إخراج PDF واحد (الافتراضي: ./reports/scan/pdf/report.pdf) |
--pdf-multi-dir PATH | دليل إخراج PDF متعدد الملفات (الافتراضي: ./reports/scan/pdf/multi-file) |
--pdf-single-only | إنشاء ملف PDF المدمج الفردي فقط؛ تخطي مجموعة الملفات المتعددة لكل منصة |
--skip-analysis | تعطيل مرحلة المحلل لهذا التشغيل |
--loc | حساب الأسطر الفعالة من الكود |
--baseline-file PATH | ملف خط الأساس للقمع (JSON) |
--baseline-generate | إنشاء خط أساس للقمع من النتائج الحالية |
--no-baseline | تعطيل قمع خط الأساس لهذا التشغيل |
--review-config PATH | ملف فرز النتائج (JSON)؛ قمع النتائج الإيجابية الخاطئة التي تمت مراجعتها سابقًا من التقارير |
--resume-scan | استئناف فحص تمت مقاطعته سابقًا من ملف الحالة |
--state-file PATH | مسار ملف حالة / نقطة تفتيش الفحص المخصص |
--no-state | تعطيل حفظ نقاط تفتيش حالة الفحص لهذا التشغيل |
--state | فرض تمكين حفظ نقاط تفتيش حالة الفحص لهذا التشغيل |
مثال على الاستخدام
-f(أنواع الملفات) اختياري. إذا لم يتم تحديده، يستخدم DakshSCRA أنواع الملفات الافتراضية للمنصة (المنصات) المحددة.```bash
Single platform scan
python dakshscra.py -r php -t /path/to/source
Multiple platforms
python dakshscra.py -r php,java,cpp -t /path/to/source
Auto-detect platform and apply matching rules
python dakshscra.py -r auto -t /path/to/source
Override filetypes
python dakshscra.py -r php -f dotnet -t /path/to/source
Reconnaissance only (no scanning)
python dakshscra.py --recon -t /path/to/source
Reconnaissance + scanning
python dakshscra.py --recon -r php -t /path/to/source
Strict recon (high-confidence detections only)
python dakshscra.py --recon --rs -t /path/to/source
Effort estimation
python dakshscra.py --estimate -t /path/to/source
Scan with HTML + PDF report output
python dakshscra.py -r auto -t /path/to/source -rpt html,pdf
Verbosity levels
python dakshscra.py -r php -v -t /path/to/source # default python dakshscra.py -r php -vvv -t /path/to/source # show all pattern checks
Generate suppression baseline from current findings
python dakshscra.py -r auto -t /path/to/source --baseline-generate
Apply suppression baseline (suppress known FPs)
python dakshscra.py -r auto -t /path/to/source --baseline-file config/suppressions.json
Disable baseline for this run
python dakshscra.py -r auto -t /path/to/source --no-baseline
Apply findings triage / review config
python dakshscra.py -r auto -t /path/to/source --review-config config/review.json
Scan with checkpoint state enabled
python dakshscra.py -r auto -t /path/to/source --state
Resume an interrupted scan
python dakshscra.py -r auto -t /path/to/source --resume-scan
Resume with a custom state file
python dakshscra.py -r auto -t /path/to/source --resume-scan --state-file runtime/scan_state.json
Generate PDF from existing JSON outputs (no re-scan)
python dakshscra.py --pdf-from-json
Generate PDF from a custom JSON directory
python dakshscra.py --pdf-from-json --json-input-dir ./custom/reports/data
Custom output paths for PDF
python dakshscra.py --pdf-from-json --pdf-output ./reports/scan/pdf/custom.pdf --pdf-multi-dir ./reports/scan/pdf/multi-file
Single combined PDF only (skip per-platform set)
python dakshscra.py --pdf-from-json --pdf-single-only
### قواعد وأُطر المنصات المدعومة```bash
python dakshscra.py -l R # List platform rules and framework mappings
python dakshscra.py -l RF # List platform rules, framework mappings, and filetypes
المنصات وأطر العمل المدعومة حاليًا:
| المنصة | أطر العمل |
|---|---|
| dotnet | aspnetcore, entityframework |
| php | codeigniter, drupal, laravel, symfony, wordpress |
| java | hibernate, spring, springboot |
| javascript | angular, express, nestjs, nextjs, react, vue |
| kotlin | ktor, springkotlin |
| python | django, fastapi, flask |
| go | echo, fiber, gin |
| c | freertos |
| cpp | boost, qt |
| android | cordova-android, flutter-android, ionic-android, jetpack, nativescript-android, reactnative-android, xamarin-android |
| ios | cordova-ios, flutter-ios, ionic-ios, nativescript-ios, reactnative-ios, swiftui, uikit, xamarin-ios |
| reactnative | reactnative |
| flutter | flutter |
| xamarin | xamarin |
| ionic | ionic |
| nativescript | nativescript |
| cordova | cordova |
| ruby | rails, sinatra |
| rust | actix, axum, rocket |
| common | - |
للحصول على أحدث المنصات وأطر العمل المدعومة، قم دائمًا بتشغيل:```bash python dakshscra.py -l R
---
## مرجع الإعدادات
### `config/tool.yaml`
يتم التحكم في الإعدادات الافتراضية لوقت تشغيل Daksh SCRA من خلال `config/tool.yaml`.```yaml
state_management:
enabled: false
resume_mode: manual
persist_after_seconds: 300
persist_interval_seconds: 30
default_state_file: runtime/scan_state.json
cleanup_on_success: false
analysis:
run_by_default: true
include_frameworks: true
report_theme: hacker_mode
خيارات تكوين المحلل:
analysis.run_by_defaulttrue: يعمل المحلل تلقائيًا أثناء الفحصfalse: يتم تعطيل المحلل ما لم يتم إعادة تمكينه في التكوين أو عبر CLI
analysis.include_frameworkstrue: تضمين إدخالات المحلل على مستوى الأطر حيث يوجد اكتشاف للأطرfalse: إخراج المحلل على مستوى المنصة فقط
analysis.report_themehacker_mode: سمة محلل حديثة داكنة عالية التباين (افتراضي)professional_mode: سمة محلل حديثة فاتحةboth: إنشاء كلا متغيري السمة جنبًا إلى جنب
تأليف قواعد RDL
RDL (لغة وصف القواعد) هي طبقة منطق القواعد الخارجية في DakshSCRA. في البنية الحالية:
- تظل قواعد XML هي مخزون القواعد وتحمل بيانات وصفية مثل
nameوregexوالأوصاف وscan_configاختياريًا. - يتم تنفيذ منطق RDL بواسطة
core/rdl_engine.py. - توجد ملفات منطق القواعد تحت
rules/scanning/logic/...ويتم الإشارة إليها من XML باستخدام<rdl_ref>. - يتم حل قيم
rdl_refنسبيًا إلىrules/scanning/، على سبيل المثال:logic/php/core/some_rule.rdl->rules/scanning/logic/php/core/some_rule.rdl - يتم تصدير نتائج المنطق إلى JSON التقرير كبيانات وصفية مثل
logic_engineوlogic_sourceوlogic_reasonوlogic_traceوlogic_consulted_filesوlogic_outcome.
لم يعد نموذج <rdl> المضمّن الأقدم هو البنية النشطة ولا ينبغي استخدامه للقواعد الجديدة.
بنية RDL في لمحة```text
XML rule -> regex / exclude / scan_config / descriptions -> rdl_ref -> rules/scanning/logic///.rdl -> core/rdl_engine.py -> pass / fail -> reason / fail_reason -> trace / consulted_files / outcome
#### تسلسل الفحص
بالنسبة لقاعدة المصدر، يقوم DakshSCRA بتقييم المنطق بهذا الترتيب:
1. يقوم Recon باختيار المنصات والأطر المطابقة.
2. يتم تحميل قاعدة XML من `rules/scanning/platform/...`.
3. يقوم `regex` بالعثور على الأسطر المرشحة أو مطابقات الملف الكامل عند وجودها.
4. يقوم `exclude` بإزالة الضوضاء الواضحة لتلك القاعدة، إذا كانت موجودة.
5. يتم تقييم ملف `.rdl` الخارجي من `rdl_ref` مقابل نص الملف الحالي، ومسار الملف الحالي، وجذر المشروع.
6. إذا نجح سكربت RDL، يحتفظ DakshSCRA بالنتيجة ويدمج بيانات تعريف المنطق المُصدَّرة في مخرجات التقرير.
7. إذا فشل سكربت RDL، يتم كتم المطابقة مع سبب فشل RDL وبيانات تعريف تتبع القرار.
بالنسبة لقواعد مسارات الملفات في `filepaths.xml`، ينطبق نفس نموذج `rdl_ref`، لكن موضوع المطابقة هو
المسار النسبي المُطبَّع بدلاً من نص الكود المصدري. في هذا الوضع، يستقبل RDL سلسلة المسار النسبي
كنص الملف الحالي وسياق المسار.
#### هيكل القاعدة الحالي```xml
<rule>
<name>Rule Name</name>
<regex><![CDATA[regex_to_match]]></regex>
<rdl_ref>logic/common/core/insecure_sql_query_unsafe_string_concatenation.rdl</rdl_ref>
<exclude><![CDATA[pattern_to_exclude_lines]]></exclude> <!-- optional -->
<scan_config>...</scan_config> <!-- optional -->
<rule_desc>Short description of what the rule detects.</rule_desc>
<vuln_desc>Why the pattern matters.</vuln_desc>
<developer>Fix guidance for developers.</developer>
<reviewer>Manual confirmation guidance for reviewers.</reviewer>
</rule>
بنية .rdl الحالية```text
VERSION 1 WHEN PRESENT /\b(?:mysql_query|mysqli_query|->query)\s*\(/i WHEN EXPR PRESENT:\$_(GET|POST|REQUEST|COOKIE) && MISSING:\b(?:prepare|bindParam|bindValue|PDO::prepare)\b REPORT AS area_of_interest REASON SQL query execution appears reachable without parameterisation in this file. FAIL_REASON Matching query API was found, but the file also contains prepared-statement indicators. TRACE SQLi gate: input source present and mitigation missing.
#### التخطيط الحالي```text
rules/
└── scanning/
├── platform/
│ ├── php/php.xml
│ ├── java/java.xml
│ └── ...
└── logic/
├── common/core/
├── php/core/
├── php/framework/laravel/
├── mobile/android/core/
├── filepaths/core/
└── ...
دلالات التنفيذ
- يتم تقييم
WHEN PRESENTوWHEN MISSINGوWHEN CURRENT_FILE_MATCHESمقابل نص الملف الحالي. - يتم تقييم
WHEN FILE_NAME_ISوWHEN FILE_PATH_MATCHESمقابل سياق مسار الملف الحالي. - يدعم
WHEN EXPRالمنطق البولياني عبر مسنداتPRESENT:وMISSING:وEXISTS:. - لا يقيّم
OBSERVE PROJECT_HAS_GLOB ... AS ...النتيجة؛ بل يسجل ملفات المشروع ذات الصلة في بيانات التتبع. - تتحكم
REPORT ASوREASONوFAIL_REASONوTRACEفي بيانات التقارير المُصدَّرة. - يمكن كتابة رموز regex إما كأنماط خام أو كـ
/pattern/flags، مع دعمiوmوs.
أوامر RDL المدعومة
| الأمر | السلوك | الاستخدام النموذجي |
|---|---|---|
WHEN PRESENT <regex> | يتطلب وجود نمط في نص الملف الحالي | يتطلب واجهة برمجية خطيرة متزامنة أو حقلًا حساسًا |
WHEN MISSING <regex> | يتطلب غياب نمط من نص الملف الحالي | يمنع الظهور عندما يكون التخفيف موجودًا بالفعل |
WHEN EXPR <expr> | يقيّم التعبيرات البوليانية باستخدام PRESENT: / MISSING: / EXISTS: مع && و` | |
WHEN CURRENT_FILE_MATCHES <regex> | يطابق النص الكامل للملف الحالي | يعيد فحص شروط الملف الكامل المعقدة |
WHEN FILE_NAME_IS <name> | يتطلب تطابق اسم الملف الحالي تمامًا | يحدد قواعد plist / manifest / config |
WHEN FILE_PATH_MATCHES <glob> | يتطلب تطابق المسار النسبي الحالي مع glob | يضيّق قواعد مسارات الأطر/الإعدادات |
UNLESS CURRENT_FILE_MATCHES <regex> | يفشل عندما يطابق الملف الكامل نمط استبعاد | يمنع الحالات الهيكلية الآمنة المعروفة |
OBSERVE PROJECT_HAS_GLOB <glob> AS <label> | يسجل ملفات المشروع ذات الصلة في بيانات التتبع | يُظهر ملفات الإعدادات الداعمة أو الملفات المصاحبة |
REPORT AS <outcome> | يحدد نتيجة القاعدة، عادةً area_of_interest | نتائج صريحة مقاومة للمستقبل |
REASON <text> | السبب المعروض عندما تنجح القاعدة | يشرح لماذا بقيت النتيجة مرئية |
FAIL_REASON <text> | السبب المعروض عندما تمنع القاعدة تطابقًا | يشرح لماذا تمت تصفية النتيجة |
TRACE <text> | يضيف أسطر تتبع للتصحيح/القرار | دعم الترحيل/التصحيح |
تدعم التعبيرات البوليانية في WHEN EXPR:
PRESENT:<regex>MISSING:<regex>EXISTS:<regex>&&و||و!والأقواس
مثال 1 - بوابة حقن SQL في PHP
قاعدة XML:```xml Possible SQL Injection in Query Execution query)\s*\(]]> <rdl_ref>logic/common/core/insecure_sql_query_unsafe_string_concatenation.rdl</rdl_ref> <rule_desc>...</rule_desc>
ترجمة:
RDL الخارجي:```text
VERSION 1
WHEN PRESENT /\b(?:mysql_query|mysqli_query|->query)\s*\(/i
WHEN EXPR PRESENT:\$_(GET|POST|REQUEST|COOKIE) && MISSING:\b(?:prepare|bindParam|bindValue|PDO::prepare)\b
REPORT AS area_of_interest
REASON Query execution appears to rely on direct input without parameterisation.
FAIL_REASON Query API matched, but parameterised query indicators were also found in the file.
مثال 2 - قاعدة ملف Android manifest مع فحوصات مدركة للملفات
قاعدة XML:```xml Exported Components Without Permission activity|service|receiver|provider)\s[^>]*android:name="(?P[^"]+)"[^>]*android:exported="true"[^>]*(?:/>|>)]]> <rdl_ref>logic/mobile/android/core/exported_components.rdl</rdl_ref> <scan_config>...</scan_config>
External RDL:```text
VERSION 1
WHEN FILE_NAME_IS AndroidManifest.xml
WHEN CURRENT_FILE_MATCHES /android:exported\s*=\s*"true"/i
WHEN MISSING /android:permission\s*=\s*"/i
REPORT AS area_of_interest
REASON Exported component appears reachable without a permission guard.
مثال 3 - قاعدة منطقة الاهتمام لمسار الملف
قاعدة XML:```xml Admin Section File Path <rdl_ref>logic/filepaths/core/admin_section.rdl</rdl_ref>
ترجمة المحتوى:
RDL الخارجي:```text
VERSION 1
WHEN CURRENT_FILE_MATCHES /(^|\/)(admin|administrator|root)(\/|$)/i
UNLESS CURRENT_FILE_MATCHES /(^|\/)(tests?|docs?|samples?|examples?)(\/|$)/i
REPORT AS area_of_interest
REASON File path suggests privileged application functionality.
FAIL_REASON Path matched an excluded documentation or sample location.
إرشادات التأليف
- اجعل
regexواسعًا بما يكفي لالتقاط المرشحين، ثم استخدم RDL لتصفية السياق. - فضّل
rdl_refلجميع منطق القواعد واحتفظ بملف.rdlبجوار شجرة المنطق المناسبة للمنصة/الإطار. - لا تُضف كتل
<rdl>سطرية جديدة. - استخدم
WHEN PRESENT/WHEN MISSINGللبوابات البسيطة وWHEN EXPRفقط عندما يكون المنطق منطقيًا فعليًا (boolean). - ضع التبرير الموجّه للمراجعين في
REASONوتفسيرات الكبت فيFAIL_REASON. - تعامل مع
PRESENTوMISSINGكفحوصات على مستوى الملف بأكمله. أي تخفيف في أي مكان بالملف يمكن أن يكبت كل تطابق من ذلك الملف. - استخدم
OBSERVE PROJECT_HAS_GLOBلإثراء النتائج بسياق المشروع، وليس كبوابة نجاح/فشل. - حافظ على استقرار مسارات
logic/...واجعلها مقيّدة بالمنصة بحيث تبقى قواعد XML رقيقة وتظل طبقة المنطق قابلة لإعادة الاستخدام.
هيكل مخرجات التقرير
تُكتب جميع المخرجات تحت دليل reports/:```
reports/
├── scan/
│ ├── html/
│ │ ├── report.html # Single-file HTML scan report
│ │ └── multi-file/ # Per-platform HTML report set
│ ├── pdf/
│ │ ├── report.pdf # Single-file PDF scan report
│ │ └── multi-file/ # Per-platform PDF report set
│ ├── recon/
│ │ └── reconnaissance.html # Reconnaissance HTML report
│ └── estimate/
│ └── estimation.html # Effort estimation HTML report
├── analysis/
│ └── /
│ ├── analysis.html # Taint analysis report (default theme)
│ ├── analysis_professional.html # Professional theme (if theme=both)
│ ├── analysis_xref.html # Cross-reference report
│ └── analysis.json # Structured analysis data
└── data/
├── areas_of_interest.json # AoI findings
├── filepaths_aoi.json # File path AoI findings
├── summary.json # Scan summary
├── recon.json # Recon summary
└── analysis.json # Analyzer output
تُكتب ملفات التشغيل (حالة الفحص، السجلات، المخزون) تحت `runtime/`.
عند التشغيل عبر واجهة الويب، يتم أيضًا التقاط لقطات من مخرجات كل وظيفة تحت `runtime/webui/jobs/<job-id>/artifacts/` (انظر [واجهة الويب (Docker)](#web-ui-docker)).
---
## المؤلف
| | |
|---|---|
| الموقع الإلكتروني | [coffeeandsecurity.com](https://www.coffeeandsecurity.com) |
| البريد الإلكتروني | [email protected] |
| تويتر / X | [@coffeensecurity](https://x.com/coffeensecurity) |
| المصدر | [github.com/coffeeandsecurity/DakshSCRA](https://github.com/coffeeandsecurity/DakshSCRA) |
| الترخيص | رخصة جنو العمومية العامة الإصدار 3.0 (GPL-3.0) |
إذا ساعدك DakshSCRA في توفير وقت أو جهد أو تكلفة كبيرة لفريقك، أو قلل الاعتماد على الأدوات التجارية باهظة الثمن، أو حسّن تغطية المراجعة، أو جعل مراجعة الكود أكثر تنظيمًا وفعالية، فلا تتردد في التواصل ومشاركة تجربتك. أنا دائمًا منفتح على الملاحظات المدروسة والمحادثات المثيرة للاهتمام.
وجدت خطأ أو تريد المساهمة؟ افتح مشكلة (issue) أو طلب سحب (pull request) على GitHub.