باگ ۲۰ سالهی Call of Duty که یه ایجنت AI تو یه عصر پیداش کرد
خلاصهٔ کاملتر
تیم Zolder نوشته که یه عصر رو گذاشته روی cod_lnxded، یعنی بایناری سرور اختصاصی لینوکسی Call of Duty 1 که مال ۲۰۰۳ه، و از یه ایجنت کدنویسی هوش مصنوعی خواسته دنبال راهی برای اجرای کد روی سرور بگرده. جواب مثبت بود. این بایناری ۳۲ بیتیه و عملاً هیچکدوم از محافظتهای امروزی رو نداره: نه PIE، نه stack canary، نه RELRO، و استکش هم اجراشدنیه.
باگ تو تابع SV_Map_fه؛ همون تابعی که اسم مپ رو میگیره و قبل از هر اعتبارسنجیای میده دست یه نرمالکننده. اون تابع تقریباً این کارو میکنه:
char buf[72];
memcpy(buf, name, strlen(name)); // no bound checkیه بافر ۷۲ بایتی روی استک و یه memcpy که طولش رو خود مهاجم تعیین میکنه. آدرس بازگشت سر buf+76 نشسته، پس یه اسم مپ ۷۶ بایتی بهعلاوهی یه آدرس، مسیر برگشت تابع رو عوض میکنه. یعنی یه سرریز استک کلاسیک که از روی شبکه هم قابل دسترسیه.
سختترین قسمت، فرود اومدن سر جای درست بود. اسم مپ قبل از رسیدن به بافر از MSG_ReadString رد میشه که سر راه بایتها رو دستکاری میکنه: هر بایت 0x80 به بالا نقطه میشه و بایت صفر رشته رو تموم میکنه. آدرسهای libc و استک پر از همین بایتهای بالان و زنده نمیمونن، ولی بخش .text پایین حدود 0x08 نشسته و سالم رد میشه. shellcode هم همین دردسر رو داشت، چون روش معمول فراخوانی syscall روی x86 ۳۲ بیتی دقیقاً از همون بایت فیلترشده استفاده میکنه، پس ایجنت نسخهای ساخت که با sysenter کار میکنه.
نویسنده دربارهی بُرد باگ صادقه: این مسیر از طریق rcon (کنسول ریموت مخصوص ادمین) باز میشه، پس یه RCE بعد از احراز هویته نه بدون احراز هویت. به گفتهی خودش چیزی که واقعاً مهمه ستاپ کاره: یه کانتینر داکر یکبارمصرف که ایجنت آزادانه کرشش بده و دوباره بالا بیاره، بهعلاوهی دسترسی مستقیم به بایناری. اون هنوز تصمیمها رو خودش میگرفته و کار ایجنت رو چک میکرده، چون ایجنت خیلی جاها رو هم اشتباه رفته.
نکات کلیدی:
- بایناری cod_lnxded مال ۲۰۰۳ه و بدون PIE، stack canary و RELRO و با استک اجراشدنی کامپایل شده.
- باگ تو SV_Map_fه: بافر ۷۲ بایتی روی استک، memcpy بدون بررسی طول، و آدرس بازگشت سر buf+76.
- مسیر حمله از دستور map روی rcon میگذره، پس RCE بعد از احراز هویته و به دسترسی اپراتور نیاز داره.
- فیلتر MSG_ReadString بایتهای 0x80 به بالا رو خراب میکنه، برای همین shellcode با sysenter نوشته شده.
- ابزار کار یه کانتینر داکر یکبارمصرف بههمراه Claude Code بوده و کل ماجرا یه عصر طول کشیده.




