#regreSSHion #OpenSSH #CVE-2024-6387
اخیرا برنامه OpenSSH که استفاده گسترده ای در پروتکل SSH دارد، دارای یک آسیب پذیری شرایط رقابتی یا Race Condition شده است.
این آسیب پذیری از نسخه 8.5p1 => 9.8p1 که در برابر signal handler آسیب پذیری Race Condition رخ خواهد داد، که به زبان ساده میشود اینکه در یک بازه زمانی مشخص، چندین Thread موازی تلاش میکنند در یک منطقه حافظه برخی فرایند خواندن و برخی فرایند نوشتن را انجام دهند.
اینجا تقدم و تأخر لحظه استفاده و لحظه چک بهم خواهد خورد و آسیب پذیری این امکان رو خواهد داد که شما از 200 درخواست یا Request ارسالی چند مورد رو به اشتباه مجوز تایید بگیرید.
خب حالا نحوه رخداد آسیب پذیری چطور بوده؟ این آسیب پذیری بر روی سیستم عامل های لینوکسی که از کتابخونه glibc بهره میگیرند، قابل بهره برداری است.
چرا که تابع syslog خود تابع async-signal-unsafe را فراخوانی میکند که این تابع از malloc و free برای تخصیص حافظه استفاده میکند که در منطقه سیستم است لذا سطح دسترسی نیز root خواهد بود، همچنین در تابع main_sigchld_handler شرط آسیب قرار دارد.
اخیرا برنامه OpenSSH که استفاده گسترده ای در پروتکل SSH دارد، دارای یک آسیب پذیری شرایط رقابتی یا Race Condition شده است.
این آسیب پذیری از نسخه 8.5p1 => 9.8p1 که در برابر signal handler آسیب پذیری Race Condition رخ خواهد داد، که به زبان ساده میشود اینکه در یک بازه زمانی مشخص، چندین Thread موازی تلاش میکنند در یک منطقه حافظه برخی فرایند خواندن و برخی فرایند نوشتن را انجام دهند.
اینجا تقدم و تأخر لحظه استفاده و لحظه چک بهم خواهد خورد و آسیب پذیری این امکان رو خواهد داد که شما از 200 درخواست یا Request ارسالی چند مورد رو به اشتباه مجوز تایید بگیرید.
خب حالا نحوه رخداد آسیب پذیری چطور بوده؟ این آسیب پذیری بر روی سیستم عامل های لینوکسی که از کتابخونه glibc بهره میگیرند، قابل بهره برداری است.
چرا که تابع syslog خود تابع async-signal-unsafe را فراخوانی میکند که این تابع از malloc و free برای تخصیص حافظه استفاده میکند که در منطقه سیستم است لذا سطح دسترسی نیز root خواهد بود، همچنین در تابع main_sigchld_handler شرط آسیب قرار دارد.
مقدار صفر برای argc در برنامههای لینوکسی. چرا و چگونه؟
همه چیز از بررسی CVE-2021-4034 و کامپایل مجدد PolKit بر روی Ubuntu 22.04 شروع شد! تصمیم داشتم یک نسخهی آسیبپذیر PolKit رو با فعال کردن Debug Symbols کامپایل کرده و مراحل کامل این CVE رو در GDB بررسی کنم. به صورت خلاصه بگم که این آسیبپذیری در باینری pkexec وجود دارد و به کمک آن میتوان LPE انجام داد. یکی از شرایط استفاده از این آسیبپذیری این است که در زمان اجرای pkexec شرط argc==0 برقرار باشد که از طریق آن متغیرهای محلی خوانده شده و بتوان یک library مخرب را بارگذاری نمود.
از آنجایی که pkexec علاوه بر لینوکس بر روی Solaris, BSD هم قابل استفاده است، در مقالهی اصلی این CVE که توسط Qualys Security منتشر شده است متن زیر مشاهده میشود که از الزام argc==0 برای امکانپذیر بودن این LPE خبر میدهد.
OpenBSD is not exploitable, because its kernel refuses to execve() a program if argc is 0
پس فرض من این بود که در نسخههای اخیر لینوکس هم با کامپایل PolKit باید بتوان این آسیبپذیری را تست کرد. این بود که بر روی Ubuntu 22.04 یک نسخهی آسیبپذیر را کامپایل کرده و یک کد ساده به صورت زیر نوشتم که pkexec را اجرا کرده و argc==0 برقرار باشد.
void main() {
char *args[] = { NULL };
char *envs[] = {"SHELL=/bin/bash", 0};
execve("pkexec", args, envs);
}
با اجرای برنامه و زدن strace مشاهده شد که فراخوانی در سطح user طبق انتظار انجام شد.
execve("pkexec", [], 0x7ffe3883b200 /* 1 var */)
ولی دو تا مورد عجیب رخ داد. اول اینکه برنامه در gdb بر خلاف انتظار با argc==1 اجرا شده و argv[0] که اسم برنامه در آن قرار میگیرد و طبق مدل فراخوانی باید NULL میبود برابر “” شده بود. مورد دومی که عجیب بود پیام زیر در dmesg بود.
process 'exploit' launched 'pkexec' with NULL argv: empty string added
با رسیدن به این مرحله به سراغ Ubuntu 20.04 رفتم و همین کد را بر روی آن اجرا کردم که همه چیز طبق انتظار رخ داده و در gdb با رسیدن به main برنامهی pkexec مقدار argc==0 برقرار بوده و امکان تست CVE وجود داشت. اینجا واضح بود که در کرنلهای جدید لینوکس در فراخوانی سیستمی execve تغییراتی اعمال شده است که جلوی اجرای برنامهها با argc==0 گرفته شود. اینجا دیگه لازم بود کد کرنل چک شود!
با رفتن به github و بررسی فایل fs/exec.c کرنل لینوکس مشاهده شد که در تابع اجرای فراخوانی سیستمی execve کد زیر در March 2022 اضافه شده که جلوی اجرای برنامهها با argc==0 را میگیرد.
/*
* When argv is empty, add an empty string ("") as argv[0] to
* ensure confused userspace programs that start processing
* from argv[1] won't end up walking envp. See also
* bprm_stack_limits().
*/
if (bprm->argc == 0) {
retval = copy_string_kernel("", bprm);
if (retval < 0)
goto out_free;
bprm->argc = 1;
}
پس از این به بعد علاوه بر OpenBSD بر روی لینوکس نیز امکان اجرای آسیبپذیریهای این مدلی وجود نخواهد داشت! :-D
پ.ن: در آینده یک ویدئو از شیوهی کامل اجرای این CVE منتشر میکنم.
#linux #kernel #CVE #PolKit #pkexec #execve
همه چیز از بررسی CVE-2021-4034 و کامپایل مجدد PolKit بر روی Ubuntu 22.04 شروع شد! تصمیم داشتم یک نسخهی آسیبپذیر PolKit رو با فعال کردن Debug Symbols کامپایل کرده و مراحل کامل این CVE رو در GDB بررسی کنم. به صورت خلاصه بگم که این آسیبپذیری در باینری pkexec وجود دارد و به کمک آن میتوان LPE انجام داد. یکی از شرایط استفاده از این آسیبپذیری این است که در زمان اجرای pkexec شرط argc==0 برقرار باشد که از طریق آن متغیرهای محلی خوانده شده و بتوان یک library مخرب را بارگذاری نمود.
از آنجایی که pkexec علاوه بر لینوکس بر روی Solaris, BSD هم قابل استفاده است، در مقالهی اصلی این CVE که توسط Qualys Security منتشر شده است متن زیر مشاهده میشود که از الزام argc==0 برای امکانپذیر بودن این LPE خبر میدهد.
OpenBSD is not exploitable, because its kernel refuses to execve() a program if argc is 0
پس فرض من این بود که در نسخههای اخیر لینوکس هم با کامپایل PolKit باید بتوان این آسیبپذیری را تست کرد. این بود که بر روی Ubuntu 22.04 یک نسخهی آسیبپذیر را کامپایل کرده و یک کد ساده به صورت زیر نوشتم که pkexec را اجرا کرده و argc==0 برقرار باشد.
void main() {
char *args[] = { NULL };
char *envs[] = {"SHELL=/bin/bash", 0};
execve("pkexec", args, envs);
}
با اجرای برنامه و زدن strace مشاهده شد که فراخوانی در سطح user طبق انتظار انجام شد.
execve("pkexec", [], 0x7ffe3883b200 /* 1 var */)
ولی دو تا مورد عجیب رخ داد. اول اینکه برنامه در gdb بر خلاف انتظار با argc==1 اجرا شده و argv[0] که اسم برنامه در آن قرار میگیرد و طبق مدل فراخوانی باید NULL میبود برابر “” شده بود. مورد دومی که عجیب بود پیام زیر در dmesg بود.
process 'exploit' launched 'pkexec' with NULL argv: empty string added
با رسیدن به این مرحله به سراغ Ubuntu 20.04 رفتم و همین کد را بر روی آن اجرا کردم که همه چیز طبق انتظار رخ داده و در gdb با رسیدن به main برنامهی pkexec مقدار argc==0 برقرار بوده و امکان تست CVE وجود داشت. اینجا واضح بود که در کرنلهای جدید لینوکس در فراخوانی سیستمی execve تغییراتی اعمال شده است که جلوی اجرای برنامهها با argc==0 گرفته شود. اینجا دیگه لازم بود کد کرنل چک شود!
با رفتن به github و بررسی فایل fs/exec.c کرنل لینوکس مشاهده شد که در تابع اجرای فراخوانی سیستمی execve کد زیر در March 2022 اضافه شده که جلوی اجرای برنامهها با argc==0 را میگیرد.
/*
* When argv is empty, add an empty string ("") as argv[0] to
* ensure confused userspace programs that start processing
* from argv[1] won't end up walking envp. See also
* bprm_stack_limits().
*/
if (bprm->argc == 0) {
retval = copy_string_kernel("", bprm);
if (retval < 0)
goto out_free;
bprm->argc = 1;
}
پس از این به بعد علاوه بر OpenBSD بر روی لینوکس نیز امکان اجرای آسیبپذیریهای این مدلی وجود نخواهد داشت! :-D
پ.ن: در آینده یک ویدئو از شیوهی کامل اجرای این CVE منتشر میکنم.
#linux #kernel #CVE #PolKit #pkexec #execve
🥴3
This media is not supported in your browser
VIEW IN TELEGRAM
#CVE-2025-29927 #Node.js
آسیب پذیری #Bypass_Authorization برای Node.js روی یکی از سایت های برگزار کننده دوره های امنیتی که بواسطه اکسپلویت زیر کشف شد و البته در ویدیو نیز بصورت دستی تست انجام شده است.
این آسیب پذیری ظرفیت دور زدن هر صفحه ای که دارای کنترل سطح دسترسی هست رو داره، اما در تصویر مربوطه هدف بیرون کشیدن اطلاعات حساس نبوده و صرفا گوش زد وجود یک آسیب پذیری بوده است.
https://gist.github.com/a9v8i/91b3f669c1b1927b540a54cbcc8481a5
آسیب پذیری #Bypass_Authorization برای Node.js روی یکی از سایت های برگزار کننده دوره های امنیتی که بواسطه اکسپلویت زیر کشف شد و البته در ویدیو نیز بصورت دستی تست انجام شده است.
این آسیب پذیری ظرفیت دور زدن هر صفحه ای که دارای کنترل سطح دسترسی هست رو داره، اما در تصویر مربوطه هدف بیرون کشیدن اطلاعات حساس نبوده و صرفا گوش زد وجود یک آسیب پذیری بوده است.
https://gist.github.com/a9v8i/91b3f669c1b1927b540a54cbcc8481a5
#CVE-2025-29927 #Bypass_Authorization
آسیب پذیری Bypass Authorization که برای Next.js در نسخه های زیر 13.5.6 و 14.2.25 و 15.2.3 آمده است.
ماجرا از این قرار که Middleware های طراحی شده در Next.js امکان اعمال تغییر در درخواست دریافتی را دارند، قبل از اینکه پارسر کد درخواست رو تحویل بگیره.
دور زدن مکانیزم کنترل سطح دسترسی یا Authorization زمانی انجام میشود که در درخواست ارسالی Header با نام
اگر Header با نام
مقدار
آسیب پذیری Bypass Authorization که برای Next.js در نسخه های زیر 13.5.6 و 14.2.25 و 15.2.3 آمده است.
ماجرا از این قرار که Middleware های طراحی شده در Next.js امکان اعمال تغییر در درخواست دریافتی را دارند، قبل از اینکه پارسر کد درخواست رو تحویل بگیره.
دور زدن مکانیزم کنترل سطح دسترسی یا Authorization زمانی انجام میشود که در درخواست ارسالی Header با نام
x-middleware-subrequest
تنظیم شده که بدان معنی است درخواست به Middleware تحویل داده شود و در شرط خط 707 اومده که زمانی که نام middleware
در آرایه subrequests
قرار داشته باشه پاسخ از نوع ()NextResponse.next
برگشت داده شده و عملیات همزمان با ()Promise.resolve
ادامه پیدا خواهد کرد.اگر Header با نام
x-middleware-subrequest
تعریف شده باشه، Middleware بررسی امنیتی رو نادیده گرفته و درخواست رو به مقصد اصلی هدایت خواهد کرد که اینجا آسیب پذیری رخ خواهد داد.مقدار
MiddlewareInfo.name
میتونه بدست بیاد و مسیر Middleware
امکان تشخیص رو داشته چرا که در مسیریابی pages و با نام middleware.ts_
قرار داشته است.GitHub
Authorization Bypass in Next.js Middleware
# Impact
It is possible to bypass authorization checks within a Next.js application, if the authorization check occurs in middleware.
# Patches
* For Next.js 15.x, this issue is fixed in `15.2...
It is possible to bypass authorization checks within a Next.js application, if the authorization check occurs in middleware.
# Patches
* For Next.js 15.x, this issue is fixed in `15.2...
👍1
#CVE-2025-30397 #JScript #UAF
تشریح اکسپلویتی برای مرورگر هایی که از موتور اجرایی
تکنیک اول: تعریف 16 بیت NOP برای ابتدای Shellcode اصلی، دوم تعریف Shellcode بصورت
تکنیک دوم: ایجاد یک حلقه
یک
به
در تابع
در انتها دقت کنید، تگ
تشریح اکسپلویتی برای مرورگر هایی که از موتور اجرایی
JScript.dll
استفاده میکنند مانند IE 11 ویندوز.تکنیک اول: تعریف 16 بیت NOP برای ابتدای Shellcode اصلی، دوم تعریف Shellcode بصورت
unescape
.تکنیک دوم: ایجاد یک حلقه
for
برای اجرای تکنیک Heap Spray در حافظه Heap برای ایجاد یک فضای مناسب که بتوان در ارجاع دوم Pointer، اقدام به بازنویسی Shellcode کرده برای اجرا.یک
Element
از نوع iframe
ساخته میشود، و src
میشود به about:blank
، اینجا یک حافظه Heap رزرو خواهد شد.به
body
آن sprayTarget
وصل شده، و یک حلقه for
ساخته شده و داخل اون try
زده شده و درون اون contentWindow
میاد یک کد JS رو در eval
اجرا خواهد کرد.در تابع
eval
یک کد JS که final
درش هست که final
حاوی shellcode
بوده، اجرا میشود، همچنین در ادامه یک حلقه for
دیگر تعریف شده که تگ div
یک obj
تعریف شده که با innerHTML
یک Spray نیز اینجا انجام میشود.در انتها دقت کنید، تگ
object
دوباره در victim
تعریف شده و باز به body
اتچ شده است، اینجا UAF رخ خواهد داد و شلکد قبلا نوشته شده اجرا میشود.❤1