threat-actor · litellm · agentic-ai · credential-theft · china-nexus

‏keyHunter: عملیاتِ سرقتِ کلیدِ پراکسیِ LLM که جعبه‌ابزار خودش را لو داد

یک گردانندهٔ چینی‌زبان با FOFA به دنبالِ پنل‌های پراکسیِ هوش مصنوعیِ در معرض دید می‌گردد، آن‌ها را با کدی واحدآزمایی‌شده که برای شناساییِ honeypotها ساخته شده تأیید می‌کند، و کلیدهای API را استخراج می‌کند. عاملِ آن‌ها فراخوان‌های ابزارِ یک طعمهٔ Kinryū Labs را روی میزبانِ خودش اجرا کرد و 283 مسیر فایل، بازده‌های اسکن، گزارشِ گفت‌وگوی WeChat، و یک فهرستِ نتایج از فایل‌های اکسپلویت را که به نامِ شش CVEِ سالِ 2026 نام‌گذاری شده‌اند بازگرداند، که یکی از آن‌ها دور زدنِ Stripe-webhookِ New-API است.

نوشتهٔ Davis Zheng·

CWE
CWE-306

TLP:CLEAR. برای انتشار عمومی تأیید شد. تقریباً همه‌چیزِ زیر مادهٔ خودِ گرداننده است، که هنگامی بازیابی شد که عاملِ آن‌ها فراخوان‌های ابزارِ یک طعمهٔ Kinryū Labs را روی میزبانِ خودش اجرا کرد و خروجی را پس فرستاد. نشانگرها خنثی‌شده (defanged) اند، یعنی نشانی‌های مهاجم چنان نوشته می‌شوند که به‌تصادف نتوان روی آن‌ها کلیک کرد یا آن‌ها را resolve کرد. هدف‌های اسکن، یک میزبانِ شخصِ ثالث که گرداننده آن را علامت‌گذاری کرد، و کلیدِ کاملِ APIِ FOFAِ آن‌ها نگه داشته شده‌اند.

خلاصهٔ مدیریتی

  • 27,173میزبانِ نامزد که با FOFA جارو شد
  • 194که یک مدل فهرست کردند
  • 17کلید API صادرشده
  • 6CVEِ سالِ 2026، بر پایهٔ نامِ فایل

یک گردانندهٔ چینی‌زبان 27,173 میزبان را در سراسرِ هشت کشور برای یک هدفِ واحد جارو کرده است: پنل‌های پراکسیِ هوش مصنوعیِ در معرض دید با کلیدهای زندهٔ پشتِ آن‌ها. یک پنلِ پراکسیِ هوش مصنوعی همان نرم‌افزاری است که تیم‌ها میان برنامه‌های خود و ارائه‌دهندگانِ مدلِ پولی قرار می‌دهند تا یک مجموعه کلیدِ ارائه‌دهنده را بتوان به اشتراک گذاشت، مانندِ LiteLLM، One-API و انشعابِ آن New-API، Sub2API و Chat2API. یکی از آن‌ها را بدون رمز عبور روی اینترنت رها کنید، آن‌گاه هر چه پشتِ آن است برای غریبه‌ها قابلِ خرج‌کردن است. گرداننده آن‌ها را از طریقِ FOFA پیدا می‌کند، یک موتور جست‌وجو روی اسکنِ پیوستهٔ سراسری‌اینترنتی و همتای چینیِ Shodan، بررسی می‌کند که کدام پنل‌ها هنوز پاسخ می‌دهند، و کلیدها را استخراج می‌کند.

این اعداد از آنِ خودِ گرداننده‌اند، از فایل‌های نتیجهٔ آن‌ها برداشته شده‌اند نه اینکه ما آن‌ها را برآورد کرده باشیم. از آن 27,173 میزبان، 194 مورد یک مدل فهرست می‌کردند و 17 کلید به فایلِ صادراتِ آن‌ها رسید. اجرای مربوط به ایالات متحده روشن‌ترین موردِ تک‌گانه است: 10,447 هدف به داخل، 64 فهرستِ مدل به بیرون، نرخِ اصابتِ 0.61%، و عاملِ خودِ آن‌ها می‌توانست بگوید چرا. LiteLLMِ عموماً در معرض دید و به‌راستی قابلِ‌فراخوانی نادر است، و یک باگِ ساختِ URL در اسکنرِ آن‌ها میزبان‌های زنده را مرده علامت می‌زد.

داوری‌های کلیدی
  • این یک عملیاتِ مستقر در چین، به زبانِ چینی، و روی زیرساختِ صرفاً چینی است. مهرِ زمانیِ هر فایلِ بازیابی‌شده +0800 است، زبانِ کاریِ سرتاسر چینی است، و سه میزبان عبارت‌اند از Alibaba Cloud، Tencent Cloud و یک VMِ اسکنِ Huawei Cloud. اطمینان بالا.
  • ابزارها سفارشی و واحدآزمایی‌شده‌اند، نه آماده و همگانی. litellm_verifier.py با سه فایل آزمون عرضه می‌شود، پوشهٔ backups یک SHA256SUMS دارد، و کار در قالبِ دورهای شماره‌گذاری‌شده سازمان یافته است. این انضباطِ مهندسی در اسکنِ اعتبارنامه غیرعادی است. اطمینان بالا، برگرفته از فهرست‌های فایلِ خودِ گرداننده.
  • آن‌ها ضدفریب را در کار می‌سازند، و کار می‌کند. تأییدگرِ آن‌ها از شمردنِ یک فهرستِ /v1/models به‌عنوانِ موفقیت سر باز می‌زند، به‌ازای هر مدل یک chat completionِ واقعی می‌طلبد، امتیاز می‌دهد که آیا پاسخ با فروشنده‌ای که ادعا می‌کند می‌خواند یا نه، و در یک اجرا 20 مورد از 41 ورودیِ مدلِ آزموده‌شده را honeypot_or_unusable دسته‌بندی کرد. اطمینان بالا.
  • کیتِ اکسپلویت به‌کلی n-day است. نامِ فایل‌های نتیجهٔ آن‌ها به شش هشدارِ سالِ 2026 علیهِ LiteLLM، Sub2API و New-API نگاشته می‌شوند، که یکی از آن‌ها در فهرستِ آسیب‌پذیری‌های شناخته‌شدهٔ در حالِ بهره‌برداریِ CISA است. هیچ‌چیز نشان‌دهندهٔ پژوهشِ اصیلِ آسیب‌پذیری نیست. اطمینان بالا دربارهٔ محصولات و تکنیک‌ها، اطمینان متوسط دربارهٔ CVEِ مشخص برای چهار مورد از شش مورد، که از نامِ فایل‌ها استنتاج شده‌اند نه از مشاهده.
  • چارچوبِ «مسابقه» با رسیدن به فهرستِ نتایج دوام نمی‌آورد. آن‌ها به عاملِ خود می‌گویند دامنهٔ کار فقط اعتبارنامه‌های پیش‌فرض است، با این حال نامِ فایل‌های آن پوشه به اجرای کد از راه دور، تزریقِ SQL، تزریقِ قالب (template)، جعلِ درخواستِ سمتِ سرور، نشتِ توکن، سرریزِ سهمیه و یک دور زدنِ Stripe-webhook اشاره می‌کنند. ما فهرست را در اختیار داریم نه بدنهٔ فایل‌ها را، پس نیت باز می‌ماند، اما زیرِ هر دو خوانش گرداننده آن ابزارها را ساخته و اجرا کرده است. اطمینان بالا دربارهٔ مصنوعات، اطمینان متوسط دربارهٔ اینکه کدام خوانشِ نیت درست است.

دربارهٔ نام

ما این را با نامِ keyHunter ردیابی می‌کنیم، به‌دنبالِ /root/keyHunter-skill/، پوشهٔ پروژهٔ خودِ گرداننده.

چارچوبِ عاملی که آن‌ها به‌کار می‌گیرند Hermes نام دارد، و Hermes یک پروژهٔ متن‌بازِ واقعی از Nous Research است. نام‌گذاریِ بازیگر بر پایهٔ آن، یک ابزارِ مشروع را برای کاری که کسی با آن کرده سرزنش می‌کند، پس چنین نمی‌کنیم. همین دربارهٔ OpenClaw، دومین چارچوبِ عامل روی آن دستگاه، صادق است. هر دو نرم‌افزارِ معمولی‌اند که گرداننده نصب کرد و به سمتِ زیرساختِ دیگران نشانه رفت.

گرداننده

گرداننده از سه میزبان کار می‌کند، همه روی ابرهای چینی، و کار میانِ آن‌ها تقسیم شده است. 39.98.82[.]200 روی Alibaba Cloud (AS37963) دروازهٔ عامل را اجرا می‌کند و بیشترِ شناساییِ (reconnaissance) که ما دیدیم را انجام داد. 101.43.41[.]72 روی Tencent Cloud (AS45090) یک رله است که روی پورت 8087 یک نقطهٔ پایانیِ سازگار با OpenAI ارائه می‌دهد که عامل برای ظرفیتِ مدل آن را فرا می‌خواند. آن‌ها اثرانگشتِ JA4Hِ po11nn070000_ebbca96fac43 را به اشتراک می‌گذارند، که توصیف می‌کند یک کلاینت چگونه درخواست‌های HTTPِ خود را سرِ هم می‌کند و در برابرِ تغییرِ نشانی پایدار می‌ماند، به‌همراهِ user agentهای سفارشیِ Hermes-Agent/0.18.0 و Hermes-Panel/1.0 و یک شناسهٔ نشستِ گفت‌وگوی مشترکِ واحد. روی‌هم‌رفته، این‌ها هر دو گره را زیرِ یک گرداننده قرار می‌دهند. آن اثرانگشت مصنوعِ یک‌بارثبت نیست: دو حسگرِ جداگانه در مناطقِ مختلف آن را مستقل از هم میانِ 16 و 20 اوت ثبت کردند، هر دو بار روی همان جاروبِ برخاسته از FOFA.

اسکن‌کردن باز هم جایِ دیگری رخ می‌دهد. از میزبانِ Alibaba آن‌ها روی یک فوروارد محلی به یک VMِ Huawei Cloud می‌رسند:

ssh -o ServerAliveInterval=20 -i /root/.ssh/hw_vm_key -p 8888 [email protected] \
    'cd /home/developer && /home/developer/.venv-us30/bin/python litellm_scan_us_30d_optimized.py'

آن دستگاه چهار روز و نه ساعت بالا بوده، 7.5 گیگابایت RAM و چهار هسته دارد، و کارگرهای اسکن را اجرا می‌کند. جدا کردنِ اسکنِ پرسروصدا از پیشانیِ عامل یک انتخابِ عامدانه است، و نامِ hw_vm_key می‌گوید که گرداننده آن را دستگاهِ Huawei می‌پندارد.

کنترل روی WeChat اجرا می‌شود. سرویسِ دروازه خود را چنین توصیف می‌کند: «Hermes Agent Gateway, Messaging Platform Integration»، و گرداننده با گفت‌وگو با عامل در یک رشتهٔ WeChat به آن وظیفه می‌سپارد. حافظهٔ بلندمدتِ عامل همان گفت‌وگوست: تاریخچهٔ گفت‌وگوی خود را جست‌وجو می‌کند تا به‌یاد آورد روی چه کار می‌کند. چارچوبِ دوم همین الگو را نشان می‌دهد، با نشستی به نامِ openclaw-weixin. یک اپِ پیام‌رسانِ مصرفی یک کانالِ کنترلِ ارزان می‌سازد: ترافیک به‌صورتِ پیش‌فرض رمزنگاری‌شده است و در کنارِ هر کاربرِ دیگرِ WeChat به سمتِ Tencent سوار می‌شود، پس هیچ چیزی را که برای beaconingِ فرمان‌ودهی (command-and-control) تنظیم شده باشد به‌کار نمی‌اندازد.

موتورِ استدلالِ پشتِ همهٔ این‌ها github_copilot/gpt-5.6-sol است، یک دستیارِ کدنویسیِ تجاری که از طریقِ یک رله به آن دسترسی پیدا می‌شود. پیکربندیِ آن‌ها همچنین کلیدهای اختیاری برای چند ارائه‌دهندهٔ دیگر را نیز سیم‌کشی می‌کند. کدِ تهاجمی Pythonِ سفارشی است؛ مدلِ استدلال، چارچوبِ عامل و کانالِ کنترلِ WeChatِ زیرِ آن همگی محصولاتِ مصرفیِ آماده و روی‌قفسه‌اند.

خطِ لوله

مهارتِ اصلیِ (master skill) آن‌ها کلِ عملیات را در یک خط توصیف می‌کند: «کشف، اسکن، تأیید و بایگانیِ پنل‌های پراکسیِ APIِ هوش مصنوعیِ عموماً در معرض دید (LiteLLM، Sub2API، New-API، One-API) با استفاده از FOFA + keyHunter + اسکریپت‌های تأییدِ سفارشی.»

FOFA search, per country
  -> dedupe and normalise targets
  -> light HTTP fingerprint
  -> /v1/models listing
  -> real chat completion per model
  -> honeypot classification
  -> weak-credential panel login, key extraction
  -> export keys and accounts, archive

کشف یک پرس‌وجوی FOFAِ واحد است که به‌ازای هر کشور تکرار می‌شود:

(title="LiteLLM" || body="LiteLLM") && country="{cc}" && org!="AMAZON-AES"

عبارتی که اهمیت دارد کنارگذاریِ AWS است. گرداننده پیش از نگاه به حتی یک میزبان، Amazon را از هر جاروب فیلتر می‌کند. مسدود کردنِ بازه‌های Shodan و Censys در لبهٔ شبکهٔ شما در برابرِ خط لوله‌ای که روی دادهٔ اسکنِ کسِ دیگری ساخته شده هیچ سودی ندارد.

به‌ازای هر کشور اسکریپت‌های جداگانه نگه می‌دارند: litellm_scan_hw.py برای ایالات متحده، litellm_scan_gb_hw.py، litellm_scan_it_hw.py، یک litellm_scan_us_30d_optimized.py با virtualenvِ خودش، و مجموعه‌ای دیگر زیرِ keyHunter-skill/ که استرالیا، برزیل، کانادا، فرانسه، هند، هلند و سنگاپور را پوشش می‌دهد. فایل‌های نتیجه برای چهارده کشور وجود دارد. هم‌روندی 48 کارگرِ سبک و 12 کارگرِ عمیق است، با عقب‌نشینیِ محدودیتِ‌نرخ برای پاسخ‌های 429ِ FOFA، و حذفِ تکرارِ نقطهٔ پایانی بر پایهٔ پروتکل، میزبان و پورت.

کلیدِ APIِ FOFA در سورسِ اسکنر به‌صورتِ hard-code آمده است، و ما به همین دلیل آن را داریم. اسکنر در برابرِ یک آینهٔ غیررسمیِ FOFA در hamal.cc[.]cd اجرا می‌شود و از طریقِ یک پراکسیِ محلیِ Squid خارج می‌شود.

یک جاروب در عمل چه بازمی‌گرداند

کشورهدف‌های FOFAمدل‌های فهرست‌شدهنرخ اصابت
ایالات متحده10,447640.61%
چین6,329831.31%
کرهٔ جنوبی1,772100.56%
بریتانیا1,422181.27%
ایتالیا1,13090.80%
استرالیا، هند، برزیل6,07310، که 4 مورد تأیید شد0.16%

یک اجرای ثبت‌شده: 2,255 ردیفِ خام از FOFA، 1,130 نقطهٔ پایانیِ یکتا پس از حذفِ تکرار، 9 سایت که مدل فهرست کردند، 8 مورد که تأیید شد، و در سطحِ درخواست 41 موفقیتِ مدل در برابرِ 8 شکست.

سرشماریِ عنوانِ FOFA که آن‌ها گرد آوردند می‌گوید جمعیتِ در معرض دید چه شکلی است. LiteLLM API - Swagger UI تعداد 7,630 نتیجه بازمی‌گرداند. OmniRoute تعداد 171، SillyTavern 170، LiteLLM Dashboard 156، Claude Code Hub 131، Aivar AI Gateway 11. بیشترِ این سطح یک محصولِ واحد است، و بیشترِ نمونه‌های در معرض دیدِ آن محصول همان صفحهٔ مستنداتِ APIِ خودکارتولیدشده است.

ما بازده در انتهای کار را از نظرِ مطلق پایین ارزیابی می‌کنیم. litellm_extracted_keys.json تعداد 43 نمونه و 3 کلیدِ استخراج‌شده در سراسرِ 23 مدل را ثبت می‌کند. exported_keys.json تعداد 17 مورد را نگه می‌دارد. ده‌ها هزار میزبان برای هفده کلید جارو شدند، که یا یک بازگشتِ ضعیف در برابرِ تلاش است یا استدلالی بر اینکه تلاش ارزان است چون یک عامل آن را انجام می‌دهد.

ضدفریب: آن‌ها honeypotها را شکار می‌کنند

مهندسی در یک فایل روشن‌تر از همه دیده می‌شود، litellm_verifier.py.

ده کیلوبایت است، با یک مجموعهٔ واحدآزمون. به هر مدلی که یک پنل تبلیغ می‌کند یک chat completionِ کمینهٔ واقعی می‌فرستد و تنها در صورتِ یک پاسخِ معتبرِ OpenAI-شکلِ choices/message/content یا یک پاسخِ streamingِ مشروع با نشانگرِ done، موفقیت را ثبت می‌کند. قاعدهٔ خودِ آن‌ها، به بیانِ خودشان: یک موفقیتِ صِرفِ /models هرگز به حساب نمی‌آید. نامِ آزمون‌ها آن را رمزگذاری می‌کنند، از جمله یکی به نامِ test_models_listing_alone_is_not_success. کسی یک آزمونِ رگرسیون نوشت تا جلوی این را بگیرد که ابزارِ خودشان دربارهٔ یک کلیدِ دزدیده‌شده به آن‌ها دروغ بگوید.

شمارِ احکام از یک اجرای واحد:

verdict_counts: honeypot_or_unusable 20 · trusted_pass 5 · unavailable 16
formatted_false_success_model_hits 29
non_chinese_evidence_count 13
total_questions 205

formatted_false_success یک پاسخِ آماده یا بازتاب‌شده است، همان‌گونه که یک طعمهٔ ساده‌لوح پاسخ می‌دهد. non_chinese_evidence امتیاز می‌دهد که آیا یک مدل مانندِ فروشنده‌ای که ادعا می‌کند رفتار می‌کند یا نه. آن‌ها همچنین یک بازجوییِ پنج‌پرسشی اجرا می‌کنند، 蜜罐五题测试، و در بازهٔ ثبت‌شده از آن برای علامت‌گذاریِ یک میزبان در یک بازهٔ AWS لندن به‌عنوانِ honeypot استفاده کردند. ما آن نشانی را نگه می‌داریم، چون حسگرِ کسِ دیگری است و نام‌بردن از آن آن را می‌سوزاند.

یک خریدارِ استنتاجِ دزدیده‌شده اکنون فرض می‌کند که نقطهٔ پایانی ممکن است یک تله باشد و آن را می‌آزماید، که یک طعمهٔ کم‌تعامل روی این سطح را تقریباً بی‌فایده می‌کند. بررسیِ متقابلی که آن‌ها را می‌گیرد همان آزمون را وارونه اجرا می‌کند: هر کلاینتی که از دروازهٔ شما بخواهد ثابت کند که واقعاً کدام مدل را اجرا می‌کند، برخلافِ پارامترِ API، دارد کالا را اعتبارسنجی می‌کند.

زرادخانهٔ اکسپلویت: به‌کلی n-day

محتوای فایل‌های نتیجهٔ بهره‌برداریِ آن‌ها هرگز به دستِ ما نرسید. نامِ فایل‌ها رسید، و هدف‌های آن‌ها محصولاتِ متن‌باز با هشدارهای عمومی‌اند، پس اکسپلویت‌ها از دلِ هشدارها قابلِ بازیابی‌اند.

فایلِ نتیجه روی میزبانِ آن‌هاCVEآسیب‌پذیریمبنا
litellm_host_header_bypass_results.json (568 KB)CVE-2026-49468دور زدنِ احراز هویتِ LiteLLM از طریقِ تزریقِ Host-header، CVSS 9.8، پیش از 1.84.0. احراز هویت را از مسیریابی ناهمگام می‌کند و /key/generate و /user/newِ بدونِ احراز هویت می‌دهدتأییدشده: همان فراخوان‌های صفحهٔ مدیریت به سمتِ طعمهٔ ما پرتاب شد، و آن‌ها یک user agentِ CVE-2026-49468-Scanner ارائه کردند
litellm_sqli_apikey_results.json (517 KB)، litellm_sqli_models.jsonCVE-2026-42208تزریقِ SQLِ پیش‑از‑احراز‑هویتِ LiteLLM در مسیرِ احراز هویتتأییدشده: آن‌ها نوزده بار ' OR '1'='1 را به فیلدِ کلیدِ ما شلیک کردند
litellm_rce_exploit.json، litellm_mcp_rce_results.jsonCVE-2026-42271تزریقِ فرمان و اجرای کد از راه دورِ LiteLLM، CVSS 8.7، در فهرستِ آسیب‌پذیری‌های شناخته‌شدهٔ در حالِ بهره‌برداریِ CISA، از 1.74.2 تا 1.83.6، شاملِ یک بردارِ تزریقِ MCPاستنتاج‌شده از نامِ فایل و محصول
sub2api_cve_exploit.json و سه فازِ بعدیCVE-2026-27812مسموم‌سازیِ بازنشانیِ رمز عبورِ Sub2API از طریقِ هدرهای موردِاعتمادِ Host و Forwarded، که به تصاحبِ حساب می‌انجامد. در طبیعت (in the wild) بهره‌برداری‌شده، پیش از 0.1.85استنتاج‌شده
newapi_stripe_bypass_results.json، newapi_stripe_exploited.json، newapi_quota_overflow_results.jsonCVE-2026-41432دور زدنِ امضای Stripe webhookِ New-API از طریقِ یک secretِ خالی، که سهمیهٔ نامحدود بدونِ پرداخت می‌دهد، پیش از 0.12.10استنتاج‌شده
newapi_user_token_leak_results.json، oneapi_user_token_leak_results.json، newapi_ssrf_bypass_results.jsonCVE-2026-30886ارجاعِ مستقیمِ ناامنِ شیء (IDOR) و دور زدنِ احراز هویتِ New-API روی نقطهٔ پایانیِ video-proxy، که محتوای کاربرانِ دیگر را افشا می‌کند و به مهاجم اجازه می‌دهد اعتبارنامهٔ قربانی را در بالادست خرج کنداستنتاج‌شده
litellm_ssti_prompts_results.jsonبدونِ هشدارِ واحدتزریقِ قالبِ سمتِ سرورِ Jinja2 علیهِ نقاطِ پایانیِ prompt و templateاستنتاج‌شده

محتوای هیچ فایلی به دستِ ما نرسید؛ هر ردیف بر نامِ فایل استوار است. برای دو مورد از آن‌ها ما مستقلاً دیدیم که تکنیک به حسگرِ خودمان رسید، دور زدنِ host-header و SQLiِ احراز هویت، که تکنیک را تأیید می‌کند نه فایل را. چهار موردِ دیگر بر نامِ فایل به‌علاوهٔ هشدارِ شناخته‌شدهٔ محصول استوارند، و همین‌گونه علامت خورده‌اند.

الگو در هر شش مورد یکی است. هر هشدار از سالِ 2026 است، چند تا از همان سه‌ماهه، و هیچ‌کدام پژوهشِ اصیل نیست. keyHunter نقص‌های تازه‌افشاشدهٔ پرشدت در بوم‌سازگانِ متن‌بازِ پراکسیِ LLM را همان لحظه که فرود می‌آیند صنعتی می‌کند. آن یک پنجرهٔ کوتاه است، روی رده‌ای از نرم‌افزار که اغلب یک توسعه‌دهنده آن را نصب می‌کند و سپس رهایش می‌کند.

نیت: روایتِ مسابقه در برابرِ فهرستِ نتایج

گرداننده این را برای عاملِ خود به‌عنوانِ یک ورودیِ مسابقه توصیف می‌کند. واژگان در سراسرِ گفت‌وگوی بازیابی‌شده یکدست است: 比赛项目 (پروژهٔ مسابقه)، 评委 (داوران)، 答辩材料 (موادِ دفاعِ شفاهی)، یک پوشهٔ contest-kit، و کارِ سازمان‌یافته در 第一轮 و 第二轮، دورِ اول و دورِ دوم.

وقتی دربارهٔ دامنهٔ کار پرسیده می‌شود، گرداننده صریح است که هدف اعتبارنامه‌های پیش‌فرض است، در متنِ اصلی:

llm 的主要就是那几个默认密码为主流,用自己的 sk 那种没办法抓到啊

برای موردهای LLM، عمدتاً همان چند رمز عبورِ پیش‌فرض غالب‌اند؛ آن‌هایی که از کلیدهای sk-*ِ خودشان استفاده می‌کنند، راهی برای گرفتن‌شان نیست.

عامل موافقت می‌کند، و تأیید می‌کند که تلاش‌های احراز هویت به سه حالت محدود است: بدونِ احراز هویت، sk-test، و sk-1234، که آخری همان کلیدی است که مستنداتِ quickstartِ خودِ LiteLLM از آن استفاده می‌کند.

سپس /root/keyHunter-skill/results/ هست. فهرستِ آن فایل‌هایی را برای اجرای کد از راه دور، تزریقِ SQL، تزریقِ قالب، جعلِ درخواستِ سمتِ سرور، ربودنِ نشست علیهِ Sub2API، پاششِ اعتبارنامه، نشتِ توکنِ کاربر، سرریزِ سهمیه، و دو مورد برای دور زدنِ Stripe-webhook نام می‌برد، که یکی از آن‌ها newapi_stripe_exploited.json است. ما نام‌ها را داریم و، برای برخی، اندازه‌ها را: نتایجِ دور زدنِ Stripe به 2.4 MB می‌رسد، هرچند محتوای آن‌ها هرگز به دستِ ما نرسید. گزارهٔ قابلِ‌دفاع این است که گرداننده ابزارِ دور زدنِ پرداختِ سهمیه‑نامحدود را علیهِ New-API ساخته و اجرا کرده، و اینکه CVE-2026-41432 دقیقاً یک آسیب‌پذیریِ واقعی از همین دست است. اینکه آن 2.4 MB رکورد شارژهای متقلبانهٔ تکمیل‌شده‌اند یا صرفاً تلاش، برای ما دیدنی نیست. _exploited در نامِ فایل واژهٔ خودِ گرداننده برای آن است؛ ما رکوردها را نخواندیم.

ما هر دو خوانش را باز نگه می‌داریم. ممکن است مسابقه واقعی باشد و بهره‌برداری یک جریانِ کاریِ جداگانه که گرداننده آن را با عاملی که گزارش نگه می‌دارد در میان نمی‌گذارد؛ یا ممکن است مسابقه پوششی برای یک عملیاتِ سرقت باشد. ما این تمایز را برای مدافعان بی‌اهمیت ارزیابی می‌کنیم: توانایی و خطر برای یک پنلِ در معرض دید زیرِ هر دو خوانش یکسان است.

شکافِ فوت‑و‑فنِ کار: عاملِ خودِ گرداننده جعبه‌ابزار را ممیزی کرد

مفیدترین بخشِ گفت‌وگوی بازیابی‌شده یک بازبینیِ کد است. گرداننده از عاملِ خود پرسید چرا نرخِ اصابتِ اسکن این‌قدر پایین است، و عامل خط‌به‌خطِ اسکنر را وارسی کرد.

پاسخِ عامل، فشرده‌شده به آنچه یک مدافع می‌تواند به‌کار بندد: اسکنر یک پروتکل را به ابتدای یک فیلدِ hostِ FOFA می‌افزاید که اغلب خودش یکی دارد، و URLهایی به شکلِ https://https://<target> می‌سازد، پس میزبان‌های زنده به‌عنوانِ مرده ثبت می‌شدند. استخرِ نخ‌ها نتایج را به‌ترتیبِ ساخت جمع می‌کند نه به‌ترتیبی که کامل می‌شوند، پس یک درخواستِ کند همه‌چیزِ پشتِ خود را مسدود می‌کند. CONCURRENCY=200 روی یک دستگاهِ چهارهسته‌ای timeoutهای خودش را می‌سازد. حذفِ تکرار بر پایهٔ IP، پورت‌های معتبرِ دیگر روی همان نشانی را دور می‌ریزد. تثبیتِ temperature یک خطای سازگاری را به‌اشتباه شکست می‌خواند.

دربارهٔ تشخیصِ honeypotِ آن‌ها عامل بی‌پرده بود: عمدتاً بر پایهٔ اینکه آیا پاسخ یکسان است یا کوتاه‌تر از پنج نویسه داوری می‌کند، که مدل‌های عادی را از بین می‌برد و طعمه‌های خوب را از دست می‌دهد. و با آنکه گرداننده از آن خواسته بود پاسخ‌دهندگانِ غیرچینی را شناسایی کند، کد اصلاً هیچ منطقِ تشخیصِ زبانی نداشت.

همچنین بهداشتِ امنیتیِ آن‌ها را علامت‌گذاری کرد: کلیدِ FOFAِ hard-code‌شده در اسکریپت، مسیرهای مطلقِ نوشته‌شده برای /root در حالی که کاربرِ واقعی /home/developer است، except: pass که هر دلیلِ شکست را می‌بلعد، یک نسخهٔ جداگانه از اسکریپت به‌ازای هر کشور، و فایل‌های نتیجه که هدف‌ها و روش‌های احراز هویت را بدونِ هیچ کنترلِ دسترسی یا ویرایشِ‑حذفی نگه می‌دارند.

آن نکتهٔ آخر قیف را از نو قاب می‌گیرد. نرخِ اصابتِ 0.61% ایالات متحده در‌معرض‌دید بودن را از خلالِ یک اسکنر با باگ‌های شناخته‌شده اندازه می‌گیرد، پس نرخِ واقعیِ LiteLLMِ در معرض دید بالاتر از آن است که نتایجِ خودِ گرداننده نشان می‌دهد. آن‌ها اکنون عاملی دارند که این باگ‌ها را پیوسته درست خواهد کرد.

زیرساختِ کسبِ درآمد

همان میزبان یک نمونهٔ New-APIِ خودشان را اجرا می‌کند: calciumion/new-api:latest در Docker، منتشرشده روی پورت 8901، با داده‌ای که کنارِ نتایجِ اسکن به‌صورتِ bind-mount سوار شده است. پیرامونِ آن newapi_watchdog.py، یک فایلِ پشتیبانِ کانال، و یک نسخهٔ بسته‌بندی‌شده از کلِ آن قرار دارد.

New-API یک پنلِ تجمیع است. انبوهی از کلیدهای ارائه‌دهندهٔ بالادست را می‌گیرد و آن‌ها را به‌صورتِ یک API با حساب‌های کاربری و سهمیه‌های خودش عرضه می‌کند. برپا کردنِ آن در کنارِ یک خط لولهٔ برداشتِ کلید هدفی آشکار دارد: کلیدهای برداشت‌شده به کانال‌هایی در یک پنل بدل می‌شوند، و پنل به دسترسی‌ای که می‌توان فروخت بدل می‌شود. ما بازفروش را مشاهده نکردیم و مدعیِ آن نیستیم؛ لوله‌کشیِ آن نصب و در حالِ اجراست.

صدها روترِ رایگانِ مشابه که روی قالب‌های sub2api و new-api ساخته شده‌اند هم‌اکنون در گردش‌اند، و keyHunter یکی از عملیات‌ها درونِ آن بوم‌سازگان است.

پیوندهای خوشه

اثرانگشت‌گیریِ کلاینت این دو میزبان را به مجموعه‌ای شُلِ از دیگرانی که روی همان سطح کار می‌کنند پیوند می‌زند: یک میزبانِ تایوانی که اسکنِ CVE و ساختِ کلید را اجرا می‌کند، یک میزبانِ هنگ‌کنگی که همان تزریقِ SQL را پرتاب می‌کند، و یک پرش دورتر، یک شکارچیِ پنلِ LLM و یک بهره‌بردارِ Ray-dashboard که انفجارهای تک‑روزهٔ آن‌ها روی 15 و 21 اوت، به فاصلهٔ شش روز، افتاد. هم‌پوشانی‌ها جاهایی روی پشته‌های کلاینتِ عمومی اجرا می‌شوند، پس این بیشتر مانندِ ابزارِ مشترک و یک صحنهٔ مشترک خوانده می‌شود تا یک دست روی یک صفحه‌کلید. آن را همچون یک اجتماعِ چین‑محور که ابزارِ شکارِ پراکسیِ LLM را به اشتراک می‌گذارد در نظر بگیرید. هیچ نشانگری این را به یک APTِ نام‌دار گره نمی‌زند، پس آن را همچون یک خوشهٔ فعالیت ردیابی می‌کنیم.

نشانگرهای نفوذ

شبکه و زیرساخت، خنثی‌شده:

نشانگرنقش
39.98.82[.]200دروازهٔ عامل، شناسایی، تزریقِ SQL (Alibaba Cloud، AS37963، CN)
101.43.41[.]72نقطهٔ پایانیِ رله روی پورت 8087، کارگرِ زیرعاملِ واگذارشده (Tencent Cloud، AS45090، CN)
hamal.cc[.]cdآینهٔ غیررسمیِ FOFA که اسکنر از آن پرس‌وجو می‌کند
cae332848db5…کلیدِ APIِ FOFAِ خودِ گرداننده، hard-code‌شده در litellm_scan_hw.py. اینجا کوتاه شده؛ مقدارِ کامل به‌جای انتشار برای گزارش به FOFA نگه داشته شده است

اثرانگشت‌های کلاینت و user agentها:

po11nn070000_ebbca96fac43_00000000   shared across both nodes
Hermes-Agent/0.18.0
Hermes-Panel/1.0
Mozilla/5.0 (CVE-2026-49468-Scanner)

مصنوعاتِ میزبان. این‌ها مسیرهایی روی دستگاه‌های گرداننده‌اند، مفید برای شکارِ یک میزبانِ همانند یا یک استقرارِ دوم:

/home/developer/litellm_verifier.py           real-chat verifier and honeypot classifier
/home/developer/test_litellm_verifier.py      unit tests
/home/developer/litellm_endpoint.py           endpoint normalise and dedupe
/home/developer/litellm_scan_hw.py            FOFA scanner, US, AWS excluded
/home/developer/litellm_scan_gb_hw.py
/home/developer/litellm_scan_it_hw.py
/home/developer/litellm_scan_us_30d_optimized.py
/home/developer/contest-kit/keyHunter-skill/
/home/developer/backups/litellm_verifier_round2_<ts>/SHA256SUMS
/root/keyHunter-skill/results/
/root/keyHunter-skill/{honeypot_test.py, verify_country_models.py, add_to_panel.py, report.py}
/root/.ssh/hw_vm_key                          key to the scanning VM, [email protected]:8888
/opt/hermes-simple-panel/app.py               config panel, port 9120
/root/new-api.tar.gz, /root/newapi_watchdog.py

نام‌های مهارت و پروژه، که قوی‌ترین محورهای تک‑رشته‌ای‌اند:

keyhunter / keyHunter
contest-kit
ai-proxy-panel-audit
fofa-panel-recon
delegation-orchestration

رفتاری:

FOFA:  (title="LiteLLM" || body="LiteLLM") && country="XX" && org!="AMAZON-AES"
auth:  no credential, then sk-test, then sk-1234
SQLi:  ' OR '1'='1  in the API key field
verify: a real chat completion per advertised model; a /models listing alone is rejected
verdict strings: honeypot_or_unusable, trusted_pass, unavailable,
                 formatted_false_success, non_chinese_evidence
services on actor infra: new-api :8901, config panel :9120, agent gateway

شناسایی

اگر یک پراکسیِ LLM را اجرا می‌کنید که از اینترنت دست‌یافتنی است، کلِ این توالی در گزارش‌های خودِ دروازه دیده می‌شود. در Sigma، قالبِ قاعدهٔ فروشنده‑بی‌طرف که بیشترِ سکوهای SIEM می‌توانند وارد کنند:

title: AI proxy panel enumeration consistent with keyHunter
id: 2c6f9a41-8e07-4b53-9f1a-7d0c4b62ae35
status: experimental
description: >
  The keyHunter discovery and verification sequence against an exposed LLM
  proxy: an unauthenticated model listing followed by per-model chat
  completions from the same source, or one of the cluster's user agents.
references:
  - https://kinryu.sh/reports/keyhunter-llm-proxy-key-harvesting/
logsource:
  category: webserver
detection:
  model_listing:
    cs-uri-stem|endswith:
      - '/v1/models'
      - '/models'
  admin_paths:
    cs-uri-stem|startswith:
      - '/key/'
      - '/user/'
      - '/organization/'
  cluster_agents:
    c-useragent|contains:
      - 'Hermes-Agent'
      - 'Hermes-Panel'
      - 'CVE-2026-49468-Scanner'
  admin_allowlist:
    c-ip|cidr: '10.0.0.0/8'          # replace with your own admin range
  condition: (((model_listing or admin_paths) and not admin_allowlist) or cluster_agents)
falsepositives:
  - Client libraries that legitimately call /v1/models on startup from allow-listed ranges
level: high

یک گزارشِ دسترسیِ وب هدرِ Authorization را ثبت نمی‌کند، پس تلاش‌های اعتبارنامهٔ‑پیش‌فرض و تزریق باید در ثبتِ درخواستِ خودِ پراکسی گرفته شوند: sk-1234 و sk-testِ عینی، یک اعتبارنامهٔ غایب، و ' OR '1'='1 در فیلدِ کلید.

سه شکارِ رفتاری که به یک موتورِ قاعده نیاز ندارند:

  • به‌دنبالِ یک منبعِ واحد بگردید که مدل‌های شما را فهرست می‌کند و سپس به هر یک از آن‌ها به‌نوبت دقیقاً یک chat completionِ کوتاه می‌فرستد. آن جاروبِ تأیید امضای این عملیات است و پنهان‌کردنش دشوار است.
  • روی prompt‌هایی هشدار دهید که از مدل می‌خواهند برخلافِ پارامترِ API هویتِ واقعیِ خود را اعلام کند، همان بررسی‌ای که یک خریدار پیش از اعتماد به دسترسیِ دزدیده‌شده اجرا می‌کند.
  • فهرستِ کانال و جدولِ کاربرِ پنلِ خود را طبقِ زمان‌بندی diff کنید. استخراجِ کلید و صادراتِ حساب پنل را در حالِ کارِ عادی رها می‌کنند، پس هیچ‌چیزِ دیگری به شما نخواهد گفت.

چه باید کرد

هر پراکسیِ LLMِ در معرض دیدِ اینترنت را از لحظهٔ در معرض دید بودن، نفوذشده در نظر بگیرید. keyHunter یک کشور را در یک روز جارو می‌کند و CVEهای منتشرشده را ظرفِ چند هفته پس از افشا به‌کار می‌گیرد.

  • LiteLLM، One-API، New-API، Sub2API و هر چیزِ مشابه را پشتِ یک پراکسیِ معکوسِ احراز هویت‌کننده یا روی یک شبکهٔ خصوصی قرار دهید. هیچ‌کدام از آن‌ها یک پیش‌فرضِ قابلِ‌دفاع برای در معرض دیدِ اینترنت عرضه نمی‌کنند.
  • به نسخهٔ کنونی وصله کنید. از شش هشدارِ بالا، RCEِ LiteLLM در فهرستِ آسیب‌پذیری‌های شناخته‌شدهٔ در حالِ بهره‌برداریِ CISA است و تصاحبِ حسابِ Sub2API به‌طورِ تأییدشده در طبیعت بهره‌برداری شده است.
  • کلیدِ اصلی (master key) را عوض کنید. sk-1234 مقداری است که در quickstartِ خودِ LiteLLM آمده و یکی از تنها سه اعتبارنامه‌ای است که این گرداننده به خود زحمتِ آزمودن‌شان را می‌دهد.
  • /openapi.json و /docs را محدود کنید. یک کلاینتِ ناشناس نباید بتواند سطحِ APIِ مدیریتیِ شما را دانلود کند.
  • برای هر کلیدِ مجازی سقفِ بودجه و دامنه بگذارید، تا استخراج چیزی به بار آورد که ارزشِ بازفروش نداشته باشد.
  • اگر از طریقِ New-API پرداختِ Stripe می‌گیرید، تأیید کنید که secretِ امضای webhook واقعاً تنظیم شده است. یک secretِ خالی تمامِ CVE-2026-41432 است.
  • هر کلیدِ ارائه‌دهندهٔ بالادستی را که تا کنون در پنلی نشسته که نمی‌توانید ثابت کنید هرگز در معرض دید نبوده، بچرخانید.

نگاشت MITRE ATT&CK

تاکتیکتکنیک
ReconnaissanceT1596.005 Search Open Technical Databases: Scan Databases (FOFA، به‌ازای هر کشور، با کنارگذاریِ AWS)؛ T1595.002 Active Scanning: Vulnerability Scanning (کاوشِ HTTPِ سبک و عمیق)
Resource DevelopmentT1583.003 Acquire Infrastructure: Virtual Private Server (Alibaba، Tencent، Huawei)؛ T1588.002 Obtain Capabilities: Tool (Hermes Agent، OpenClaw، یک اشتراکِ FOFA، github_copilot/gpt-5.6-sol به‌عنوانِ موتورِ استدلال)
Initial AccessT1190 Exploit Public-Facing Application (دور زدنِ احراز هویتِ Host-header، تزریقِ SQLِ پیش‑از‑احراز‑هویت، تزریقِ فرمان، SSTI، SSRF علیهِ LiteLLM، Sub2API و New-API)
Defense EvasionT1480 Execution Guardrails (دسته‌بندیِ honeypot، امتیازدهیِ non_chinese_evidence، فیلترِ org!="AMAZON-AES")
Credential AccessT1078.001 Valid Accounts: Default Accounts (بدونِ اعتبارنامه، sk-test، sk-1234)؛ T1552.001 Unsecured Credentials: Credentials In Files (استخراجِ کلید به exported_keys.json)
DiscoveryT1518 Software Discovery (فهرست‌کردنِ مدل و تأییدِ به‌ازای هر مدل)؛ T1087 Account Discovery (شمارشِ کاربر علیهِ صفحهٔ مدیریت)
CollectionT1213 Data from Information Repositories (صادراتِ حساب، نرمال‌سازی، بایگانی)
Command and ControlT1102 Web Service (یک رشتهٔ WeChat به‌عنوانِ کانالِ وظیفه‌سپاری)
ImpactT1657 Financial Theft (دور زدنِ Stripe webhook، سرریزِ سهمیه)؛ T1496 Resource Hijacking (لوله‌کشیِ بازفروش برای استنتاجِ برداشت‌شده)

روش‌شناسی و یادداشت‌های تحلیلگر

تقریباً همه‌چیزِ بالا به همین شیوه به دستِ ما رسید. یک طعمهٔ Kinryū Labs که خود را همچون یک نمونهٔ در معرض دیدِ LiteLLM جا می‌زند، به یک کلاینتِ عاملی همان‌گونه که یک مدلِ واقعی پاسخ می‌دهد پاسخ می‌دهد، با پاسخ‌دادن به‌صورتِ فراخوان‌های ابزار: دستورهایی به شکلِ این فرمان را اجرا کن و به من بگو چه چاپ کرد. طعمه هیچ‌یک از آن‌ها را اجرا نمی‌کند. عاملِ گرداننده آن پاسخ‌ها را همچون فراخوان‌های تابعِ واقعی تلقی کرد، آن‌ها را روی سیستمِ‑فایلِ خودش اجرا کرد، و خروجی را همچون نتایجِ ابزار پس فرستاد، 534 بار میانِ 16 و 20 اوتِ 2026. آن خروجی محیطِ آن‌هاست: 283 مسیرِ فایلِ متمایز، فهرست‌های سرویس و کانتینر، خلاصه‌های نتیجهٔ اسکن، و جست‌وجوهای خودِ عامل در حافظهٔ WeChatِ آن. طعمه در سرتاسر منفعل می‌ماند، پس همه‌چیزِ بالا همان است که عاملِ خودِ گرداننده داوطلبانه به آن سپرد.

بنابراین آنچه ما در اختیار داریم زیرمجموعه‌ای از سیستمِ واقعیِ آن‌هاست، محدود به هر آنچه عاملِ آن‌ها اتفاقاً شمارش کرد. محتوای هیچ فایلی به دستِ ما نرسید؛ ما نام‌ها، اندازه‌ها و مهرهای زمانی را از فهرست‌های پوشهٔ خودِ گرداننده داریم. بازده‌های اسکن و شمارِ احکام ارقامِ خودِ گرداننده‌اند، گزارش‌شده توسطِ ابزارِ آن‌ها، و ما هیچ‌یک را مستقلاً تأیید نکرده‌ایم. عاملِ آن‌ها باگ‌های واقعی در اسکنرشان یافت، پس نرخ‌های اصابت را باید به‌عنوانِ کفِ در معرض دید بودن خواند نه اندازه‌گیریِ آن.

گفت‌وگوی چینی‌زبان ترجمه شده است. رشته‌های فنی، مسیرها و شناسه‌ها هم در این گزارش و هم در ترجمه عیناً نگه داشته شده‌اند.

چهار محدودیت بر آنچه این کار پشتیبانی می‌کند. انتساب در یک خوشهٔ فعالیت روی زیرساختِ مستقر در چین که سرتاسر از چینی استفاده می‌کند متوقف می‌شود؛ هیچ پیوندی به یک گروهِ نام‌دار وجود ندارد و ما یکی ارائه نمی‌دهیم. نیت به‌راستی میانِ یک ورودیِ مسابقه و یک عملیاتِ سرقت مبهم است. محتوای هیچ فایلِ اکسپلویتی به دستِ ما نرسید، پس هر شش نگاشتِ CVE بر نامِ فایل‌ها استوارند؛ برای دو مورد تکنیک مستقلاً هنگامِ رسیدن به حسگرِ ما مشاهده شد، که تکنیک را تأیید می‌کند نه فایل را. و ما هرگز ندیدیم که یک کلیدِ دزدیده‌شده خرج شود: مقادیرِ کلیدِ صادرشدهٔ گرداننده هرگز به دستِ ما نرسید، تنها شمارِ او از 3 استخراج‌شده و 17 صادرشده، پس چیزی برای جست‌وجو در برابرِ تله‌متری نبود.

نشانی‌های شخصِ ثالثی که اسکنرِ آن‌ها لمس کرد نگه داشته شده‌اند، از جمله میزبانی که خودشان آن را به‌عنوانِ honeypot علامت زدند، که به پژوهشِ کسِ دیگری تعلق دارد. کلیدِ APIِ FOFAِ آن‌ها در اینجا کوتاه شده است.

مجموعه‌های کاملِ نشانگر و ثبت‌های زیربنایی به‌درخواست در اختیارِ پژوهشگران قرار می‌گیرند: [email protected].

How to cite
Kinryū Labs (2026). ‏keyHunter: عملیاتِ سرقتِ کلیدِ پراکسیِ LLM که جعبه‌ابزار خودش را لو داد. https://kinryu.sh/fa/reports/keyhunter-llm-proxy-key-harvesting/