کمپین Gheist: سوءاستفاده گسترده از توکنهای دزدیدهشده GitHub
خلاصهٔ کاملتر
تیم تحقیقاتی Wiz میگه از ۱۵ سپتامبر ۲۰۲۶ داره کمپینی به اسم Gheist رو دنبال میکنه. این کمپین با توکنهای لو رفته GitHub کار میکنه و اسمش رو از user agent درخواستهای API خودش (gheist) گرفته. تا الان بیش از ۱۳٬۵۰۰ برنچ از بیش از ۸۵۰ حساب پیدا شده، از پروژه شخصی تا ریپوهای خصوصی سازمانها.
روش کار اینه: ابزار تو هر ریپو یه برنچ با اسم ci-sync- و شش کاراکتر تصادفی میسازه و فایل .github/workflows/sync-check.yml رو با پیام ci: sync config کامیت میکنه. push شدن همین کامیت workflow رو اجرا میکنه. این workflow متغیرهای محیطی و کل secretهای ریپو رو با base32 انکود میکنه و تو لاگ مینویسه. بعد ابزار لاگ رو با API خود GitHub دانلود میکنه و چند ثانیه بعد اجرا رو پاک میکنه.
سه نکته باعث میشه این کار جواب بده. GitHub فقط وقتی secret رو تو لاگ ماسک میکنه که عین خودش چاپ بشه، پس نسخه انکودشده کامل دیده میشه. گذاشتن permissions: {} فقط GITHUB_TOKEN رو محدود میکنه، نه secretها رو. اگه ریپو deployment environment داشته باشه، ابزار اونا رو تو یه job matrix میذاره تا secretهای production هم بیرون بیاد. چون داده از API خود GitHub خارج میشه، دامنه یا اتصالی برای بلاک کردن وجود نداره.
دو نسخه از ابزار دیده شده که از روی پسوند برنچ (hex یا base36) فرقشون معلومه. نسخه B از ۱۹ اکتبر یه job دوم به اسم sync-host اضافه کرده که فقط روی self-hosted runner اجرا میشه. این job دنبال ۳۱ نوع توکن (از جمله کلیدهای Anthropic و Hugging Face و Groq و NVIDIA)، کلید خصوصی، فایل .env، Terraform state و توکن Kubernetes میگرده و از طریق Docker socket به فایلسیستم میزبان هم سر میزنه. به گفته Wiz این بخش باگهای زیادی داره.
از ۲۸ ژوئیه ۲۰۲۶، GitHub اجراهای مشکوک تو ریپوهای عمومی رو تا تأیید یه collaborator نگه میداره و همه اجراهای عمومی Gheist تو حالت action_required موندن. ولی این کنترل روی ریپوهای خصوصی و GitHub Enterprise Server اعمال نمیشه و اونجا اجراها کامل شدن. همین حسابها تو کمپینهای دیگه مثل پخش بدافزار با ریپوهای کرک، استخراج رمزارز، PolinRider و Megalodon هم استفاده شدن.
پیشنهاد Wiz اینه که برنچهای ci-sync-* و اجراهایی که کمتر از یه دقیقه بعد از تموم شدن پاک شدن رو بگردید. اگه از OIDC برای وصل شدن به ابر استفاده میکنید، لاگهای ابری رو برای role assumption از این برنچها چک کنید. همه secretهای ریپوهای آلوده رو عوض کنید، چون پاک کردن برنچ افشا رو برنمیگردونه. اجراهای نگهداشتهشده sync-check رو هم هیچوقت تأیید نکنید.
نکات کلیدی:
- بیش از ۱۳٬۵۰۰ برنچ از بیش از ۸۵۰ حساب GitHub درگیر شدن
- نشونهها: user agent gheist، برنچ ci-sync- با شش کاراکتر و پیام کامیت ci: sync config
- انکود base32 ماسک کردن secretها تو لاگ GitHub رو دور میزنه
- کنترل تأیید GitHub از ۲۸ ژوئیه فقط ریپوهای عمومی رو پوشش میده
- روی self-hosted runner فایلهای .gdmp_pat و .gdmp_patg و .gdmp_sweep نشونه آلودگیان
- برای مقاومسازی: reviewer روی environmentهای production، محدود کردن OIDC به برنچهای محافظتشده و runnerهای یکبارمصرف بدون Docker socket




