باگ JWT که راه ۱۷ تریلیون رکورد مایکروسافت رو باز کرد
خلاصهٔ کاملتر
نویسنده، یه باگهانتر ۱۶ ساله به اسم Faav، تو این مقاله تعریف میکنه چطور تونسته به یه سرویس داخلی مایکروسافت به اسم Titan دسترسی مدیر بگیره. رابط وب Titan پشت VPN بود، ولی ابزار هوش مصنوعی شخصیش به اسم Antares یه API جدا براش پیدا کرد که فایل Swagger عمومی داشت. از چهار route، فقط /v2/Query احراز هویت Azure AD نداشت و همین route هم SQL خام قبول میکرد.
برای اسم جدولها، نویسنده نسخههای قدیمی صفحههای Titan رو از Wayback Machine درآورد و از کانفیگ Superset آرشیوشده ۵۶ تعریف جدول پیدا کرد. بعد Antares ده روز روی بررسیهای JWT (یعنی توکن ورودی که سه بخش header، payload و امضا داره) کار کرد. هر بار یه claim رو عوض میکرد، مثل tenant و audience و app ID، و Titan با همون امضای قبلی قبولش میکرد. این یعنی سرور اصلاً امضا رو چک نمیکرد.
قدم بعدی یه توکن ساختگی بود که الگوریتمش روی حالت none بود و بخش امضاش خالی موند. توکن از همه بررسیها رد شد ولی به خطای «کاربر پیدا نشد» رسید، چون مدلهای هوش مصنوعی فقط آدرسهای ایمیلمانند رو برای claim upn امتحان میکردن. نویسنده یه شب ساعت ۱ بامداد حدس زد که بکاند از upn بهعنوان نام کاربری محلی استفاده میکنه و مقدارشو گذاشت admin. این کاربر شناسه ۱ و نقش Admin داشت و کوئری اجرا شد.
تو دیتابیس متادیتای پلتفرم حدود ۲۵ هزار رکورد حساب و ایمیل، ۱۷۹۹۰ ایمیل کارمند، ۲۴۵۶۹ داشبورد و ۴۲۵۸۹۱ نمودار بود. یه منبع جدا هم دادههای آنالیتیکس جستجوی Bing رو نگه میداشت که نویسنده فقط دو نمونه یکردیفی ازش گرفت. چون شناسه MUID تو چند دیتاست تکرار میشد، از نظر تئوری میشد فعالیت کاربرها رو بین سرویسها به هم وصل کرد، ولی نویسنده میگه این کارو نکرده.
با تست ۵۶ مقدار routing، ۳۰ تاشون هنوز فعال بودن و به ۱۷ دیتابیس ClickHouse وصل میشدن با ۹۸۶۳ جدول. جمع ردیفها از متادیتا حدود ۱۷.۳ تریلیون شد که خود نویسنده میگه احتمالاً دادههای تاریخی و تکراری هم توش هست. باگ ۵ سپتامبر به MSRC گزارش شد، ۹ سپتامبر API بسته شد و ۵۰۰۰ دلار جایزه گرفت. مایکروسافت روی متن نهایی مقاله هم نظارت ویرایشی داشته.
نتیجهگیری نویسنده اینه که هوش مصنوعی کار طاقتفرسا رو جلو برد ولی حدس انسانی گره رو باز کرد. پیامش برای توسعهدهندهها هم سادهست: Titan همه محتوای توکن رو چک میکرد ولی امضا رو نه. یعنی قبل از هر چیز دیگهای، امضای توکن رو تأیید کنید.
نکات کلیدی:
- سرویس Titan امضای JWT رو بررسی نمیکرد و توکن با الگوریتم none و امضای خالی رو قبول میکرد.
- مقدار claim upn بهعنوان نام کاربری محلی استفاده میشد و admin به کاربر شماره ۱ با نقش Admin میرسید.
- route /v2/Query بدون احراز هویت Azure AD، کوئری SQL خام قبول میکرد.
- ۳۰ مقدار routing فعال به ۱۷ دیتابیس ClickHouse و حدود ۱۷.۳ تریلیون ردیف میرسید.
- باگ ۵ سپتامبر ۲۰۲۶ گزارش شد، ۹ سپتامبر بسته شد و جایزهش ۵۰۰۰ دلار بود.




