В мар­те 2026 года хакер­ская груп­па TeamPCP про­вела серию кас­кадных атак на цепоч­ку пос­тавок. Началось все с ком­про­мета­ции ска­нера уяз­вимос­тей Trivy и ком­пании Aqua Security, а затем ата­ка зат­ронула npm, PyPI, Checkmarx, Telnyx и десят­ки тысяч CI/CD-пай­плай­нов по все­му миру.

Сре­ди пос­тра­дав­ших ока­зались Cisco, Евро­пей­ская комис­сия, ИИ‑стар­тап Mercor и сот­ни дру­гих орга­низа­ций. По оцен­кам ком­пании Mandiant, общее чис­ло ском­про­мети­рован­ных SaaS-сред пре­выси­ло 1000 и про­дол­жает рас­ти.

Са­мым неп­рият­ным в этой исто­рии ока­зал­ся даже не мас­штаб атак, а тот факт, что в осно­ве все­го лежала не уяз­вимость нулево­го дня, а взлом одной‑единс­твен­ной учет­ной записи. Это­го хва­тило, что­бы спро­воци­ровать нас­тоящий эффект домино.

Что такое Trivy

Trivy — извес­тный опен­сор­сный ска­нер уяз­вимос­тей, раз­работан­ный ком­пани­ей Aqua Security. Инс­тру­мент помога­ет выяв­лять проб­лемы безопас­ности и жес­тко закоди­рован­ные сек­реты в кон­тей­нерах, Kubernetes-клас­терах, репози­тори­ях и облачной инфраструк­туре. На GitHub у про­екта боль­ше 33 тысяч звезд, а свя­зан­ные с ним GitHub Actions исполь­зуют­ся в десят­ках тысяч CI/CD-ворк­флоу по все­му миру.

Па­радокс ситу­ации зак­люча­ется в том, что Trivy — это инс­тру­мент безопас­ности. Имен­но его орга­низа­ции запус­кают, что­бы убе­дить­ся, что в их сбор­ках нет мал­вари и уте­чек сек­ретов. Поэто­му и доверие к нему повышен­ное, и он получа­ет соот­ветс­тву­ющие при­виле­гии. Для хакеров ском­про­мети­ровать такой инс­тру­мент гораз­до выгод­нее, чем рядовую зависи­мость.

 

Февральская прелюдия

Эта исто­рия началась в фев­рале 2026 года. Тог­да авто­ном­ный бот hackerbot-claw, зарегис­три­рован­ный на GitHub за неделю до начала атак, открыл pull request к репози­торию Trivy. PR экс­плу­ати­ровал дав­но извес­тную опас­ную кон­фигура­цию pull_request_target в одном из ворк­флоу про­екта — это пат­терн, при котором GitHub Actions выпол­няет код из фор­ка, но дела­ет это с пра­вами и сек­ретами основно­го репози­тория.

Лю­бопыт­но, что еще в нояб­ре 2025 года (за три месяца до экс­плу­ата­ции hackerbot-claw) эту опас­ную кон­фигура­цию обна­ружил и пометил авто­мати­чес­кий ана­лиза­тор, одна­ко раз­работ­чики Aqua Security про­игно­риро­вали пре­дуп­режде­ние.

Не­извес­тно, управлял­ся ли hackerbot-claw груп­пиров­кой TeamPCP или это был отдель­ный субъ­ект, дос­туп которо­го хакеры исполь­зовали впос­ледс­твии.

Как бы то ни было, через эту брешь ата­кующие выг­рузили из памяти про­цес­са Personal Access Token (PAT) сер­висно­го акка­унта aqua-bot — этот токен обла­дал пра­вами repo на всю орга­низа­цию aquasecurity. Пос­ле это­го зло­умыш­ленни­ки уда­лили все 178 релизов Trivy (с 0.27.0 по 0.69.1), на корот­кое вре­мя сде­лали репози­торий при­ват­ным и опуб­ликова­ли в OpenVSX вре­донос­ное рас­ширение Aqua Trivy для VS Code.

Спе­циалис­ты Aqua Security быс­тро замети­ли инци­дент, 1 мар­та пуб­лично сооб­щили о про­изо­шед­шем и сме­нили ском­про­мети­рован­ные токены. Одна­ко, как выяс­нилось поз­же, часть арте­фак­тов (API-клю­чи, сер­тифика­ты, пароли) оста­лась дос­тупна зло­умыш­ленни­кам. Это­го ока­залось дос­таточ­но, что­бы через 20 дней хакеры вер­нулись.

 

19 марта: вторая атака на Trivy

19 мар­та 2026 года, ког­да зна­читель­ная часть ИБ‑сооб­щес­тва разъ­езжа­лась с BSidesSF и готови­лась к RSA Conference, учас­тни­ки TeamPCP начали основную фазу сво­ей опе­рации.

Ис­поль­зуя укра­ден­ные в фев­рале учет­ные дан­ные, ата­кующие опуб­ликова­ли вре­донос­ный тег 0.69.4 в основном репози­тории Trivy через сер­висный акка­унт aqua-bot и запус­тили авто­мати­чес­кий пай­плайн релиза. Парал­лель­но они выпол­нили force push 75 из 76 тегов в репози­тории aquasecurity/trivy-action и под­менили все семь тегов в aquasecurity/setup-trivy. В резуль­тате теги ука­зыва­ли уже не на легитим­ные ком­миты, а на вре­донос­ные. Сре­ди ском­про­мети­рован­ных ока­зались вер­сии @0.34.2, @0.33 и @0.18.0, а единс­твен­ной незат­ронутой оста­лась @0.35.0.

Ата­кующие не ста­ли делать новый ком­мит или соз­давать релиз — это отоб­разилось бы в исто­рии и спро­воци­рова­ло бы появ­ление уве­дом­лений у мей­нтей­неров. Вмес­то это­го хакеры перенап­равили сущес­тву­ющие теги на вре­донос­ные ком­миты, акку­рат­но кло­ниро­вав метадан­ные ори­гина­лов: имя авто­ра, email, вре­мен­ные мет­ки и даже текст сооб­щения с номером PR. Любой ворк­флоу, который ссы­лал­ся на такой тег, авто­мати­чес­ки под­тягивал вре­донос­ный код.

Сле­ды, по которым в ито­ге уда­лось рас­путать эту ата­ку, были обна­руже­ны толь­ко при рет­роспек­тивном ана­лизе. Force push тегов в прин­ципе не порож­дает событий CreateEvent или DeleteEvent в пуб­личном API GitHub, то есть для сис­тем монито­рин­га, завязан­ных на эти события, ата­ка была невиди­мой.

Под­дель­ные ком­миты не были под­писаны GPG, а ори­гина­лы были. Под­делки зат­рагива­ли толь­ко entrypoint.sh, тог­да как ори­гиналь­ные — нес­коль­ко фай­лов. Parent-ком­миты датиро­вались мар­том 2026 года, при том что сами ком­миты прит­ворялись релиза­ми 2021–2022 годов.

Па­рал­лель­но с тегами TeamPCP опуб­ликова­ла заражен­ные бинар­ники Trivy v0.69.4 через GitHub Releases, Docker Hub, GHCR, AWS ECR и репози­тории DEB и RPM. Вре­донос­ный релиз был дос­тупен око­ло трех часов, а заражен­ные теги GitHub Actions оста­вались активны­ми при­мер­но две­над­цать часов.

 

TeamPCP Cloud Stealer

Мал­варь, которую TeamPCP внед­рила в Trivy, получи­ла наз­вание TeamPCP Cloud Stealer.

На GitHub-ран­нерах вре­донос повышал при­виле­гии до уров­ня root через passwordless sudo, находил про­цес­сы Runner.Worker и ска­ниро­вал их реги­оны памяти /proc/pid/mem в поис­ках JSON-строк с сек­ретами, которые GitHub Actions исполь­зует для мас­киров­ки чувс­тви­тель­ных дан­ных в логах.

В допол­нение к это­му сти­лер собирал перемен­ные окру­жения и искал в фай­ловой сис­теме учет­ные дан­ные: SSH-клю­чи, нас­трой­ки AWS, GCP, Azure, Kubernetes, Docker, фай­лы .env, пароли от баз дан­ных, токены Slack и Discord, TLS-клю­чи, нас­трой­ки VPN и дан­ные крип­токошель­ков.

Все соб­ранное шиф­ровалось AES-256-CBC со слу­чай­но сге­нери­рован­ным клю­чом, а сам ключ — жес­тко закоди­рован­ным пуб­личным клю­чом RSA-4096. Получен­ный архив с име­нем tpcp.tar.gz отправ­лялся POST-зап­росом на тай­псквот­тинго­вый домен scan.aquasecurtiy[.]org (обра­ти вни­мание — бук­вы в сло­ве security поменя­ны мес­тами).

Ес­ли же эксфиль­тра­ция не уда­валась, мал­варь исполь­зовала запас­ной канал: соз­давала в GitHub-акка­унте жер­твы пуб­личный репози­торий tpcp-docs и залива­ла укра­ден­ные дан­ные туда как release asset.

На машинах раз­работ­чиков (вре­донос опре­делял их по отсутс­твию перемен­ной GITHUB_ACTIONS=true) поведе­ние менялось. Мал­варь не толь­ко собира­ла сек­реты, но и уста­нав­ливала на хост по пути ~/.config/systemd/user/sysmon.py Python-бэк­дор, который регис­три­ровал­ся как сер­вис systemd и пери­оди­чес­ки опра­шивал управля­ющий сер­вер на пред­мет новых полез­ных наг­рузок.

При наличии клас­тера Kubernetes мал­варь фор­мирова­ла кон­фигура­цию при­виле­гиро­ван­ного пода с securityContext.privileged=true, мон­тирова­ла кор­невую фай­ловую сис­тему ноды через hostPath и таким обра­зом выходи­ла за пре­делы кон­тей­нера на уро­вень хост‑сис­темы.

По дан­ным «Ла­бора­тории Кас­пер­ско­го», имен­но эта связ­ка с Kubernetes делала мал­варь осо­бен­но опас­ной: она не огра­ничи­валась кра­жей фай­лов и пыталась доб­рать­ся до runtime-сек­ретов, которые AWS выда­ет кон­тей­нерам через Instance Metadata Service по адре­су 169.254.169.254 и Amazon ECS через 169.254.170.2. То есть TeamPCP охо­тилась не толь­ко за ста­тичес­кими сек­ретами, но и за вре­мен­ными IAM-токена­ми, которые в момент зараже­ния откры­вали пря­мой дос­туп к ресур­сам AWS.

В ито­ге мей­нтей­нер Trivy Итай Шакури (Itay Shakury) под­твер­дил ком­про­мета­цию и свя­зал инци­дент с фев­раль­ской ата­кой. Он писал:

Ес­ли вы подоз­рева­ете, что исполь­зовали ском­про­мети­рован­ную вер­сию, счи­тай­те все сек­реты вашего пай­плай­на ском­про­мети­рован­ными и немед­ленно изме­ните их.

Ин­циден­ту прис­воили иден­тифика­тор CVE-2026-33634 с оцен­кой 9,4 бал­ла по шка­ле CVSS.

 

22 марта: атака на внутреннюю организацию Aqua Security

Че­рез три дня пос­ле основной ата­ки выяс­нилось, что непол­ная ротация сек­ретов при­нес­ла еще один неп­рият­ный сюр­приз. 22 мар­та в Docker Hub появи­лись вре­донос­ные обра­зы Trivy вер­сий 0.69.5 и 0.69.6 — без соот­ветс­тву­ющих релизов на GitHub. Оба содер­жали все тот же TeamPCP Cloud Stealer. Пос­ледней «чис­той» вер­сией с тех пор счи­тает­ся 0.69.3.

В тот же день груп­пиров­ка TeamPCP доб­ралась до GitHub-орга­низа­ции aquasec-com, где Aqua Security хра­нит проп­риетар­ный код: исходни­ки Tracee, внут­ренние фор­ки Trivy, CI/CD-пай­плай­ны, Kubernetes-опе­рато­ры и внут­ренние базы зна­ний.

По дан­ным иссле­дова­телей OpenSourceMalware, точ­кой вхо­да пос­лужил сер­висный акка­унт Argon-DevOps-Mgt — бот с админ­ски­ми пра­вами одновре­мен­но в пуб­личной орга­низа­ции aquasecurity и внут­ренней aquasec-com. Авто­ризо­вал­ся он через PAT, а не через GitHub App, и его токен лежал в CI-ран­нере Trivy, где его и нашел сти­лер.

Сна­чала ата­кующие про­вели тес­товый про­гон: соз­дали и сра­зу уда­лили тес­товую вет­ку update-plugin-links-v0.218.2 в репози­тории aquasecurity/trivy-plugin-aqua. Никако­го релиза с таким име­нем не сущес­тво­вало, никаких ворк­флоу не запус­калось — это была про­вер­ка кра­дено­го токена.

Че­рез семь часов груп­пиров­ка в авто­мати­чес­ком режиме пере­име­нова­ла все 44 репози­тория в aquasec-com, добавив к име­нам пре­фикс tpcp-docs- и поменяв опи­сания на TeamPCP Owns Aqua Security. Вся опе­рация заняла мень­ше двух минут.

 

Эффект домино: npm, LiteLLM, Checkmarx

Па­рал­лель­но с дефей­сом Aqua Security груп­пиров­ка TeamPCP переш­ла к кас­кадной фазе атак, где каж­дое пос­леду­ющее зве­но цепоч­ки под­питыва­лось сек­ретами, укра­ден­ными на пре­дыду­щем эта­пе.

Сна­чала пос­тра­дала эко­сис­тема npm. Из CI-ран­неров Trivy утек­ли publish-токены мей­нтей­неров, чьи пай­плай­ны вклю­чали запуск ска­нера. На осно­ве этих токенов TeamPCP запус­тила самораз­мно­жающе­гося чер­вя CanisterWorm, который авто­мати­чес­ки пуб­ликовал вре­донос­ные обновле­ния во все пакеты, к которым у токена был дос­туп.

CanisterWorm зас­лужива­ет отдель­ного упо­мина­ния. Вмес­то обыч­ного управля­юще­го сер­вера червь исполь­зует canister в сети Internet Computer Protocol, что дела­ет инфраструк­туру устой­чивой к бло­киров­ке: что­бы уда­лить canister, нуж­но голосо­вание учас­тни­ков сети.

Для мас­киров­ки червь уста­нав­ливал себя в сис­теме как pgmon.service, прит­воря­ясь сер­висом монито­рин­га PostgreSQL, и пери­оди­чес­ки опра­шивал ICP-узел на пред­мет новых полез­ных наг­рузок. Так­же у него был «рубиль­ник», реаги­рующий на стро­ку youtube.com в получен­ном URL, — на слу­чай, если опе­рато­рам понадо­бит­ся экс­трен­но отклю­чить бот­нет.

Сле­дующей жер­твой ком­про­мета­ции стал PyPI-пакет LiteLLM — популяр­ная биб­лиоте­ка, пре­дос­тавля­ющая шлюз к раз­личным LLM-про­вай­дерам. LiteLLM нас­читыва­ет более 90 мил­лионов заг­рузок в месяц, а сре­ди поль­зовате­лей — ком­пании, которым нужен еди­ный API для OpenAI, Anthropic, AWS Bedrock и Google Vertex AI одновре­мен­но.

К сожале­нию, CI-пай­плайн BerriAI (ком­пании, раз­рабаты­вающей LiteLLM) запус­кал Trivy в качес­тве эта­па сбор­ки и при этом не пинил кон­крет­ную вер­сию инс­тру­мен­та. В резуль­тате сти­лер выг­рузил из ран­нера токен PYPI_PUBLISH и GitHub PAT соос­новате­ля про­екта Кри­ша Дхо­лакиа (Krrish Dholakia).

24 мар­та TeamPCP опуб­ликова­ла в PyPI вре­донос­ные вер­сии LiteLLM — 1.82.7 и 1.82.8. Никаких соот­ветс­тву­ющих ком­митов или тегов в Git-репози­тории про­екта при этом не было: пакеты соб­рали локаль­но и, исполь­зуя легитим­ные учет­ные дан­ные мей­нтей­нера, залили на GitHub в обход стан­дар­тно­го релиз‑пай­плай­на. Так хакерам уда­лось обой­ти про­вер­ки целос­тнос­ти, вклю­чая верифи­кацию хешей в pip: вре­донос­ный код был кор­рек­тно про­писан в метадан­ных пакета с пра­виль­ными хешами и хеш сов­падал. Под­пись была валид­ной, одна­ко содер­жимое — нет.

В вер­сии 1.82.7 сти­лер встро­или в файл proxy_server.py в стро­ку 128, акку­рат­но вста­вив меж­ду дву­мя легитим­ными бло­ками кода, и он сра­баты­вал при импорте litellm.proxy. Экспер­ты Endor Labs об­наружи­ли в этой вер­сии сра­зу три ите­рации пей­лоада, что сви­детель­ство­вало об активной доработ­ке вре­доно­са пря­мо во вре­мя ата­ки.

В вер­сии 1.82.8 ата­кующие пош­ли даль­ше и добави­ли litellm_init.pth — спе­циаль­ный тип фай­лов, который Python-модуль site исполня­ет при каж­дом стар­те интер­пре­тато­ра, безо вся­кого импорта. Дос­таточ­но было запус­тить что угод­но на Python (pip, IDE-пла­гин, любой под­про­цесс), и сти­лер начинал работу.

Ана­лити­ки «Лабора­тории Кас­пер­ско­го» в сво­ем ана­лизе отме­тили при­меча­тель­ную деталь: вре­донос­ный пей­лоад декоди­ровал­ся из Base64 и исполнял­ся в памяти, а его вывод шиф­ровал­ся AES-256-CBC со слу­чай­ным клю­чом, который, в свою оче­редь, шиф­ровал­ся пуб­личным RSA-клю­чом. Этот же RSA-ключ потом был обна­ружен в дру­гих фазах кам­пании, став одним из глав­ных инди­като­ров.

Па­рал­лель­но спе­циалис­ты Sysdig об­наружи­ли тот же сти­лер в двух GitHub Actions ИБ‑ком­пании Checkmarx — ast-github-action и kics-github-action. Изна­чаль­но пред­полага­лось, что в ast-github-action пос­тра­дали один‑два тега, одна­ко поз­же выяс­нилось, что TeamPCP переза­писа­ла все опуб­ликован­ные теги репози­тория (91 тег), инди­виду­аль­но сфаб­риковав отдель­ный ком­мит под каж­дую вер­сию. Укра­ден­ные на этом эта­пе ата­ки дан­ные переда­вались на тай­псквот­тинго­вый домен checkmarx[.]zone.

Кро­ме того, через ском­про­мети­рован­ный акка­унт Checkmarx в OpenVSX хакеры опуб­ликова­ли вре­донос­ные вер­сии рас­ширений ast-results 2.53.0 и cx-dev-assist 1.7.0. Вер­сии в основном VS Code Marketplace при этом не пос­тра­дали, и пред­ста­вите­ли Checkmarx заяви­ли, что не обна­ружи­ли приз­наков утеч­ки кли­ент­ских дан­ных.

 

27 марта: Telnyx и стеганография в WAV-файлах

27 мар­та TeamPCP добави­ла в чис­ло жертв Python-пакет Telnyx — офи­циаль­ный SDK для интегра­ции VoIP, мес­сен­джин­га и IoT-сер­висов. В PyPI появи­лись две вре­донос­ные вер­сии (4.87.1 и 4.87.2), а вре­донос­ный код внед­рили в файл client.py, что­бы тот сра­баты­вал авто­мати­чес­ки при импорте пакета, не мешая работе легитим­ных фун­кций SDK.

По дан­ным Endor Labs, токен для пуб­ликации в PyPI, ско­рее все­го, утек имен­но в резуль­тате взло­ма LiteLLM: любой раз­работ­чик или CI-пай­плайн, у которо­го был уста­нов­лен LiteLLM и одновре­мен­но в окру­жении лежал PyPI-токен Telnyx, мог отдать этот токен сти­леру.

Са­мым инте­рес­ным в этой фазе ата­ки была тех­ника дос­тавки финаль­ного пей­лоада: вмес­то того что­бы хос­тить готовый бинар­ник или закоди­рован­ный блоб, TeamPCP при­мени­ла сте­ганог­рафию в ауди­офай­лах.

В Linux и macOS заражен­ный пакет ска­чивал с управля­юще­го сер­вера файл ringtone.wav, извле­кал из ауди­одан­ных зашиф­рован­ный XOR скрипт‑сбор­щик и исполнял его в памяти. Пос­ле это­го сти­лер собирал SSH-клю­чи, перемен­ные окру­жения, облачные токены, дан­ные крип­токошель­ков и сек­реты Kubernetes-клас­теров, паковал в tpcp.tar.gz и отправ­лял на управля­ющий сер­вер, пос­ле чего унич­тожал за собой все сле­ды.

В Windows ата­ка выг­лядела ина­че: пакет ска­чивал файл hangup.wav, извле­кал из него исполня­емый файл и сох­ранял в пап­ку авто­заг­рузки как msbuild.exe. То есть на машинах с Windows TeamPCP стре­милась зак­репить­ся в сис­теме, в отли­чие от Linux и macOS.

Лю­бопыт­но, что тех­нику сте­ганог­рафии в WAV-фай­лах TeamPCP при­меня­ла и рань­ше — нап­ример, в вай­пере Kamikaze (о нем речь пой­дет даль­ше). Но если в Kamikaze пей­лоад встра­ивал­ся пря­мо в аудио в виде Base64, то для Telnyx его под­гру­жали с уда­лен­ного сер­вера в пок­сорен­ном виде.

 

Вайпер Kamikaze

В рам­ках той же кам­пании TeamPCP исполь­зовала ком­понент, который пло­хо сочета­ется с обыч­ным пор­тре­том финан­сово мотиви­рован­ной груп­пиров­ки: дес­трук­тивный пей­лоад под наз­вани­ем Kamikaze, нацелен­ный исклю­читель­но на иран­ские сис­темы.

Вай­пер дос­тавлял­ся через CanisterWorm и иног­да через незащи­щен­ные инстан­сы Docker. Перед запус­ком пей­лоад про­верял нес­коль­ко инди­като­ров: тегеран­скую тай­мзо­ну, иран­скую локаль, приз­нак fa_IR. Если ничего из это­го не обна­ружи­валось, на машине раз­верты­вал­ся толь­ко бэк­дор CanisterWorm.

В клас­терах Kubernetes в иран­ской тай­мзо­не Kamikaze раз­ворачи­вал при­виле­гиро­ван­ный DaemonSet с име­нем host-provisioner-iran и кон­тей­нером kamikaze на каж­дой ноде, вклю­чая control plane, пос­ле чего запус­кал при­нуди­тель­ную очис­тку фай­ловых сис­тем и перезаг­рузку.

На обыч­ных Linux-хос­тах, если про­цесс был запущен как root, выпол­нялась коман­да rm -rf / --no-preserve-root. Если нет — ата­кующие пытались повысить при­виле­гии через passwordless sudo.

Чар­ли Эрик­сен (Charlie Eriksen) из ком­пании Aikido, который отсле­живал эво­люцию пей­лоада в реаль­ном вре­мени, нас­читал шесть ите­раций Kamikaze толь­ко за 22 мар­та. Ран­ние вер­сии фокуси­рова­лись на побеге из Kubernetes, а в более поз­дние добави­ли рас­простра­нение по SSH, экс­плу­ата­цию Docker API через порт 2375 и сте­ганог­рафию в WAV.

По сло­вам Эрик­сена, под­твержде­ний реаль­ного ущер­ба от атак вай­пера нет, но сама связ­ка финан­сово мотиви­рован­ной кам­пании с геотар­гетиро­ван­ной дес­трук­тивной мал­варью не име­ет объ­ясне­ний.

Ис­сле­дова­тели допус­кают, что это мог­ла быть опе­рация со сме­шан­ными целями, либо дес­трук­тивный модуль был заказан кем‑то парал­лель­но с основной кам­пани­ей, либо же это была попыт­ка хакеров прив­лечь к себе вни­мание, а груп­па намерен­но наращи­вала «медий­ность».

 

Cisco, Еврокомиссия, Mercor и другие

Сле­дом начал про­являть­ся мас­штаб проб­лемы и появи­лись пер­вые downstream-жер­твы.

Од­ной из пер­вых пуб­лично зафик­сирован­ных жертв это­го кас­када ста­ла ком­пания Cisco. Ата­кующие вос­поль­зовались учет­ными дан­ными, укра­ден­ными в ходе ком­про­мета­ции Trivy, и проб­рались во внут­реннюю build- и dev-сре­ду ком­пании.

В резуль­тате с десят­ков машин, вклю­чая рабочие стан­ции раз­работ­чиков, утек­ли AWS-клю­чи, которые затем исполь­зовались для несан­кци­они­рован­ных дей­ствий в облачных акка­унтах ком­пании. По дан­ным СМИ, ата­кующие кло­ниро­вали более 300 GitHub-репози­тори­ев, сре­ди которых были исходные коды ИИ‑про­дук­тов Cisco (вклю­чая AI Assistants, AI Defense и еще не вышед­шие решения). Хуже того, часть похищен­ных репози­тори­ев мог­ла при­над­лежать кор­поратив­ным кли­ентам ком­пании, вклю­чая бан­ки, BPO-ком­пании и аме­рикан­ские госс­трук­туры.

Вто­рой круп­ной жер­твой ста­ла Ев­ропей­ская комис­сия. 24 мар­та 2026 года ЕК пре­дуп­редила о ком­про­мета­ции сво­ей облачной инфраструк­туры, обслу­жива­ющей плат­форму Europa.eu, а ответс­твен­ность за ата­ку понача­лу взя­ла на себя вымога­тель­ская груп­пиров­ка ShinyHunters.

Как объ­ясня­ли спе­циалис­ты CERT-EU, точ­кой вхо­да зло­умыш­ленни­ков стал API-ключ от AWS, ском­про­мети­рован­ный еще 19 мар­та в ходе ата­ки на Trivy. Евро­пей­ская комис­сия исполь­зовала заражен­ную вер­сию ска­нера, не подоз­ревая об этом: инс­тру­мент при­шел по обыч­ным каналам обновле­ния.

По­лучив ском­про­мети­рован­ный ключ, ата­кующие соз­дали и при­вяза­ли к учет­ной записи новый ключ дос­тупа и прис­тупили к раз­ведке. В дело пошел TruffleHog — опен­сор­сный инс­тру­мент для поис­ка сек­ретов и валида­ции учет­ных дан­ных AWS через Security Token Service.

В ито­ге утеч­ка зат­ронула дан­ные 71 кли­ента хос­тинга Europa.eu — 42 внут­ренних под­разде­ления Евро­пей­ской комис­сии и не менее 29 дру­гих струк­тур ЕС. Общий объ­ем укра­ден­ных дан­ных в нес­жатом виде сос­тавил 340 Гбайт, вклю­чая име­на, адре­са элек­трон­ной поч­ты и логины. Око­ло 2,22 Гбайт (51 992 фай­ла) приш­лись на авто­мати­чес­кие уве­дом­ления о недос­тавке, вклю­чая сооб­щения с ори­гиналь­ным поль­зователь­ским кон­тентом. То есть в них тоже мог­ли содер­жать­ся пер­сональ­ные дан­ные.

Еще одной пуб­лично под­твержден­ной жер­твой стал ИИ‑стар­тап Mercor, который спе­циали­зиру­ется на най­ме через ИИ. Пред­ста­вите­ли ком­пании на­писа­ли в соци­аль­ных сетях:

Не­дав­но мы обна­ружи­ли, что ока­зались одной из тысяч ком­паний, зат­ронутых ата­кой на цепоч­ку пос­тавок LiteLLM.

При этом вымога­тель­ская груп­пиров­ка Lapsus$ заяви­ла, что укра­ла у стар­тапа 4 Тбайт дан­ных, вклю­чая 939 Гбайт исходно­го кода, и выс­тавила этот дамп на про­дажу.

Дру­гой круп­ной жер­твой этих атак ста­ла швей­цар­ская ком­пания Sportradar — пос­тавщик спор­тивных дан­ных и ана­лити­ки для NBA, ESPN, Nike, IMG Arena, Bet365 и FIBA. 25 мар­та груп­пиров­ки TeamPCP и вымога­тель­ская груп­пиров­ка Vect про­вели сов­мес­тную ата­ку про­тив Sportradar, исполь­зовав ском­про­мети­рован­ные через Trivy учет­ные дан­ные.

В ито­ге утеч­ка зат­ронула око­ло 26 тысяч поль­зователь­ских записей, про­фили 23 169 спорт­сме­нов, восемь паролей про­дак­шен‑БД RDS, а так­же 328 пар API-клю­чей, свя­зыва­ющих Sportradar со 161 кли­ент­ской орга­низа­цией. Похищен­ный у ком­пании дамп хакеры выс­тавили на про­дажу за 50 тысяч дол­ларов США.

 

TruffleHog и AWS

Ес­ли пер­вые эта­пы кам­пании выг­лядели как клас­сичес­кая ата­ка на цепоч­ку пос­тавок, то фаза пос­тэкс­плу­ата­ции, которую изу­чили ана­лити­ки ком­пании Wiz, ско­рее походи­ла на пол­ноцен­ный взлом облачных сред.

По информа­ции иссле­дова­телей, TeamPCP не теряла вре­мени и сра­зу перехо­дила к валида­ции укра­ден­ных учет­ных дан­ных. TruffleHog, который был замечен в инци­ден­те со взло­мом Евро­комис­сии, исполь­зовал­ся для про­вер­ки, что укра­ден­ные клю­чи AWS, сек­реты Azure-при­ложе­ний и SaaS-токены все еще работа­ют и активны. В течение 24 ч пос­ле валида­ции груп­пиров­ка перехо­дила к раз­ведке в ском­про­мети­рован­ных AWS-сре­дах: перечис­ляла сер­висы с фокусом на кон­тей­неры, изу­чала клас­теры и task definitions, добира­лась до AWS Secrets Manager.

Пос­ле в ход шли ворк­флоу GitHub для исполне­ния кода в сре­де жер­твы и ECS Exec для запус­ка bash-команд и Python-скрип­тов пря­мо в кон­тей­нерах AWS. Из репози­тори­ев на GitHub уте­кали исходни­ки, кон­фигура­цион­ные фай­лы и сек­реты. Из AWS-инфраструк­туры — содер­жимое S3-бакетов, Secrets Manager и баз дан­ных.

Пос­тэкс­плу­ата­цион­ная активность TeamPCP сос­редото­чилась на ком­про­мета­ции допол­нитель­ных сек­ретов и эксфиль­тра­ции огромных объ­емов дан­ных из репози­тори­ев и облачных ресур­сов, — сооб­щали в Wiz. — Укра­ден­ные дан­ные и сек­реты, веро­ятно, переда­ются дру­гим груп­пам для даль­нейших опе­раций.

 

Связь с Lapsus$

Па­рал­лель­но с самими ата­ками TeamPCP начала откры­то хва­лить­ся сво­ими успе­хами в Telegram и заяви­ла о пла­нах «похищать терабай­ты ком­мерчес­ких сек­ретов вмес­те с новыми пар­тне­рами».

Хо­тя эти пар­тне­ры не наз­ваны нап­рямую, прак­тичес­ки одновре­мен­но в Telegram-канале груп­пиров­ки Lapsus$ появи­лись пос­ты о пред­сто­ящей ата­ке на цепоч­ку пос­тавок, свя­зан­ной с TeamPCP.

На кон­ферен­ции RSAC 2026 тех­ничес­кий дирек­тор ком­пании Mandiant Consulting Чарльз Кар­макал (Charles Carmakal) под­твер­дил связь меж­ду груп­пами. По его сло­вам, на тот момент было извес­тно более чем о тысяче ском­про­мети­рован­ных сред SaaS и это чис­ло мог­ло зна­читель­но вырас­ти. Кар­макал отдель­но под­чер­кнул, что учас­тни­ки атак базиру­ются пре­иму­щес­твен­но в США, Великоб­ритании, Канаде и Запад­ной Евро­пе и «извес­тны сво­ей исклю­читель­ной агрессив­ностью в воп­росах вымога­тель­ства».

По дан­ным ана­лити­ков Palo Alto Networks, помимо Lapsus$, TeamPCP сот­рудни­чает с опе­рато­рами шиф­роваль­щика CipherForce и начина­ющей вымога­тель­ской груп­пиров­кой Vect. Пред­ста­вите­ли пос­ледней даже выложи­ли на одном из хакер­ских форумов откры­тое заяв­ление о пар­тнерс­тве с TeamPCP.

Хен­рик Плейт (Henrik Plate), гла­ва иссле­дова­тель­ско­го отде­ла Endor Labs, объ­яснил логику это­го аль­янса так:

Груп­пиров­ка пред­положи­тель­но соб­рала мас­су учет­ных дан­ных в ходе пос­ледних атак, и коопе­рация [с вымога­теля­ми] поз­воля­ет мас­шта­биро­вать их исполь­зование, пока жер­твы не завер­шили обновле­ние сек­ретов.

В свою оче­редь спе­циалис­ты Wiz под­черки­вали, что горизон­таль­ное рас­простра­нение мал­вари по эко­сис­теме соз­дает «эффект снеж­ного кома» и кам­пания, ско­рее все­го, про­дол­жит рас­ширять­ся:

Мы наб­люда­ем опас­ное сбли­жение групп, ата­кующих цепоч­ки пос­тавок, с извес­тны­ми вымога­теля­ми вро­де Lapsus$.

Па­рал­лель­но с этим ана­лити­ки обна­ружи­ли еще одну инте­рес­ную связь. 31 мар­та про­изош­ла отдель­ная ата­ка на популяр­ный npm-пакет Axios, которую спе­циалис­ты Elastic Security Labs и Google Threat Intelligence Group при­писы­вают северо­корей­ской груп­пиров­ке UNC1069 (свя­зана с Lazarus, исполь­зует бэк­дор семей­ства WAVESHAPER).

Ра­бочая теория иссле­дова­телей гла­сит, что CanisterWorm, запущен­ный TeamPCP, соб­рал npm-токены с тысяч CI/CD-окру­жений, пос­ле чего эти токены были переда­ны или про­даны учас­тни­кам UNC1069 для ата­ки на Axios. Если эта вер­сия под­твер­дится, это будет озна­чать, что TeamPCP работа­ет не толь­ко с вымога­теля­ми, но и с северо­корей­ски­ми хакера­ми в роли бро­кера дос­тупов.

 

Цифры и выводы

В сухом остатке мар­тов­ская кам­пания TeamPCP выг­лядела сле­дующим обра­зом:

  • по дан­ным SANS Institute, ата­ка на Trivy зат­ронула свы­ше 10 тысяч CI/CD-ворк­флоу, ссы­лав­шихся на ском­про­мети­рован­ные GitHub Actions;
  • по оцен­кам иссле­дова­телей Vx-Underground, в общей слож­ности с 500 тысяч заражен­ных машин укра­ли око­ло 300 Гбайт дан­ных;
  • LiteLLM при­сутс­тву­ет в 36% облачных сред, которые монито­рят спе­циалис­ты Wiz;
  • в Mandiant отсле­жива­ли более 1000 пос­тра­дав­ших SaaS-сред с прог­нозом рос­та на порядок;
  • жер­твы обна­ружи­лись пов­семес­тно, но боль­ше все­го пос­тра­дав­ших, по дан­ным «Лабора­тории Кас­пер­ско­го», было в Рос­сии, Китае, Бра­зилии, Нидер­ландах и ОАЭ.

Тех­ничес­ки в этих ата­ках не исполь­зовались ни 0-day, ни новые экс­пло­иты. Опас­ный пат­терн pull_request_target был задоку­мен­тирован еще нес­коль­ко лет тому назад. Изме­няемые теги GitHub Actions — обще­извес­тная проб­лема. Дол­гоживу­щие PAT с дос­тупом к нес­коль­ким орга­низа­циям — тоже клас­сичес­кая ошиб­ка.

Эк­спер­ты напоми­нают, что всег­да рекомен­дует­ся при­вязы­вать GitHub Actions к пол­ным SHA ком­митов, а не к тегам и отно­сить­ся к CI/CD-ран­нерам с той же серь­езностью, что и к про­дак­шен‑хос­там. PyPI Trusted Publishers с OIDC-аутен­тифика­цией уби­рает из пай­плай­нов дол­гоживу­щие токены, и, если бы раз­работ­чики LiteLLM исполь­зовали этот механизм, укра­ден­ный PYPI_PUBLISH был бы бес­полезен для хакеров.

Так­же во мно­гих отче­тах под­черки­вает­ся, что сер­висные акка­унты не дол­жны содер­жать дол­гоживу­щие PAT с адми­нис­тра­тив­ным дос­тупом к раз­ным орга­низа­циям — из‑за это­го Argon-DevOps-Mgt стал еди­ной точ­кой отка­за сра­зу для двух орга­низа­ций Aqua Security.

Ро­тация сек­ретов пос­ле инци­ден­та дол­жна охва­тывать все сис­темы, ина­че ата­кующие могут сох­ранить дос­туп к валид­ной сес­сии на неоп­ределен­ный срок (что и про­изош­ло меж­ду фев­раль­ским и мар­тов­ским эпи­зода­ми).

Те­перь всем, кто исполь­зовал вре­донос­ные вер­сии Trivy, GitHub Actions Checkmarx, LiteLLM, Telnyx и так далее, рекомен­дует­ся счи­тать свои сек­реты пол­ностью ском­про­мети­рован­ными и сме­нить всё — от облачных учет­ных дан­ных и SSH-клю­чей до API-токенов и паролей от баз дан­ных.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии