یک آسیب پذیری (CVE-3-2022) در اجرای تابع هش رمزنگاری SHA-37454 (Keccak) ارائه شده در بسته XKCP (eXtended Keccak Code Package) شناسایی شده است که می تواند منجر به سرریز بافر در هنگام پردازش داده های خاص شود. مشکل ناشی از اشکال در کد پیادهسازی خاص SHA-3 است و نه به دلیل آسیبپذیری در خود الگوریتم. بسته XKCP به عنوان اجرای رسمی SHA-3 معرفی شده است که با ورودی تیم توسعه Keccak توسعه یافته است و به عنوان پایه ای برای توابع SHA-3 در زبان های برنامه نویسی مختلف استفاده می شود (به عنوان مثال، کد XKCP در هشلب پایتون استفاده می شود. ماژول، توابع Sha3 بسته Ruby digest و PHP hash_*).
به گفته محققی که مشکل را شناسایی کرد، او توانست از این آسیبپذیری برای نقض ویژگیهای رمزنگاری تابع هش و یافتن اولین و دومین تصاویر اولیه و همچنین تشخیص برخوردها استفاده کند. علاوه بر این، اعلام شد که یک نمونه اولیه اکسپلویت ایجاد خواهد شد که به اجرای کد در هنگام محاسبه هش یک فایل طراحی شده خاص اجازه می دهد. این آسیبپذیری میتواند به طور بالقوه برای حمله به الگوریتمهای تأیید امضای دیجیتالی که از SHA-3 استفاده میکنند (مثلا Ed448) استفاده شود. جزئیات روش های حمله قرار است بعدا منتشر شود، پس از اینکه آسیب پذیری در همه جا از بین رفت.
هنوز مشخص نیست که این آسیبپذیری در عمل چقدر بر برنامههای موجود تأثیر میگذارد، زیرا برای اینکه مشکل در کد خود را نشان دهد، باید از محاسبات هش چرخهای در بلوکها استفاده شود و یکی از بلوکهای پردازش شده باید حدود 4 گیگابایت باشد (حداقل). 2^32 - 200 بایت). هنگام پردازش داده های ورودی به یکباره (بدون محاسبه متوالی هش در قطعات)، مشکل ظاهر نمی شود. بهعنوان سادهترین روش حفاظت، پیشنهاد میشود حداکثر اندازه دادههای درگیر در یک تکرار از محاسبه هش محدود شود.
این آسیبپذیری ناشی از خطا در پردازش بلوک دادههای ورودی است. به دلیل مقایسه نادرست مقادیر با نوع "int"، اندازه نادرست داده های در انتظار تعیین می شود که منجر به نوشتن دنباله در خارج از بافر اختصاص داده شده می شود. به طور خاص، در مقایسه از عبارت "partialBlock + instance->byteIOIndex" استفاده شد که منجر به سرریز اعداد صحیح برای مقادیر زیادی از قطعات تشکیل دهنده شد. علاوه بر این، نوع نادرستی cast "(unsigned int)(dataByteLen - i)" در کد وجود داشت که باعث سرریز در سیستم هایی با نوع size_t 64 بیتی شد.
کد مثالی که باعث سرریز می شود: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
منبع: opennet.ru