RCE وردپرس رو هوش مصنوعی با ۲۵ دلار پیدا کرد
خلاصهٔ کاملتر
نویسندهٔ مقاله، آدام کیوس از تیم Searchlight Cyber، میگه بعد از انتشار مدل جدید OpenAI دیده که این مدل یه حدس معروف ریاضی رو حل کرده و OpenAI پرامپتش رو هم عمومی کرده. با خودش فکر کرده اگه این پرامپت برای مسئلههای سخت ریاضی جواب میده، احتمالاً برای تحقیق امنیتی هم کار میکنه. برای همین همون پرامپت رو کمی تغییر داده و مدل رو با چهار ایجنت موازی و حداقل شش ساعت زمان، روی سورس وردپرس گذاشته.
به گفتهٔ نویسنده چند تا نکته تو تنظیم پرامپت مهم بوده: قبل از شروع پوشهٔ .git رو حذف کرده تا مدل از تاریخچهٔ تغییرات تقلب نکنه، صریح گفته باگ باید تو یه نصب معمولی و بدون احراز هویت قابل بهرهبرداری باشه تا مدل شرطهای غیرواقعی نسازه، و یه پوشهٔ third_party/ گذاشته که مدل بتونه سورس کتابخونههای وابسته رو هم بخونه بهجای اینکه دربارهٔ APIها تو اینترنت سرچ کنه.
باگ اصلی تو Batch API وردپرسه؛ همون قابلیتی که از نسخهٔ ۵.۶ اجازه میده چند درخواست API رو تو یک درخواست بفرستی. تو مسیر عادی، وردپرس برای هر درخواست اول پارامترها رو اعتبارسنجی و پاکسازی میکنه و بعد هندلر رو اجرا میکنه. ولی Batch API این کارو تو دو حلقهٔ جدا انجام میده و وقتی یه درخواست خراب باشه، فقط آرایهٔ اعتبارسنجی یه عضو جدید میگیره و آرایهٔ هندلرها جا میمونه.
همین یه continue باعث میشه اندیس دو آرایه از هم بیفته: نتیجهٔ اعتبارسنجی یه درخواست به هندلر درخواست بعدی وصل میشه. یعنی مهاجم میتونه یه پارامتر رو با قوانین یه اندپوینت دیگه اعتبارسنجی کنه و بعد روی اندپوینتی اجراش کنه که اصلاً انتظارش رو نداشته. نتیجهاش دور زدن کامل پاکسازی پارامترهاست، روی هر اندپوینتی که Batch رو پشتیبانی میکنه.
سینکِ ماجرا پارامتر author__not_in تو لیست کردن پستهاست. اگه ورودی آرایه باشه هر عضوش با absint به عدد تبدیل میشه، ولی اگه یه رشتهٔ ساده بدی، دستنخورده و بدون escape مستقیم میشینه وسط کوئری SQL. تو حالت عادی اعتبارسنجی نمیذاره همچین ورودیای رد شه، ولی با ناهمترازی Batch API میشه ازش عبور کرد. چون Batch API متد GET رو قبول نمیکنه، مدل همون باگ رو بهصورت بازگشتی روی خود Batch API استفاده کرده تا محدودیت متد هم برداشته شه.
مرحلهٔ بعدی از این هم عجیبتره. رمزها تو دیتابیس هش شدن، پس لو رفتن دیتابیس بهتنهایی برای گرفتن حساب ادمین کافی نیست. مدل بهجاش رفته سراغ کش درونحافظهای پستها: با یه تزریق از نوع UNION پستهای جعلی برمیگردونه، بعد با قابلیت embed وردپرس اون پستهای جعلی رو به ردیف واقعی دیتابیس تبدیل میکنه، از اونجا یه پست از نوع customize_changeset میسازه که با شناسهٔ کاربر ۱ یعنی ادمین اعمال میشه، و آخرش با هوکهای داینامیک وردپرس اون نقش ادمین موقتی رو نگه میداره.
نویسنده میگه فهمیدن کاری که مدل کرده خیلی بیشتر از نوشتنش وقت برده؛ مدل حدود چهار ساعت گذاشته ولی خودش یه روز کامل صرف باز کردن زنجیره و آماده کردن گزارش برای وردپرس کرده. کل هزینه حدود ۵۰ درصد سهمیهٔ هفتگی اشتراک ۲۰۰ دلاری بوده، یعنی تقریباً ۲۵ دلار. تیم Searchlight انتشار جزئیات رو هم عقب انداخته تا مدیرهای سایتها فرصت بهروزرسانی داشته باشن و یه ابزار آنلاین برای بررسی آسیبپذیر بودن نصب هم منتشر کرده.
نکات کلیدی:
- باگ پیش از احراز هویته و تو هستهٔ وردپرسه، نه یه افزونهٔ جانبی
- ریشهاش یه continue توی حلقهٔ اعتبارسنجی Batch API هست که آرایهٔ اعتبارسنجی و آرایهٔ هندلرها رو ناهمتراز میکنه
- زنجیره از یه SQL Injection فقطخواندنی شروع میشه و با کشپویزنینگ و changeset به اجرای کد از راه دور میرسه
- مدل حدود چهار ساعت کار کرده و مجموع هزینه نزدیک ۲۵ دلار بوده
- اگه وردپرس اجرا میکنی، سریعترین کار بهروزرسانی به آخرین نسخهست




