
أداة لمراقبة العمليات تحاول اكتشاف الاستغلال
أداة لمراقبة العمليات تحاول اكتشاف الاستغلال
[!IMPORTANT] تهديد ناشئ: إصدار أمني حرج لـ PHP في 21 أكتوبر 2026، الساعة 14:00 UTC. أعلن مشروع PHP عنه في 20 أكتوبر (الإعلان): ثغرتان حرجتان، كلتاهما بتقييم CVSS v4.0 9.2. تأتي التفاصيل والإصدارات المتأثرة والإصلاحات مع الإصدار، الذي قد يصدر أبكر إذا أصبحت التفاصيل علنية أو بدأ الاستغلال. استعد لتحديث PHP الآن.
لا يذكر الإعلان نوع هذه العيوب. إذا جعل هجومٌ ما PHP يبدأ تشغيل برامج، فإن process-watcher يعرض كل واحد منها مع سطر الأوامر الخاص به ويمكنه اختياريًا إنهاء العمليات التي تسميها. إنه لا يبحث عن هذه العيوب: لا يمنع شيئًا ويفوّت الشيفرة التي تعمل داخل PHP دون بدء عملية، لذا فهو يضيف طبقة كشف ولا يحل محل الترقيع.
ابدأ من هنا: مراقبة PHP باستخدام process-watcher، أو اقرأ دليل PHP الكامل.
شاهد ما تبدأه الخدمة. يتابع process-watcher خدمةً ما (خادم ويب، خادم تطبيقات، ...) وكل
عملية تنشئها، في الوقت الفعلي، ويسجّل كل بدء وتغيّر برنامج وخروج بصيغة JSON، واختياريًا مع سطر
الأوامر. عندما يشغّل خادم الويب الخاص بك فجأة صدفة أوامر أو curl، ترى ما الذي بدأ، وبواسطة أي عملية ومن أي
خدمة. إنه ملف تنفيذي ثابت واحد لـ Linux (amd64، arm64): نزّله، فُكّ ضغطه، شغّله.
إنه يجعل النشاط مرئيًا؛ ولا يحكم عليه. بناء خط أساس أو تحديد ما يُعد هجومًا متروك لك
أو للنظام الذي يستقبل الأحداث (ملف سجل، SIEM، webhook). اختياريًا يمكنه التفاعل مع عمليات فرعية محددة
باستخدام SIGKILL موجّه (قواعد الإنهاء).
1. نزّل وفُكّ ضغط أحدث إصدار (amd64 أو
arm64، يُكتشف من جهازك؛ تحتوي أسماء الأرشيف على رقم الإصدار، لذا يبحث السطر الثاني عن أحدث وسم):
ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')
VERSION=$(curl -fsSLI -o /dev/null -w '%{url_effective}' https://github.com/Neo23x0/process-watcher/releases/latest | sed 's#.*/##')
curl -fsSLO https://github.com/Neo23x0/process-watcher/releases/download/$VERSION/process-watcher_${VERSION}_linux_${ARCH}.tar.gz
tar xzf process-watcher_${VERSION}_linux_${ARCH}.tar.gz && cd process-watcher_${VERSION}_linux_${ARCH}
2. شغّله مقابل الخدمة التي تريد مراقبتها. يتطلب صلاحيات root ونظام Linux 5.15 أو أحدث مع دعم BTF؛
sudo ./process-watcher doctor يخبرك ما إذا كان مضيفك مؤهلاً.
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx هو سلسلة فرعية من اسم الملف التنفيذي لخدمتك (apache2، php-fpm، java، ...). أوقف الوكيل باستخدام
Ctrl-C؛ حيث يكتب الأحداث إلى ./process-watcher.jsonl. يسجّل --capture-argv=true أسطر الأوامر، والتي قد
تحتوي على أسرار (التقاط الوسائط). تفضّل ملفًا؟ حرّر process-watcher.yaml بجوار الملف التنفيذي
(يُعثر عليه تلقائيًا) وشغّل sudo ./process-watcher.
3. راقب ما تطلقه الخدمة (طرفية ثانية، نفس الدليل؛ يجعل jq ملف JSON قابلًا للقراءة):
sudo tail -f process-watcher.jsonl | jq -r '
select(.event_type=="process.exec" and .lineage.role=="descendant")
| "\(.timestamp[:19])Z \(.root.image) > \(.process.image) \(.process.argv // [] | join(" "))" | gsub("[[:cntrl:]]"; "?")'
مثال: خدمة تُسمى nginx يتم جعلها تشغّل صدفة وعددًا من البرامج (محاكاة ببرنامج بديل):
2026-10-17T19:15:16Z nginx > dash sh -c id; uname -s
2026-10-17T19:15:16Z nginx > id id
2026-10-17T19:15:16Z nginx > uname uname -s
2026-10-17T19:15:16Z nginx > curl curl --version
2026-10-17T19:15:16Z nginx > sleep sleep 1
خادم ويب أو خادم تطبيقات يبدأ قشورًا (shells) أو أدوات تنزيل أو مفسّرات (sh، curl، wget، nc، python،
...) هو أثر كلاسيكي لقوقعة ويب أو تنفيذ تعليمات برمجية عن بُعد. تُتبَّع جميع الأجيال، حتى بعد انتهاء العملية الأصلية.
(jq يجمع الوسائط للعرض فقط؛ يحتفظ الحدث بها كمصفوفة. يظهر sh باسم dash
لأن الصورة هي البرنامج الذي نُفِّذ فعليًا.)
التالي: أبقِه قيد التشغيل كـخدمة systemd · أرسل الأحداث إلى SIEM أو خط أنابيب السجلات لديك
عبر --tcp-address أو --udp-address أو --webhook-url (المخرجات) · أنهِ العمليات الفرعية المشبوهة
تلقائيًا (قواعد الإنهاء).
| المتطلب | القيمة |
|---|---|
| نظام التشغيل | Linux، amd64 أو arm64 |
| النواة | 5.15 أو أحدث مع BTF (/sys/kernel/btf/vmlinux). رقم الإصدار وحده ليس ضمانًا: عند البدء يتحقق الوكيل من الدوال وحقول بنية النواة التي يحتاجها. |
| الصلاحيات | root، أو CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE لـ /proc/<pid>/exe لعمليات المستخدمين الآخرين، CAP_KILL لميزة الإنهاء، CAP_SYS_RESOURCE قبل النواة 5.11). يمنع قفل النواة confidentiality التشغيل. |
| فضاء أسماء PID | فضاء أسماء PID الأولي للمضيف (جميع PIDs هي PIDs المضيف)؛ يُرفض التشغيل داخل حاوية. |
إذا كان أحد المتطلبات مفقودًا، يتوقف الوكيل مع تشخيص ملموس ورمز خروج 3؛ ولا يلجأ أبدًا إلى
استقصاء /proc، الذي قد يفوّت العمليات قصيرة العمر. يتحقق sudo ./process-watcher doctor من كل شيء، ويحمّل
البرامج ويشغّل عملية فحص خاصة به. النوى المُختبَرة: docs/compatibility.md.
# in the directory the archive was downloaded to, with $VERSION and $ARCH from step 1
curl -fsSLO https://github.com/Neo23x0/process-watcher/releases/download/$VERSION/SHA256SUMS
sha256sum --check --ignore-missing SHA256SUMS
gh attestation verify process-watcher_${VERSION}_linux_${ARCH}.tar.gz --repo Neo23x0/process-watcher # build provenance
كل أرشيف يحتوي على الملف التنفيذي الثابت الواحد (برامج eBPF مضمّنة؛ لا حاجة لشيء آخر وقت التشغيل)، وملف التهيئة المثال المعلّق عليه process-watcher.yaml، وملف LICENSE، وأسفل php/ يوجد ملفّا تهيئة عدة PHP في emerging-threats/، قابلان للاستخدام فورًا (process-watcher --config php/php-observe.yaml)، وفي packaging/ توجد وحدة systemd مع السكربت الذي يثبّتها. تتوفر فقط amd64 وarm64: يفترض جامع eBPF مؤشرات نواة 64-بت، لذا لا تُدعم أنوية 32-بت (x86، ARM).
من الأرشيف بعد فك الضغط:
sudo ./packaging/install.sh ./process-watcher # binary, configuration and unit; starts nothing
sudoedit /etc/process-watcher/config.yaml # adjust the watch list
sudo process-watcher doctor
sudo systemctl enable --now process-watcher
التفاصيل، والتثبيت من نسخة مستنسخة من المستودع، وأسباب إعدادات الوحدة: packaging/INSTALL.md. بدون systemd، انسخ الملف التنفيذي وابدأه بصلاحيات الجذر.
# Log file elsewhere, remote outputs and an exclusion
sudo ./process-watcher --watch-image-contains nginx --exclude-image-contains legitimate-helper \
--log-file /var/log/process-watcher/events.jsonl \
--tcp-address collector.example.net:9000 --udp-address 192.0.2.20:9001 \
--webhook-url https://collector.example.net/hooks/processes
# YAML plus overriding single values
sudo ./process-watcher --config /etc/process-watcher/config.yaml \
--watch-image-contains nginx --watch-image-contains apache2 --capture-argv=true