کالبدشکافی接管 اکانت ChatGPT: چطور یه لینک شیر شده کل سشن قربانی رو میداد
نویسنده: آرش لطیفی
زنجیره P1 در chatgpt.com: پیشنمایش HTML + کتابخونه MathLive + JSONP یوتیوب دور CSP. درسهای امنیتی برای هر اپلیکیشنی که iframe، postMessage یا سرویس ثالث داره.
TL;DR — تیم Parameter با ترکیب سه ضعف (listener بدون چک origin در MathLive، innerHTML بدون سانیتایز، و JSONP یوتیوب برای دور زدن CSP) توانست با یک لینک Share عادی، کد دلخواه را در سشن لاگینشده قربانی روی chatgpt.com اجرا کند؛ OpenAI روز ۲۶ اکتبر آن را با شدت P1 رفع کرد.
سناریو حمله: فقط یک کلیک
در اکتبر ۲۰۲۶ تیم پژوهشی Parameter کشف کرد که میشه یک conversation عادی ChatGPT رو با قابلیت همیشگی Share منتشر کرد و لینکش رو برای قربانی فرستاد. قربانی فقط لینک رو باز میکرد — نه نصب اپ، نه Paste کد، نه DevTools. در همون لحظه:
- کد مهاجم با هویت
chatgpt.comاجرا میشد - لیست گفتگوهای قربانی قابل شمارش بود
- محتوای چتهای خصوصی (حتی آنهایی که هرگز share نشده بودند) قابل خواندن بود
- ارسال به سرور خارجی ممکن بود — یعنی takeover کامل اکانت
OpenAI این گزارش را در ۲۶ اکتبر رفع کرد و شدتش را P1 اعلام کرد.
زنجیره: سه ضعف که هرکدام بهتنهایی کافی نبودند
ChatGPT کد HTML را در یک iframe محدود روی دامنه دیگری اجرا میکند (Preview). از داخل آن نمیشد به parent.document دسترسی داشت — ایزولاسیون در ظاهر کار میکرد. سه ضعف این دیوار را برداشت:
| مرحله | ضعف | نتیجه |
|---|---|---|
| ۱ | MathLive listener بدون چک origin و بدون تأیید sender | پیام Preview به صفحه اصلی تزریق شد |
| ۲ | HTML keyboard layout بدون سانیتایز به innerHTML داده شد | DOM injection در صفحه اصلی |
| ۳ | CSP یوتیوب را allow کرده بود؛ oEmbed یوتیوب JSONP اجرا میکرد | دور زدن CSP و اجرای اسکریپت |
گام ۱: mail slot بدون نگهبان
یک گراف ریاضی داخل گفتگو، کتابخونه MathLive را در صفحه اصلی بارگذاری میکرد و listener ای برای پیامهای postMessage ثبت میکرد. MathLive برای تنظیم layout کیبورد مجازی، بدون بررسی origin فرستنده، پیامها را میپذیرفت — و layout اجازه داشت HTML داشته باشد. Preview (فرستنده غیرقابلاعتماد) به این mail slot دسترسی داشت:
گام ۲: innerHTML بدون سانیتایز
وقتی کیبورد باز میشد، MathLive رشته HTML را به innerHTML صفحه اصلی میداد. تابع کمکی createHTML ظاهراً سانیتایز میکرد ولی در واقع فقط رشته را trusted علامت میزد و دستنخورده عبور میداد. مشکل: تگ <script> داخل innerHTML اجرا نمیشود. راهحل مهاجم: iframe با srcdoc — چون فریم توسط صفحه اصلی ساخته میشود، هویت https://chatgpt.com میگیرد و به parent دسترسی دارد.
گام ۳: دور زدن CSP با JSONP یوتیوب
CSP درست inline scripts را بلاک میکرد ولی youtube.com را allow کرده بود. endpoint oembed یوتیوب پارامتر callback را — قبل از اینکه خطای اعتبارسنجی برگرداند — داخل response قرار میداد:
https://www.youtube.com/oembed?callback=globalThis.__marker=31337;void
یعنی خروجی JSONP عملاً کد دلخواه اجرا میکرد. سومین و آخرین حلقه زنجیره.
مرتبط: راهنمای CVE-2026-98432 برای صاحبان فروشگاه — اگر سرور لینوکسی داری همین امروز چکش کن.
درسها برای اپلیکیشن خودت
هر اپیکیشنی که iframe، postMessage یا اسکریپت ثالث دارد این چهار درس را دارد:
- هر listener
postMessageبایدoriginفرستنده را چک کند. «فقط پیام با format درست» کافی نیست — هر صفحهای در هر تبای مرورگر میتواند پیام بفرستد. innerHTMLبهتنهایی سانیتایزر نیست. اگر APIی مثل Trusted Types داری، مطمئن شو policy واقعاً فیلتر میکند نه فقط علامتگذاری.- allowlist CSP به اندازه ضعیفترین دامنه allow شده قوی است. یوتیوب، گوگل فونت، CDNها — هر کدام میتوانند ابزار دور زدن باشند (JSONP، redirect، open redirect chain).
- قابلیتهای «بیخطر» را جدا ارزیابی نکن. گراف + Preview + Share، هرکدام سالم بودند؛ ترکیبشان P1 شد.
چکلیست ممیزی سریع
- [ ] همه
addEventListener("message", ...)هاevent.originرا چک میکنند - [ ] هیچ ورودی کاربر بدون سانیتایز واقعی به
innerHTMLنمیرود - [ ] iframeهای embed شده attribute
sandboxدارند - [ ] CSP را مرور کردم: هر دامنه allow شده واقعاً لازم است؟
- [ ] سرویسهای ثالث (oEmbed، JSONP، widget) را برای قابلیت اجرای کد چک کردم
- [ ] یک link-preview و share-flow مثل یک مهاجم تست کردم
سوالات رایج
Q: آیا این باگ فعلاً خطرناک است؟
A: خیر — OpenAI روز ۲۶ اکتبر ۲۰۲۶ رفعش کرد و گزارش بهعنوان P1 ثبت شد. ارزش این ماجرا درسهای معماری است، نه یک threat فعال.
Q: ربطی به اپ من ندارد، من ChatGPT ندارم
A: دارد. الگوی حمله (postMessage بدون چک origin + innerHTML + allowlist CSP با دامنه ثالث) در هر اپ web با iframe یا widget ثالث تکرارپذیر است. کد و جزئیات از تحلیل Parameter است؛ جای حمله را باید در اپ خودت پیدا کنی.
Q: بعد از این حادثه، Share لینک ChatGPT امن است؟
A: طبق گزارش Parameter، باگ در ۲۶ اکتبر رفع شد و الزام «فقط باز کردن لینک» دیگر به takeover منجر نمیشود. ولی اصل کلی بماند: هر محتوایی که share میکنی به یک صفحه بیرونی قابل اعتماد ارسال میشود — و هر لینکی که باز میکنی، با سشن تو اجرا میشود.