
ماسح أسرار دون اتصال يجمع بين قواعد regex والتحليل الدلالي القائم على lexer ومطابقة القيم المجزأة (hashed) لاكتشاف بيانات الاعتماد المكشوفة في الشيفرة مع إخراج SARIF.
على الإطلاق لا!
في عصر الضجة المحيطة بنماذج اللغة الكبيرة (LLM)، لا تزال DeepSecrets تعمل بالكامل على جهازك — مما يمنحك نتائج رائعة دون اتصال بالإنترنت، وبأمان، ومجانًا.
معظم أدوات الفحص الموجودة لا "تفهم" الكود فعليًا. بدلًا من ذلك، تقوم فقط بتحليل النصوص ولديها تغطية ضعيفة.
تسد DeepSecrets الفجوة بين أدوات الفحص الكلاسيكية القائمة على التعبيرات النمطية (regex) وأدوات SAST التجارية الكاملة. فهي توسّع استراتيجية الفحص الكلاسيكية القائمة على التعبيرات النمطية من خلال الاعتماد بشكل كبير على التحليل الدلالي للكود، واكتشاف المتغيرات الخطرة، وتحليل الإنتروبيا المدرك للسياق. وهذا يعني أن مرشحي الأسرار يكونون دائمًا صحيحين دلاليًا. نحقق فهمًا حقيقيًا للكود عبر أكثر من 500 لغة وتنسيق باستخدام تقنيات التحليل المعجمي (lexing) والتحليل النحوي (parsing).
تقدم DeepSecrets أيضًا طريقة جديدة لاكتشاف بيانات الاعتماد دون أي معرفة مسبقة: محرك HashedSecret. ما عليك سوى تقديم القيم المُجزّأة (hashed) لأسرارك الإنتاجية المعروفة، وستجدها الأداة مكشوفة كنص صريح داخل الكود الخاص بك.
تم تقييم DeepSecrets v2.0 (يونيو 2026) مقابل معيار SecretBench وتفوقت على أدوات الفحص التقليدية للنصوص المسطحة:
(يمكنك قراءة القصة الكاملة وراء الكواليس وتفاصيل اختبارات القياس في مقالي على HackerNoon هنا)
من Github عبر pip
$ pip install git+https://github.com/ntoskernel/deepsecrets.git
من PyPi
$ pip install deepsecrets
يحتاج DeepSecrets إلى Python 3.11 أو أحدث.
أسهل طريقة لتشغيل فحص:
$ deepsecrets --target-dir /path/to/your/code --outformat dojo-sarif --outfile report.json
سيؤدي هذا إلى تشغيل فحص على /path/to/your/code باستخدام التكوين الافتراضي:
سيتم حفظ تقرير بصيغة SARIF (متوافق مع DefectDojo وGitHub Security) في report.json.
الأمر --help جاهز دائمًا لإرشادك، لكن إليك أهم الخيارات التي يمكنك استخدامها لتخصيص الفحص وفقًا لبيئتك:
--regex-rules /path/to/rules.json: قدّم مجموعة قواعد regex مخصصة خاصة بك.--hashed-values /path/to/hashes.json: قدّم قائمة بالأسرار الإنتاجية المعروفة والمُجزّأة مسبقًا للبحث عنها بأمان.--excluded-paths /path/to/exclusions.json: تجاوز المسارات الافتراضية التي يتم تجاهلها أثناء الفحص أو توسيعها.--deep-max-size BYTES: الملفات الأكبر من هذا الحجم (الافتراضي 250,000 بايت) تحصل على التحليل السريع: قواعد regex والبحث عن المتغيرات، دون محلل اللغة المعجمي. الملفات الكبيرة تكون في الغالب مُولّدة أو مُصغّرة، ويكلّف المحلل المعجمي معظم وقت الفحص عليها ونادرًا ما يجد المزيد فيها. القيمة 0 تمنح كل ملف التحليل الكامل.--skip-bundles: تخطَّ ملفات JavaScript المُصغّرة وخرائط المصدر والحزم (*.min.js، *.map، *.bundle.js) بالكامل، إضافةً إلى استثناءات المسارات الأخرى.--confidence-level {all,low,medium,high,very-high}: أدنى مستوى ثقة يتم الإبلاغ عنه (الافتراضي low، أي كل النتائج). تحتفظ medium وhigh وvery-high بمستويات الثقة 3 و6 و9 أو أكثر؛ كما تُبلغ all عن مطابقات regex التي رأى الفاحص أنها ليست أسرارًا (عناصر نائبة، أمثلة)، بمعرّف قاعدة -INFO.--report-diagnostics: أضف كل ملف تم العثور عليه ضمن الهدف إلى تقرير SARIF، مع حالته ووقت الفحص وسبب التخطي وعمق التحليل.--regex-candidate-scoring-rules /path/to/rules.json: قدّم قواعدك الخاصة لتقييم مطابقات regex قبل الإبلاغ عنها. أعطِ الخيار دون قيمة للإبلاغ عن مطابقات regex دون تقييم.--multiprocessing-context {forkserver,spawn,fork}: كيفية بدء عمليات العامل. الافتراضي هو forkserver حيثما توفره المنصة (Linux، macOS): تتشارك عمليات العامل الفاحص المحمّل مسبقًا في عملية خادم. يستخدم Windows الخيار spawn. جميع الخيارات الثلاثة تعطي النتائج نفسها.--disable-masking: أبقِ الأسرار المحتملة غير مُقنّعة في تقرير المخرجات (انظر التحذير أدناه).--ci / --no-ci: تشغيل وضع CI أو إيقافه. يطبع وضع CI سطر تقدم بسيطًا كل 30 ثانية بدلًا من عرض التقدم المباشر. يتم تشغيله تلقائيًا داخل خدمات CI (GitHub Actions، GitLab CI، Jenkins وغيرها) وكلما لم تكن المخرجات طرفية.مثال .github/workflows/deepsecrets.yml
name: DeepSecrets Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install DeepSecrets
run: pip install deepsecrets
- name: Run Scan
run: deepsecrets --target-dir . --outformat dojo-sarif --outfile report.sarif
continue-on-error: true
- name: Upload SARIF report
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: report.sarif
اعتبارًا من الإصدار v1.3.0، يتم إخفاء الأسرار المحتملة تلقائيًا داخل التقارير لحماية مخرجات خط أنابيبك (pipeline artifacts). أوقف هذا الخيار عبر العلامة --disable-masking إذا لزم الأمر.
لا يُعطّل الإخفاء منطق إزالة التكرار (deduplication) في المنصات اللاحقة (مثل Github)، لأن قسم partialFingerprints في التقرير يُملأ بشكل صحيح بناءً على البيانات الخام.
[!Caution]
إذا دمجت DeepSecrets في خط أنابيب CI لديك مع تعطيل الإخفاء، فمن المرجح أن تُسرّب أسرارك مجددًا داخل سجلات CI ومخرجاتها.
تحصل كل نتيجة اكتشاف على درجة ثقة. ومع ذلك، تتعامل منصات الأمان المختلفة مع مقاييس SARIF بطرق مختلفة. ولضمان التوافق عبر لوحات تحكم ASPM الحديثة، تقوم DeepSecrets بما يلي:
قواعد فرعية افتراضية (rules[]): تُنشئ قواعد ديناميكيًا حسب فئة الثقة، من S105-LOW مرورًا بـ -MEDIUM و-HIGH وصولًا إلى S105-VERY-HIGH (و-INFO للتطابقات المرفوضة التي يُبلّغ عنها --confidence-level all). وهذا يُجبر GitHub Security وDefectDojo على تعيين تباين الدقة الدلالية بشكل صحيح دون إفساد المحللات الأصلية (native parsers).
مستوى نتيجة حتمي: تُعيّن الأداة دائمًا وبشكل صريح level: error في نموذج results[]. ويعمل هذا كخيار احتياطي شامل لخطوط أنابيب CI/CD ومحللات SAST الأقدم، مما يضمن أن الأسرار المكشوفة تُعطّل عمليات البناء أو تحجب طلبات السحب (Pull Requests) بشكل موثوق بغض النظر عن تفسيرات القواعد الفردية.
رسائل سياقية: تحقن درجة الثقة الرقمية الخام أصليًا داخل result.message.text ليرى محللو الأمان الدرجة فورًا على لوحات التحكم الخاصة بهم.
تقع مجموعة القواعد المدمجة لفحوصات regex في /deepsecrets/rules/regexes.json. لك الحرية في اتباع التنسيق وإنشاء مجموعة قواعد مخصصة.
تقع مجموعة القواعد النموذجية للفحوصات المُجزّأة (hashed) في /tests/fixtures/hashed_secrets.json. لك الحرية في اتباع التنسيق وإنشاء مجموعة قواعد مخصصة.
للبحث عن أسرار إنتاج معروفة دون كشفها كنص صريح داخل مستودعك، قدّم ملف JSON يحتوي على تجزئاتها (hashes):
[
{
"name": "KNOWN-PROD-DATABASE-PASSWORD",
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"length": 12,
"algorithm": "sha1"
}
]
شغّله باستخدام --hashed-values /path/to/hashes.json. سيقوم DeepSecrets تلقائيًا بتجزئة مرشّحي السلاسل النصية أثناء مرحلة التحليل المعجمي لمطابقتها.
تبًا، هل ما زال يعتمد على التعبيرات النمطية (regex)؟
نعم ولا. بالطبع، يستخدم التعبيرات النمطية للعثور على الأسرار المكتوبة مثل أي أداة أخرى. لكن فهم اللغة (مرحلة التحليل المعجمي) واكتشاف المتغيرات يستخدمان أيضًا التعبيرات النمطية في الخلفية. التعبير النمطي أداة، وليس المشكلة. المشكلة هي تطبيق التعبيرات النمطية بشكل أعمى دون سياق دلالي.