Hooks

hook interpreter: نبّه إلى نقاط sink لتنفيذ الكود الديناميكي

افحص قاعدة الكود بحثًا عن نقاط sink لتنفيذ الكود الديناميكي في لغات مختلفة، أو قيّم مقتطفًا واحدًا، من سطر الأوامر.

ينبّه hook interpreter إلى نقاط sink لتنفيذ الكود الديناميكي: بنى تحوّل البيانات إلى كود يعمل أو تسلّمها إلى صدفة، من eval إلى إلغاء التسلسل الأصلي. وهو مدرك للغة البرمجة، يقرأ كل ملف بقواعده الخاصة، وهو المحرك الحتمي خلف التخصص interpreter، ويمكنك تشغيله بنفسك في وضع scan أو check.

التشغيل​

npx lagune read interpreter # scans the whole project
npx lagune read interpreter --dir src # scans a directory
npx lagune read interpreter --file app.py # scans a single file

هذه النقاط مزدوجة الاستخدام: لا يستطيع الفحص الثابت الحسم في ما إذا كان مدخل يتأثر به المهاجم يصل إلى إحداها، لذلك كل تطابق تنبيه للمراجعة، لا ملاحظة مؤكدة أبدًا. ويطبع الفحص قسمًا واحدًا هو Dynamic-execution sinks to review، مجمّعًا حسب الملف. والتشغيل النظيف يطبع no dynamic-execution sinks found.

اقرأ الكود المُنبَّه إليه، ولا تشغّله أبدًا!

حلّل كل نقطة sink بشكل ثابت، بتتبّع ما إذا كان مدخل غير موثوق يصل إليها. ولا تنفّذ أبدًا الكود المُنبَّه إليه أو تمرّره إلى eval، ولا أي كود بعيد أو يُجلب وقت التشغيل يستدعيه، بهدف "اختبار" ما يفعله.

كيف تقرأ الحكم​

الحكمالمعنى
carefulيحتوي المقتطف على نقطة sink للتنفيذ الديناميكي في لغته. راجعه بالقراءة، لا بالتشغيل أبدًا.
safeلم يُعثر على نقطة sink للتنفيذ الديناميكي في اللغة المحددة.

خيارات CLI​

الخيارالقيمةالوصف
--patternمقتطف كودتحقق من مقتطف واحد. كرّره للتحقق من عدة مقتطفات، بحكم في كل سطر.
--langلغة برمجةمطلوب مع --pattern: واحدة من javascript و python و php و ruby و java و kotlin و go و rust و c و cpp و csharp.
--dirدليليحصر الفحص في دليل. يتكرر ويُجمع مع --file.
--fileملفيحصر الفحص في ملف واحد. يتكرر ويُجمع مع --dir.

دون أي خيار، يفحص المشروع كله. ويحتاج --pattern إلى --lang ولا يمكن جمعه مع --dir أو --file.

اختر ما يفحصه​

يستثني ما يتجاهله Git. ولاستثناء المزيد، أو لفحص ما يتجاهله Git، امنح interpreter إعدادات خاصة به:

npx lagune write add --ignore test/fixtures --checker interpreter
{
"checkers": {
"interpreter": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

تشرح صفحة إعداد hooks كل إعداد.

اللغات المدعومة​

يقرأ الفحص هذه اللغات، بحسب امتداد الملف، ويُفحص كل منها مقابل مجموعة نقاط sink للتنفيذ الديناميكي الخاصة به.

#اللغةالامتداداتنقاط sink التي ينبّه إليها
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .rioteval()، والمُنشئ Function، و setTimeout/setInterval بجسم نصي، والوحدة vm، والتنفيذ عبر child_process، و require() الديناميكي، و import() الديناميكي
2Python.py, .pyieval/exec، و __import__()، و os.system/os.popen، و subprocess مع shell=True، و pickle.load/loads، و yaml.load (غير الآمن)
3Ruby.rbعائلة eval (instance_eval/class_eval/module_eval/eval)، و system/exec، و backticks أو %x، و Kernel#open / IO.popen/read/binread / Open3، و Process.spawn، و Marshal.load
4Go.goexec.Command/exec.CommandContext، و plugin.Open
5PHP.phpeval()، و assert() على نص، و create_function()، والتنفيذ في الصدفة (system/exec/shell_exec/passthru/popen/proc_open)، و call_user_func/call_user_func_array، و include/require بمسار يُحدَّد وقت التشغيل
6Rust.rsCommand::new، و process::Command
7Java.javaRuntime.exec، و ProcessBuilder، و ScriptEngine، و ObjectInputStream.readObject
8Kotlin.kt, .ktsنقاط sink في JVM: Runtime.exec، و ProcessBuilder، و ScriptEngine، و ObjectInputStream.readObject
9C#.csProcess.Start / new Process، و BinaryFormatter، و Assembly.Load
10C.c, .hsystem()، و popen()، وعائلة exec* (execl، و execve، و execvp، …)
11C++.cc, .cpp, .cxx, .hpp, .hh, .hxxsystem()، و popen()، وعائلة exec* (execl، و execve، و execvp، …)
أفضل جهد، لا تغطية شاملة

يقرأ الكود المصدري كنص، لذلك قد تفلت منه نقطة sink تُجمَّع وقت التشغيل، أو تختبئ خلف اسم بديل، أو تُكتب بصيغة لا يتعرف عليها. تعامل مع الجدول كنقطة بداية قوية، لا كجرد كامل.

تلميح

يضمن hook الحد الأدنى (وجود هذه النقاط ومواضعها): أما ما إذا كانت قيمة غير موثوقة تصل إلى إحداها فعلًا، فهو الحكم الذي يغطيه التخصص interpreter.

الأسئلة الشائعة

لا. ينبّه إلى نقاط sink للتنفيذ الديناميكي كتنبيه للمراجعة، لا كملاحظة مؤكدة أبدًا، لأن الفحص الثابت لا يستطيع الحسم في ما إذا كان مدخل يتأثر به المهاجم يصل إلى نقطة sink.

يقرأ اللغات الواردة في جدول اللغات المدعومة، بحسب امتداد الملف، ويُفحص كل منها مقابل مجموعة نقاط sink الخاصة به. ولا تنتج اللغات الأخرى أي نقاط sink.