در اکتبر ۲۰۲۴، تیم امنیتی SlowMist گزارشی از یک آسیبپذیری بحرانی در کیف پول Qubic منتشر کرد که منجر به سرقت حدود ۲.۹۴ تریلیون توکن QU از ۱۴۰۴ کیف پول شده است. این حمله به دلیل یک نقص طراحی در نحوه استفاده از مولد اعداد تصادفی (PRNG) رخ داده است.
ریشه اصلی آسیبپذیری: استفاده از Math.random
بررسیها نشان داد که تابع تولید بذر حساب (seedGen) در این کیف پول، از تابع Math.random() استفاده میکند که یک مولد اعداد تصادفی امن از نظر رمزنگاری (Non-cryptographically secure) نیست. در پیادهسازی V8، این تابع از الگوریتم xorshift128+ استفاده میکند که وضعیت (State) آن تنها ۱۲۸ بیت است و از یک مقدار Entropy ۶۴ بیتی سیستم مشتق میشود. از آنجایی که این فرآیند از رمز عبور کاربر یا هیچ منبع تصادفی ثانویهای استفاده نمیکند، پیشبینی آن امکانپذیر است.
نشت اطلاعات از طریق هدر پروتکل
بخش بحرانی حمله زمانی رخ میدهد که تابع randomizeDejaVu() نیز از همان جریان تصادفی (Random Stream) استفاده میکند تا مقداری را در فیلد dejaVu در هدر بستههای شبکه قرار دهد. این مقادیر در پروتکل به صورت Plaintext (متن آشکار) در شبکه ارسال میشوند. این یعنی یک مهاجم که در شبکه حضور دارد، میتواند نمونههایی از خروجیهای این مولد تصادفی را جمعآوری کند.
الگوریتم بازیابی کلید خصوصی
مهاجم با استفاده از یک روش ریاضی و ابزارهای حلکننده منطقی مانند Z3 Solver، میتواند وضعیت داخلی مولد اعداد را بازیابی کند. طبق تحلیل SlowMist، مشاهده تنها ۶ مقدار متوالی از فیلد dejaVu در شبکه برای بازیابی دقیق ۱۲۸ بیت وضعیت داخلی مولد اعداد کافی است. پس از بازیابی وضعیت، مهاجم میتواند:
- بذر (Seed) تولید شده برای حساب را بازسازی کند.
- کلید خصوصی (Private Key) را از طریق مسیرهای تعیینشده استخراج نماید.
- با جعل امضای SchnorrQ، داراییهای کاربر را منتقل کند.
این فرآیند میتواند به صورت کاملاً خودکار (Automated) انجام شود، زیرا کلید عمومی کاربر نیز در درخواستهای موجود در شبکه قابل مشاهده است و میتواند به عنوان یک Oracle برای تایید صحت بذرهای کاندید استفاده شود.
نتیجهگیری و درسهای امنیتی
این حادثه نشان میدهد که قرار دادن فرآیند تولید کلید و هرگونه خروجی تصادفی که در شبکه قابل مشاهده است، در یک جریان تصادفی غیرامن (Non-CSPRNG)، میتواند امنیت کل سیستم را به شدت کاهش دهد. توصیه میشود پروژههای بلاکچینی حتماً از مولدهای اعداد تصادفی امن از نظر رمزنگاری استفاده کرده و مرزهای اعتماد (Trust Boundaries) را در اطراف فرآیندهای تولید کلید تقویت کنند.