یک آسیبپذیری امنیتی با سطح اهمیت بالا (High) در پایگاه داده openGauss-server شناسایی شده است که میتواند منجر به تخریب حافظه (Memory Corruption) در سطح سرور شود.
جزئیات فنی
این نقص امنیتی در تابع HllObjectUnpack() واقع در مسیر src/gausskernel/cbb/utils/hll/hll.cpp قرار دارد. این تابع وظیفه باز کردن (Unpacking) اشیاء HyperLogLog (HLL) را بر عهده دارد. مشکل اصلی در فرآیند اعتبارسنجی طول دادهها (Length Validation) نهفته است.
هنگام تجزیه دادههای ارائه شده توسط کاربر، این تابع مقادیر lenUsed و lenTotal را استخراج میکند. اگرچه سیستم بررسی میکند که طول ورودی برای پوشش دادن هدر و مقدار lenUsed کافی باشد، اما دو خطای حیاتی در منطق برنامه رخ میدهد:
- عدم بررسی اینکه آیا
lenTotalبزرگتر یا مساویlenUsedهست یا خیر. - استفاده از مقدار
lenUsedبه عنوان اندازه مقصد در تابعmemcpy_s()، به جای استفاده از اندازه واقعی تخصیص داده شده (lenTotal).
این نقص باعث میشود که مکانیزمهای امنیتی کپی داده نتوانند از نوشتن فراتر از محدوده (Out-of-bounds write) جلوگیری کنند و در نتیجه منجر به آسیبپذیری از نوع Heap Overflow شود.
بردار حمله (Attack Vector)
ورودیهای SQL مانند hll_in()، hll_print() و hll_cardinality() همگی از مسیر باز کردن (Unpacking) مذکور استفاده میکنند. یک کاربر با دسترسی معمولی به پایگاه داده میتواند با ساخت یک شیء HLL دستکاری شده (Malformed) که در آن lenTotal کوچکتر از lenUsed باشد، یک حمله Heap Out-of-Bounds Write را علیه سرور اجرا کند که میتواند منجر به از کار افتادگی سرویس یا اجرای کد از راه دور شود.