موتور V8 کد constant-time رو لو داد
خلاصهٔ کاملتر
کد constant-time (یعنی کدی که زمان اجراش به دادههای محرمانه وابسته نباشه) تو رمزنگاری یه اصل پایهست. نویسندهٔ وبلاگ Soatok شش سال پیش کتابخونهٔ constant-time-js رو بهعنوان نمونهٔ آموزشی نوشته بود. حالا تو این پست تعریف میکنه که Yayu Wang، دانشجوی دکترای دانشگاه بریتیش کلمبیا، بهش ایمیل زده و نشون داده همون کد بدون شاخه (branchless) هم روی V8 اطلاعات لو میده.
طبق گزارش، تو سه تابع select، select_alt و select_ints الگوی دسترسی به کش (حافظهٔ نهان پردازنده) به مقدار محرمانهٔ ورودی وابسته میشه. دو تا دلیل داره: اول اینکه !!x کار رو میسپره به مکانیزم ToBoolean موتور که خودش شاخه داره، دوم اینکه V8 مقدارهای true و false رو به شکل شیء Oddball توی آدرسهای ثابت و روی دو cache line متفاوت نگه میداره. پس حتی وقتی دستورهای اجراشده یکسانن، آدرس دادهای که خونده میشه لو میده شرط چی بوده.
مشکل دوم منفیسازیه. الگوی رایج ساختن ماسک تو کد constant-time اینه که عدد رو منفی کنی و ماسک بگیری، ولی تو جاوااسکریپت منفی کردن صفر مقدار ویژهٔ -0 میسازه و V8 اونو جدا از -1 هندل میکنه، پس مسیر اجرا فرق میکنه. نویسنده میگه فقط با خوندن سورس V8، مثلاً تابع Negate، میشه دید این کد اصلاً طوری نوشته شده که کانال جانبی داشته باشه.
راهحل دو قانون ساده بود: هیچجا نوع boolean استفاده نشه و بهجای منفی کردن، از صفر تفریق بشه. تغییر توی select.ts این شکلیه:
const mask: number = (0 - (choice & 1)) & 0xff;نویسنده تأکید میکنه وصله کردن همون سه تابع گزارششده کافی نبوده؛ وقتی رفته دنبال موارد مشابه، نشت دیگهای هم تو is_nonzero() و pow() پیدا کرده که داخل حلقه روی دادهٔ محرمانه صدا زده میشدن. آخر پست هم میگه سطح اطمینان بالاتر فعلاً در دسترس نیست، چون WebAssembly هیچ تضمین constant-time نداره و پیشنهادش چهار ساله بهروز نشده.
نکات کلیدی:
- آسیبپذیری تو نسخههای پیش از 0.5.0 کتابخونهٔ constant-time-js؛ advisory با شناسهٔ GHSA-pgf9-4q65-hrqj
- گزارش از Yayu Wang و همکارانش در دانشگاه بریتیش کلمبیا، تاریخ افشای عمومی ۱۰ سپتامبر ۲۰۲۶
- ریشهٔ نشت: مکانیزم ToBoolean و نگهداری true/false به شکل Oddball روی دو cache line جدا
- الگوی ساخت ماسک با منفی کردن جاش رو به تفریق از صفر داد تا -0 ساخته نشه
- به گفتهٔ پست، WebAssembly هنوز تضمین constant-time نداره و پیشنهادش ۴ ساله بیتغییر مونده




