threat-actor · litellm · agentic-ai · credential-theft · china-nexus
keyHunter: מבצע איסוף מפתחות מפרוקסי-LLM שהדליף את ערכת הכלים של עצמו
מפעיל דובר-סינית סורק את FOFA לאיתור פאנלים חשופים של פרוקסי-AI, מאמת אותם בעזרת קוד נבדק-יחידות שנבנה לזהות פיתיונות (honeypots), ומייצא את מפתחות ה-API. הסוכן (agent) שלו הריץ את קריאות-הכלי של פיתיון של Kinryū Labs על המארח שלו עצמו והחזיר 283 נתיבי קבצים, את תפוקות הסריקה, את יומן שיחת ה-WeChat, וספריית תוצאות של קובצי ניצול הנקראים על שם שישה CVE משנת 2026, ביניהם עקיפת webhook של Stripe ב-New-API.
מאת Davis Zheng·
TLP:CLEAR. אושר לפרסום ציבורי. כמעט כל מה שלהלן הוא חומר של המפעיל עצמו, ששוחזר כאשר הסוכן שלו הריץ את קריאות-הכלי של פיתיון של Kinryū Labs על המארח שלו עצמו ופרסם את הפלט בחזרה. המחוונים מנוטרלים (defanged), כלומר כתובות התוקף כתובות באופן שלא ניתן ללחוץ עליהן או לפתור אותן בטעות. יעדי הסריקה, מארח צד-שלישי אחד שהמפעיל סימן, ומפתח ה-API של FOFA שלו במלואו, אינם נכללים.
תקציר מנהלים
- 27,173מארחים מועמדים שנסרקו ב-FOFA
- 194שהציגו מודל
- 17מפתחות API שיוצאו
- 6CVE משנת 2026, לפי שם קובץ
מפעיל דובר-סינית סרק 27,173 מארחים על פני שמונה מדינות בחיפוש אחר יעד אחד: פאנלים חשופים של פרוקסי-AI שמאחוריהם מפתחות פעילים. פאנל פרוקסי-AI הוא התוכנה שצוותים מציבים בין היישומים שלהם לבין ספקי מודלים בתשלום כדי שאפשר יהיה לחלוק מערכת אחת של מפתחות ספק, כגון 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 ומכונת סריקה וירטואלית של Huawei Cloud. ביטחון גבוה. - הכלים הם מותאמים-אישית ונבדקי-יחידות, לא מדף.
litellm_verifier.pyמגיע עם שלושה קובצי בדיקה, ספריית הגיבויים נושאתSHA256SUMS, והעבודה מאורגנת בסבבים ממוספרים. משמעת הנדסית כזו היא חריגה בסריקת אישורים. ביטחון גבוה, נלקח מרשימות הקבצים של המפעיל עצמו. - הם משלבים אנטי-הטעיה, וזה עובד. המאמת שלהם מסרב לספור הצגת
/v1/modelsכהצלחה, דורש השלמת צ'אט אמיתית לכל מודל, מנקד האם התשובה תואמת את הספק שהיא טוענת לו, וסיווג 20 מתוך 41 רשומות מודל שנבדקו בהרצה אחת כ-honeypot_or_unusable. ביטחון גבוה. - ערכת הניצול היא כולה n-day. שמות קובצי התוצאות שלהם ממופים לשש הודעות אבטחה משנת 2026 נגד LiteLLM, Sub2API ו-New-API, אחת מהן ברשימת הפגיעויות הידועות-כמנוצלות של CISA. שום דבר אינו מרמז על מחקר פגיעויות מקורי. ביטחון גבוה לגבי המוצרים והטכניקות, בינוני לגבי ה-CVE הספציפי בארבע מתוך השש, המוסקות משמות הקבצים ולא נצפו.
- מסגור התחרות אינו שורד את המפגש עם ספריית התוצאות. הם אומרים לסוכן שלהם שההיקף הוא אישורי ברירת מחדל בלבד, ובכל זאת שמות הקבצים בספרייה נוקבים בהרצת קוד מרחוק, הזרקת SQL, הזרקת תבנית, זיוף בקשה בצד-השרת, דליפת אסימונים, גלישת מכסה ועקיפת webhook של Stripe. בידינו הרשימה ולא גופי הקבצים, כך שהכוונה נותרת פתוחה, אך המפעיל בנה והריץ את הכלים האלה תחת כל אחת מהקריאות.
על השם
אנו עוקבים אחר זה בשם keyHunter, על שם /root/keyHunter-skill/, ספריית הפרויקט של המפעיל עצמו.
מסגרת הסוכן שהם מפעילים נקראת Hermes, ו-Hermes הוא פרויקט קוד-פתוח אמיתי של Nous Research. קריאת השחקן על שמה תטיל אשמה על כלי לגיטימי בגין מה שמישהו עשה בו, ולכן איננו עושים זאת. הדבר נכון גם לגבי OpenClaw, מסגרת הסוכן השנייה שעל המכונה. שתיהן תוכנה רגילה שהמפעיל התקין וכיוון אל תשתית של אנשים אחרים.
המפעיל
המפעיל עובד משלושה מארחים, כולם על עננים סיניים, כשהעבודה מחולקת ביניהם. 39.98.82[.]200 על Alibaba Cloud (AS37963) מריץ את שער הסוכן וביצע את רוב הסיור שראינו. 101.43.41[.]72 על Tencent Cloud (AS45090) הוא ממסר, המגיש נקודת קצה תואמת-OpenAI על יציאה 8087 שהסוכן קורא לה לקיבולת מודלים. הם חולקים את טביעת האצבע JA4H po11nn070000_ebbca96fac43, המתארת כיצד לקוח מרכיב את בקשות ה-HTTP שלו ושורדת החלפת כתובת, לצד סוכני משתמש ייעודיים Hermes-Agent/0.18.0 ו-Hermes-Panel/1.0 ומזהה סשן צ’אט משותף יחיד. יחד, אלה מציבים את שני הצמתים תחת מפעיל אחד. טביעת אצבע זו אינה ממצא של לכידה בודדת: שני חיישנים נפרדים באזורים שונים תיעדו אותה באופן עצמאי בין ה-16 ל-20 באוגוסט, בשתי הפעמים באותה סריקה מונעת-FOFA.
הסריקה מתרחשת שוב במקום אחר. מהמארח של Alibaba הם מגיעים למכונה וירטואלית של 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 GB של RAM וארבע ליבות, והיא מריצה את עובדי הסריקה. הפרדת הסריקה הרועשת מקצה החזית של הסוכן היא בחירה מכוונת, והשם hw_vm_key אומר שהמפעיל חושב עליה כעל מכונת ה-Huawei.
השליטה מתבצעת דרך WeChat. שירות השער מתאר את עצמו כ-”Hermes Agent Gateway, Messaging Platform Integration”, והמפעיל מטיל משימות על הסוכן על ידי שיחה איתו בשרשור WeChat. הזיכרון ארוך-הטווח של הסוכן הוא אותה שיחה: הוא מחפש בהיסטוריית הצ’אט של עצמו כדי להיזכר במה הוא עובד. המסגרת השנייה מציגה את אותו דפוס, עם סשן בשם openclaw-weixin. אפליקציית מסרים צרכנית יוצרת ערוץ שליטה זול: התעבורה מוצפנת כברירת מחדל ונוסעת אל Tencent לצד כל משתמש WeChat אחר, כך שהיא אינה מדליקה שום התראה המכווננת לביקון של שליטה-ובקרה.
מנוע ההיסק שמאחורי כל זה הוא github_copilot/gpt-5.6-sol, עוזר קוד מסחרי המושג דרך ממסר. התצורה שלהם גם מחווטת מפתחות אופציונליים למספר ספקים אחרים. הקוד ההתקפי הוא Python מותאם-אישית; מודל ההיסק, מסגרת הסוכן וערוץ השליטה של WeChat שתחתיו הם כולם מוצרים צרכניים מן-המדף.
הצינור
מיומנות האב שלהם מתארת את המבצע כולו בשורה אחת: “גלה, סרוק, אמת וארכב פאנלים חשופים לציבור של פרוקסי-API של AI (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 מוטמע-קשיח בקוד המקור של הסורק, וכך הוא הגיע לידינו. הוא רץ מול מראה FOFA לא-רשמית בכתובת hamal.cc[.]cd ויוצא דרך פרוקסי Squid מקומי.
מה סריקה אחת מחזירה בפועל
| מדינה | יעדי FOFA | מודלים שהוצגו | שיעור פגיעה |
|---|---|---|---|
| ארצות הברית | 10,447 | 64 | 0.61% |
| סין | 6,329 | 83 | 1.31% |
| דרום קוריאה | 1,772 | 10 | 0.56% |
| הממלכה המאוחדת | 1,422 | 18 | 1.27% |
| איטליה | 1,130 | 9 | 0.80% |
| אוסטרליה, הודו, ברזיל | 6,073 | 10, מתוכם 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. עשרות אלפי מארחים נסרקו עבור שבעה-עשר מפתחות, וזה או תשואה גרועה על המאמץ או טיעון שהמאמץ זול משום שסוכן הוא זה שמבצע אותו.
אנטי-הטעיה: הם צדים פיתיונות
ההנדסה נראית בבירור הרב ביותר בקובץ אחד, litellm_verifier.py.
הוא בגודל עשרה קילובייט, עם חבילת בדיקות-יחידה. הוא שולח השלמת צ’אט מינימלית אמיתית לכל מודל שפאנל מפרסם, ורושם הצלחה רק על תגובה תקינה בפורמט-OpenAI מסוג choices/message/content או תגובת סטרימינג לגיטימית עם סמן סיום. הכלל שלהם עצמם, במילותיהם שלהם: הצלחת /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 של לונדון כפיתיון. אנו מונעים את הכתובת ההיא, משום שהיא חיישן של מישהו אחר וקריאתה בשמה שורפת אותה.
קונה של הסקה (inference) גנובה מניח כעת שנקודת הקצה עשויה להיות מלכודת ובודק זאת, מה שהופך פיתיון בעל-אינטראקציה-נמוכה על משטח זה לחסר-תועלת כמעט. הבדיקה-הנגדית שתופסת אותם מריצה את אותה בדיקה בהיפוך: כל לקוח שמבקש מהשער שלכם להוכיח איזה מודל הוא באמת מריץ, בניגוד לפרמטר ה-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 ללא אימות | אושש: אותן קריאות מישור-ניהול הוטחו בפיתיון שלנו, והם הציגו סוכן משתמש CVE-2026-49468-Scanner |
litellm_sqli_apikey_results.json (517 KB), litellm_sqli_models.json | CVE-2026-42208 | הזרקת SQL טרום-אימות ב-LiteLLM בנתיב האימות | אושש: הם ירו ' OR '1'='1 לשדה המפתח שלנו תשע-עשרה פעמים |
litellm_rce_exploit.json, litellm_mcp_rce_results.json | CVE-2026-42271 | הזרקת פקודות והרצת קוד מרחוק ב-LiteLLM, CVSS 8.7, ברשימת הפגיעויות הידועות-כמנוצלות של CISA, 1.74.2 עד 1.83.6, כולל וקטור הזרקת MCP | מוסק משם הקובץ והמוצר |
sub2api_cve_exploit.json ושלושה שלבים מאוחרים יותר | CVE-2026-27812 | הרעלת איפוס-סיסמה ב-Sub2API דרך כותרות Host ו-Forwarded מהימנות, המובילה להשתלטות על חשבון. מנוצל בטבע, לפני 0.1.85 | מוסק |
newapi_stripe_bypass_results.json, newapi_stripe_exploited.json, newapi_quota_overflow_results.json | CVE-2026-41432 | עקיפת חתימת webhook של Stripe ב-New-API דרך סוד ריק, המעניקה מכסה בלתי-מוגבלת ללא תשלום, לפני 0.12.10 | מוסק |
newapi_user_token_leak_results.json, oneapi_user_token_leak_results.json, newapi_ssrf_bypass_results.json | CVE-2026-30886 | הפניית-אובייקט-ישירה לא-מאובטחת (IDOR) ועקיפת אימות ב-New-API בנקודת הקצה של פרוקסי-הווידאו, החושפת תוכן של משתמשים אחרים ומאפשרת לתוקף לבזבז אישורי קורבן במעלה הזרם | מוסק |
litellm_ssti_prompts_results.json | אין הודעת אבטחה יחידה | הזרקת תבנית בצד-השרת של Jinja2 נגד נקודות הקצה של פרומפט ותבנית | מוסק |
תכניו של אף קובץ לא הגיעו לידינו; כל שורה נשענת על שם הקובץ. עבור שניים מהם צפינו באופן עצמאי בטכניקה מגיעה לחיישן שלנו, עקיפת ה-Host-header והזרקת ה-SQL באימות, מה שמאשש את הטכניקה ולא את הקובץ. ארבעת האחרים נשענים על שם הקובץ בתוספת הודעת האבטחה הידועה של המוצר, ומסומנים ככאלה.
הדפוס בכל השישה זהה. כל הודעת אבטחה היא משנת 2026, כמה מהן מאותו רבעון, ואף אחת מהן אינה מחקר מקורי. keyHunter מתעֵש פגמים חמורים שנחשפו לאחרונה במערכת האקולוגית של פרוקסי-LLM בקוד-פתוח ברגע שהם נוחתים. זהו חלון קצר, על סוג של תוכנה המותקנת לעתים קרובות בידי מפתח אחד ואז מושארת לנפשה.
כוונה: נרטיב התחרות מול ספריית התוצאות
המפעיל מתאר זאת לסוכן שלו עצמו כהגשה לתחרות. אוצר המילים עקבי לאורך הצ’אט ששוחזר: 比赛项目 (פרויקט תחרות), 评委 (שופטים), 答辩材料 (חומרי הגנה בעל-פה), ספריית contest-kit, ועבודה המאורגנת ב-第一轮 ו-第二轮, סבב ראשון וסבב שני.
כשנשאל על ההיקף, המפעיל מפורש בכך שהיעד הוא אישורי ברירת מחדל, במקור:
llm 的主要就是那几个默认密码为主流,用自己的 sk 那种没办法抓到啊
בנוגע ל-LLM זה בעיקר אותן כמה סיסמאות ברירת מחדל ששולטות; את אלה שמשתמשות במפתחות
sk-*משלהן, אין דרך לתפוס.
הסוכן מסכים, ומאשר שניסיונות האימות מוגבלים לשלושה מקרים: ללא אימות, sk-test, ו-sk-1234, כאשר האחרון הוא המפתח שבו משתמש תיעוד ההתחלה-המהירה של LiteLLM עצמו.
ואז יש את /root/keyHunter-skill/results/. הרשימה שלה נוקבת בשמות קבצים עבור הרצת קוד מרחוק, הזרקת SQL, הזרקת תבנית, זיוף בקשה בצד-השרת, חטיפת סשן נגד Sub2API, ריסוס אישורים, דליפת אסימוני-משתמש, גלישת מכסה, ושניים עבור עקיפת webhook של Stripe, אחד מהם 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 על מכונה בעלת ארבע ליבות מייצרת פסקי-זמן משל עצמה. ניקוי-כפילויות לפי IP מוותר על יציאות תקינות אחרות באותה כתובת. קיבוע temperature קורא שגיאת תאימות בטעות ככשל.
לגבי זיהוי הפיתיונות שלהם הסוכן היה בוטה: הוא שופט בעיקר לפי האם התשובה זהה או קצרה מחמישה תווים, מה שהורג מודלים רגילים ומחמיץ פיתיונות טובים. ולמרות שהמפעיל ביקש ממנו לזהות משיבים לא-סיניים, הקוד לא הכיל כל לוגיקת זיהוי-שפה כלל.
הוא גם סימן את היגיינת-האבטחה שלהם: מפתח ה-FOFA המוטמע-קשיח בסקריפט, נתיבים מוחלטים שנכתבו עבור /root בעוד המשתמש בפועל הוא /home/developer, except: pass הבולע כל סיבת כשל, עותק נפרד של הסקריפט לכל מדינה, וקובצי תוצאות המחזיקים יעדים ושיטות אימות ללא כל בקרת-גישה או השחרה.
הנקודה האחרונה הזו ממסגרת מחדש את המשפך. שיעור הפגיעה של 0.61% בארצות הברית מודד חשיפה דרך סורק עם באגים ידועים, כך שהשיעור האמיתי של LiteLLM חשוף גבוה יותר מכפי שתוצאות המפעיל עצמן מראות. כעת יש להם סוכן שימשיך לתקן את הבאגים האלה.
תשתית מונטיזציה
אותו מארח מריץ מופע New-API משלו: calciumion/new-api:latest ב-Docker, מפורסם על יציאה 8901, עם נתונים מקושרים-בהצמדה (bind-mounted) לצד תוצאות הסריקה. סביבו יושבים newapi_watchdog.py, קובץ גיבוי ערוצים, ועותק ארוז של כל העסק.
New-API הוא פאנל אגרגציה. הוא לוקח ערימת מפתחות ספק במעלה-הזרם ומציג אותם כ-API יחיד עם חשבונות משתמש ומכסות משלו. הקמת דבר כזה לצד צינור קציר-מפתחות בעלת תכלית ברורה: מפתחות שנקצרו הופכים לערוצים בפאנל, והפאנל הופך לגישה שאפשר למכור. לא צפינו במכירה-חוזרת ואיננו טוענים לה; האינסטלציה עבורה מותקנת ופועלת.
מאות נתבים חינמיים דומים הבנויים על תבניות sub2api ו-new-api כבר מסתובבים, ו-keyHunter הוא מבצע אחד בתוך אותה מערכת אקולוגית.
שיוכי אשכול
טביעת-אצבע של לקוחות מקשרת את שני המארחים האלה לקבוצה רופפת של אחרים העובדים על אותו משטח: מארח טייוואני המריץ סריקות CVE וטביעת מפתחות, מארח מהונג קונג הזורק את אותה הזרקת SQL, ובקפיצה אחת רחוק יותר, צייד פאנלי-LLM ומנצל לוח-מחוונים של Ray שהתפרצויות היום-הבודד שלהם נפלו ב-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 של המפעיל עצמו, מוטמע-קשיח ב-litellm_scan_hw.py. קטום כאן; הערך המלא נשמר לצורך דיווח ל-FOFA ולא פורסם |
טביעות-אצבע של לקוחות וסוכני משתמש:
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 בשדה המפתח.
שלושה ציִדים התנהגותיים שאינם זקוקים למנוע כללים:
- חפשו מקור יחיד שמציג את המודלים שלכם ואז שולח בדיוק השלמת צ’אט קצרה אחת לכל אחד מהם בתורו. סריקת האימות הזו היא חתימת המבצע וקשה להסוותה.
- התריעו על פרומפטים המבקשים מהמודל להצהיר על זהותו האמיתית בניגוד לפרמטר ה-API, הבדיקה שקונה מריץ לפני שהוא בוטח בגישה גנובה.
- השוו (diff) את רשימת הערוצים וטבלת המשתמשים של הפאנל שלכם על-פי לוח-זמנים. חילוץ מפתחות וייצוא חשבונות משאירים את הפאנל פועל כרגיל, כך ששום דבר אחר לא יגלה לכם.
מה לעשות בנדון
התייחסו לכל פרוקסי-LLM חשוף-לאינטרנט כמי שנפרץ עם חשיפתו. keyHunter סורק מדינה ביום ועובד על CVE שפורסמו תוך שבועות מהחשיפה.
- הציבו את LiteLLM, One-API, New-API, Sub2API וכל דבר דומה מאחורי פרוקסי-הפוך מאמת או ברשת פרטית. אף אחד מהם אינו מגיע עם ברירת מחדל הניתנת-להגנה עבור חשיפה לאינטרנט.
- עדכנו (patch) לגרסה הנוכחית. מבין שש הודעות האבטחה לעיל, ה-RCE של LiteLLM נמצא ברשימת הפגיעויות הידועות-כמנוצלות של CISA, וההשתלטות-על-חשבון של Sub2API מאוששת כמנוצלת בטבע.
- שנו את מפתח-האב.
sk-1234הוא הערך בהתחלה-המהירה של LiteLLM עצמו והוא אחד מבין שלושה אישורים בלבד שמפעיל זה טורח לנסות. - הגבילו את
/openapi.jsonו-/docs. לקוח אנונימי לא אמור להיות מסוגל להוריד את משטח ה-API הניהולי שלכם. - הטילו תקרת-תקציב והיקף על כל מפתח וירטואלי, כך שחילוץ יניב משהו שלא כדאי למכור מחדש.
- אם אתם מקבלים תשלומי Stripe דרך New-API, ודאו שסוד חתימת ה-webhook אכן מוגדר. סוד ריק הוא כל כולו של CVE-2026-41432.
- סובבו כל מפתח ספק במעלה-הזרם שאי-פעם ישב בפאנל שאינכם יכולים להוכיח שמעולם לא נחשף.
מיפוי MITRE ATT&CK
| טקטיקה | טכניקה |
|---|---|
| Reconnaissance | T1596.005 Search Open Technical Databases: Scan Databases (FOFA, לפי מדינה, AWS מוחרג); T1595.002 Active Scanning: Vulnerability Scanning (גישוש HTTP קל ועמוק) |
| Resource Development | T1583.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 Access | T1190 Exploit Public-Facing Application (עקיפת אימות ב-Host-header, הזרקת SQL טרום-אימות, הזרקת פקודות, SSTI, SSRF נגד LiteLLM, Sub2API ו-New-API) |
| Defense Evasion | T1480 Execution Guardrails (סיווג פיתיונות, ניקוד non_chinese_evidence, סינון org!="AMAZON-AES") |
| Credential Access | T1078.001 Valid Accounts: Default Accounts (ללא אישור, sk-test, sk-1234); T1552.001 Unsecured Credentials: Credentials In Files (חילוץ מפתחות ל-exported_keys.json) |
| Discovery | T1518 Software Discovery (הצגת מודלים ואימות פר-מודל); T1087 Account Discovery (מניית משתמשים נגד מישור הניהול) |
| Collection | T1213 Data from Information Repositories (ייצוא חשבונות, נרמול, ארכוב) |
| Command and Control | T1102 Web Service (שרשור WeChat כערוץ הטלת-המשימות) |
| Impact | T1657 Financial Theft (עקיפת webhook של Stripe, גלישת מכסה); T1496 Resource Hijacking (אינסטלציה למכירה-חוזרת של הסקה שנקצרה) |
מתודולוגיה והערות אנליסט
כמעט כל מה שלעיל הגיע לידינו באותה דרך. פיתיון של Kinryū Labs המציג את עצמו כמופע LiteLLM חשוף משיב ללקוח סוכני (agentic) כפי שמודל אמיתי היה עושה, על ידי מענה בקריאות-כלי: הוראות בצורה של הרץ פקודה זו ואמור לי מה היא הדפיסה. הוא אינו מריץ אף אחת מהן. הסוכן של המפעיל התייחס לתגובות האלה כקריאות-פונקציה אמיתיות, הריץ אותן מול מערכת הקבצים של עצמו, ופרסם את הפלט בחזרה כתוצאות-כלי, 534 פעמים בין ה-16 ל-20 באוגוסט 2026. הפלט הזה הוא הסביבה שלהם: 283 נתיבי קבצים נבדלים, רשימות שירותים ומכולות, סיכומי תוצאות סריקה, וחיפושים של הסוכן עצמו בזיכרון ה-WeChat שלו. הפיתיון נותר פסיבי לכל אורך הדרך, כך שכל מה שלעיל הוא מה שהסוכן של המפעיל עצמו התנדב למסור לו.
מה שבידינו הוא אפוא תת-קבוצה של המערכת האמיתית שלהם, תחומה בכל מה שהסוכן שלהם במקרה מנה. תכניו של אף קובץ לא הגיעו לידינו; יש בידינו שמות, גדלים וחותמות-זמן מרשימות הספריות של המפעיל עצמו. תפוקות הסריקה וספירות פסק-הדין הם נתוני המפעיל עצמו, שדווחו בידי הכלים שלו, ולא אימתנו אף אחד מהם באופן עצמאי. הסוכן שלהם מצא באגים אמיתיים בסורק שלהם, כך ששיעורי הפגיעה צריכים להיקרא כרצפה של חשיפה ולא כמדידה שלה.
הצ’אט בשפה הסינית מתורגם. מחרוזות טכניות, נתיבים ומזהים מושארים מילה במילה גם בדוח זה וגם בתרגום.
ארבע מגבלות על מה שזה תומך. השיוך נעצר באשכול פעילות על תשתית מבוססת-סין המשתמשת בסינית לכל אורך הדרך; אין קשר לקבוצה בעלת-שם ואיננו מציעים כזה. הכוונה מעורפלת באמת בין הגשה לתחרות לבין מבצע גניבה. תכניו של אף קובץ ניצול לא הגיעו לידינו, כך שכל שישה מיפויי ה-CVE נשענים על שמות קבצים; עבור שניים הטכניקה נצפתה באופן עצמאי מגיעה לחיישן שלנו, מה שמאשש את הטכניקה ולא את הקובץ. ומעולם לא ראינו מפתח גנוב מבוזבז: ערכי המפתחות שיוצאו בידי המפעיל מעולם לא הגיעו לידינו, רק ספירותיו של 3 שחולצו ו-17 שיוצאו, כך שלא היה מול מה לחפש בטלמטריה.
כתובות צד-שלישי שהסורק שלהם נגע בהן אינן נכללות, כולל המארח שהם עצמם סימנו כפיתיון, השייך למחקר של מישהו אחר. מפתח ה-API של FOFA שלהם קטום כאן.
מערכי מחוונים מלאים והלכידות שביסודם זמינים לחוקרים לפי בקשה: [email protected].