🛠 ریشه فنی باگ CVE-2025-27363: وقتی ریاضیات کدهای C به نفع هکرها کار میکند!
در این پست به سراغ ریشه محاسباتی خطای سرریز در فایل src/truetype/ttgload.c و نحوه تحریک آن میرویم.
📐 ریاضیات سرریز (Signed-Short Truncation):
در مسیر پردازش فونتهای متغیر (GX_VAR_SUPPORT)، برنامه تعداد زیر-گلیفهای یک فونت ترکیبی را میخواند.
مهاجم تعداد این اجزا را برابر با عدد 0xFFFD (معادل 65,533) قرار میدهد.
کد برنامه این مقدار را به یک عدد ۱۶ بیتی علامتدار (FT_Short) تبدیل میکند که باعث میشود این عدد بزرگ به ۳- تبدیل شود!
فرمول تخصیص حافظه برای نقاط فرضی فونت limit + 4 است؛ در نتیجه:
1 = 4 + 3-.
کتابخانه FreeType به جای فضای بزرگ، تنها حافظهای به اندازه ۱ اسلات (۱۶ بایت) اختصاص میدهد (FT_NEW_ARRAY).
اما در خطوط بعدی، برنامه اقدام به نوشتن ۴ اسلات داده میکند! اسلات اول درون محدوده است ولی ۳ اسلات بعدی دادههای کنترلشده توسط هکر را دقیقاً ۱۶، ۳۲ و ۴۸ بایت خارج از محدوده مجاز حافظه هیپ (OOB Write) بازنویسی میکنند.
📝 مدل کد لایه C برای اجرای تریگر (Harness PoC):
با بارگذاری فونت دستکاری شده به عنوان Named Instance، اولین فراخوانی تابع رندر فونت، باگ را شلیک میکند:
// تریگر کردن باگ در زمان بارگذاری فونت مخرب
FT_Long face_index = (1L << 16) | 0L;
err = FT_New_Face(lib, font_path, face_index, &face);
// فراخوانی گلیف شماره ۲ (کامپوزیت مخرب) و وقوع کرش
err = FT_Load_Glyph(face, 2, FT_LOAD_DEFAULT);
در تستهای آزمایشگاهی روی گوشی Galaxy S20+ با فعالسازی ابزار AddressSanitizer (ASAN)، خطای heap-buffer-overflow دقیقاً در خط ۱۹۲۹ لایه ttgload.c و روی بایتهای ممنوعه حافظه (Redzone) با موفقیت تأیید و ثبت شد.
در پست آخر، ابعاد فاجعهبار عدم دریافت آپدیت برای ۱ میلیارد دستگاه و راهحل رفع آن را بررسی میکنیم.
🆔 @androidSec_fa
#AndroidSecurity #FreeType #ExploitDev #PoC #AddressSanitizer #HeapOverflow #ReverseEngineering