DEV Community

Cover image for install ps1 iex: почему нельзя выполнять скачанные команды - урок TeamPCP от ФБР
Promptra Team for Promptra

Posted on

install ps1 iex: почему нельзя выполнять скачанные команды - урок TeamPCP от ФБР

Запрос «install ps1 iex» обычно приводит к одной и той же команде: powershell -ExecutionPolicy Bypass -c "irm https://…/install.ps1 | iex". Её тебе дала документация, форум или AI-ассистент, и вопрос «а выполнять ли это вообще» - самый правильный из возможных. Короткий ответ: сама по себе связка легитимна, ей пользуются официальные проекты; опасно слепое выполнение всего, что вернул сервер.

Насколько это опасно, в 2026 году стало видно по официальным документам. 2 июля ФБР опубликовало бюллетень FLASH-20260702-01 «Cyber Criminal Group TeamPCP» (TLP:CLEAR, шесть страниц): группа TeamPCP отравила сразу несколько инструментов, которыми пользуются разработчики и безопасники, и выкачивала облачные токены, SSH-ключи и Kubernetes-секреты из тысяч CI/CD-окружений. Среди жертв - LiteLLM, библиотека-шлюз к API нейросетей с примерно 95 млн загрузок в месяц на PyPI: 24 марта она почти два часа раздавала бэкдор вместе с обычным обновлением, а главной добычей стали API-ключи к LLM-провайдерам.

Что делает команда irm …install.ps1 | iex?

Коротко: однострочник скачивает скрипт в память и тут же исполняет его как код, не сохраняя файл на диск. Права скрипт получает те же, что у тебя, - если терминал открыт от администратора, то и выполнится он от администратора. Флаг -ExecutionPolicy Bypass при этом глушит предупреждения о неподписанных скриптах.

По косточкам:

Фрагмент команды Что он делает Чем рискует
powershell запускает интерпретатор PowerShell код работает в новом процессе с твоими правами
-ExecutionPolicy Bypass отключает политику подписи на время этого процесса неподписанный скрипт запускается без единого вопроса
irm https://…/install.ps1 Invoke-RestMethod скачивает текст скрипта код приезжает из сети напрямую в память
`\ ` пайп передаёт скачанное дальше
iex Invoke-Expression исполняет текст как код выполняется всё, что сервер вернул в эту секунду

Два следствия из этой механики. Первое: fileless-выполнение - файл на диск не пишется, но процесс и его поведение могут обнаружить EDR, антивирус и сетевой мониторинг. Второе: между «скачал» и «выполнил» нет паузы, чтобы открыть скрипт глазами и решить, доверяешь ли ты ему.

При этом iex - не вирус и не хакерская находка. Это штатный командлет Invoke-Expression, и сама Microsoft в документации к нему держит блок Caution: проверяй, что команда безопасна, а оператор вызова & компания прямо называет более безопасной альтернативой.

Почему «скачать и выполнить» стало нормой - и главным каналом атаки?

Коротко: паттерн нормализовали сами легитимные проекты. Так ставят Hugging Face CLI (irm https://hf.co/cli/install.ps1 | iex), Bun, winutil Криса Титуса. Когда официальная документация учит «выполни вот это от админа», граница между нормой и подставой стирается, и атакующие играют именно на этой привычке.

Модель «скачал из сети - исполнил» - это и есть атака на цепочку поставок в бытовом исполнении: злоумышленнику не нужно взламывать тебя лично, достаточно встать на пути установки или обновления. У паттерна есть unix-брат - curl | bash: синтаксис другой, слепота та же.

Отдельно про миф о защите: политика выполнения никого не защищает, это предупреждение, которое флаг Bypass просто выключает на время процесса. В Microsoft Q&A (май 2026) паттерн irm ... | iex прямо назван опасным, а рекомендация звучит буднично: скачать скрипт, изучить и только потом выполнить. Признаками закрепления малвари там же названы Run-ключи реестра и задачи планировщика с -ExecutionPolicy Bypass плюс iex(irm …) - запомни эту связку, она понадобится ниже.

Кстати, помимо установки AI-инструменты упираются в российскую реальность и деньгами: заплатить за Claude или GPT российской картой напрямую нельзя. Рабочих путей три: зарубежная карта, реселлеры с наценкой и агрегаторы вроде provod.ai (российский OpenRouter), где те же модели доступны в рублях по официальным тарифам. Но сначала - про саму команду, она важнее.

Что пишет ФБР про TeamPCP?

Коротко: за пять дней марта 2026 группа TeamPCP прошла каскадом через пять экосистем - от сканера безопасности Trivy до библиотеки LiteLLM на PyPI. ФБР связывает с кампанией четыре CVE, а маркером заражения называет репозитории tpcp-docs и docs-tpcp, которые червь создаёт в GitHub-организации жертвы украденными кредами. По состоянию на июль 2026 украденные креды нужно считать скомпрометированными до отзыва или ротации и после инцидента продолжать мониторинг.

Хронология по отчётам Mallory Intel, Trend Micro и Cycode:

Дата (2026) Цель Что случилось
19 марта Trivy, GitHub форс-пуш 76 из 77 тегов trivy-action и всех 7 тегов setup-trivy; троянизированный релиз v0.69.4
20 марта npm червь CanisterWorm: 28 пакетов scope @EmilGroup заражены менее чем за 60 секунд
22 марта Docker Hub образы aquasec/trivy:0.69.5 и 0.69.6 залиты напрямую украденными кредами, в обход GitHub-релизов
23 марта KICS + OpenVSX угнаны все 35 тегов kics-github-action и два расширения VS Code
24 марта PyPI LiteLLM 1.82.7 и 1.82.8 с бэкдором; в 13:38 UTC PyPI поместил пакет в карантин

Показательно, что первой доминошкой пал инструмент безопасника. В конце февраля бот эксплуатировал небезопасный pull_request_target-workflow в CI Trivy и украл токен aqua-bot. Aqua раскрыла инцидент 1 марта и начала ротацию, но, как признано в её же пост-мортеме, ротация «wasn't atomic» - у атакующих остался резидуальный доступ, которым они и воспользовались 19 марта. Инцидент получил номер CVE-2026-33634 (CVSS 9.4, «встроенный вредоносный код») и позже попал в каталог CISA KEV.

Каскад TeamPCP 19-24 марта 2026: Trivy, npm, Docker Hub, KICS, LiteLLM

Особняком стоит эпизод с LiteLLM, потому что он бьёт прямо по пользователям нейросетей. TeamPCP украденным из CI токеном PYPI_PUBLISH опубликовала версии 1.82.7 (10:39 UTC) и 1.82.8 (10:52 UTC) - ирония в том, что CI самой LiteLLM гонял отравленный Trivy. В 11:48 UTC исследователь Callum McMahon открыл GitHub issue #24512 после «fork bomb» на своей машине; атакующий с правами мейнтейнера закрыл тред и засыпал его бот-комментариями.

Механика бэкдора - отдельный урок. В 1.82.7 это было 12 строк обфусцированного кода в proxy_server.py, а в 1.82.8 - файл litellm_init.pth размером 34 628 байт в site-packages. Python исполняет import-строки из файлов .pth при каждом старте интерпретатора, поэтому малварь срабатывала в любом Python-процессе - Jupyter, Ansible, тесты - даже без импорта litellm. Snyk подтвердил, что файл был честно задекларирован в RECORD колеса с валидным хэшем: формально пакет был «целым». А Wiz оценивала присутствие LiteLLM примерно в 36% облачных окружений.

Что забирают с машины разработчика?

Коротко: облачные токены AWS, GCP и Azure, SSH-ключи, секреты Kubernetes, env-переменные, криптокошельки и API-ключи к LLM-провайдерам. ФБР перечисляет семейства CanisterWorm, SANDCLOCK, Mini Shai-Hulud и его вариант Miasma - самораспространяющихся червей по npm и PyPI. Список скомпрометированных инструментов бюро даёт открытым: «including, but not limited to».

Пейлоад в отравленном Trivy, по данным Trend Micro и наблюдениям CrowdStrike, скрейпил память процесса Runner.Worker, собирал креды с файловой системы, шифровал связку AES-256-CBC плюс RSA-4096 и уводил её на типосквоттинг-домен scan.aquasecurtiy[.]org - обрати внимание на пропущенную «i». Второй C2-домен из отчёта ФБР - checkmarx[.]zone, тоже имитация известного бренда безопасности. Самое неприятное: легитимный скан после кражи отрабатывал нормально. В логах не было видно ничего.

Масштаб последствий виден по жертвам. У Mercor через украденные ключи Tailscale выкачали 4 ТБ: исходный код, базу с PII, видеоинтервью, документы удостоверения личности. По сводке Cloud Security Alliance (Google GTIG ведёт группу как UNC6780), креды из взлома Trivy позже открыли dev-окружение Cisco - 300+ внутренних репозиториев с исходниками Cisco AI Assistant. А 18-20 мая группа вошла во внутреннюю инфраструктуру GitHub через троянизированное расширение Nx Console, пролежавшее на Visual Studio Marketplace 18 минут, и забрала около 3 800 репозиториев.

Формулировка ФБР про украденное стоит того, чтобы её прочитать дважды: аффилированные группы, вероятно, «будут использовать эти данные как оружие спустя долгое время после первичной компрометации». Ключ не протухает - он всплывает в атаках через месяцы и годы, и вымогательская группа VECT уже связана с этим потоком. Ротация здесь - рабочий ответ, другого ФБР не оставляет.

Здесь же уместна мысль про гигиену ключей. Токены, разбросанные по .env-файлам на каждой машине и в каждом pet-проекте, - идеальная мишень для такого скрейпера. В provod.ai единый API ко всему каталогу моделей подключается заменой ключа и base_url - он совместим с OpenAI- и Anthropic-SDK, так что Claude Code, Cursor и n8n подхватывают его без переписывания кода: удобство интеграции; ключи для чата и продакшена лучше разделять, хранить в секрет-менеджере, выдавать с минимальными правами и регулярно ротировать.

Как установить инструмент и не подставиться?

Коротко: разорви сцепку «скачал - выполнил» паузой. Проверь домен первоисточника, скачай файл, прочитай его глазами, выполни локально. В CI правила жёстче: пин версий к полным SHA коммитов, минимальный возраст пакета семь дней, мониторинг исходящих соединений. Это не мои выдумки - это рекомендации ФБР из того же FLASH.

Для ручной установки на Windows:

  1. Возьми ссылку только с первоисточника: официальный репозиторий, официальная документация. Не из чата, не из рекламы, не из «удобного» зеркала. Сверь домен побуквенно - типосквоттинг в этой истории сработал дважды.
  2. Скачай скрипт файлом: irm https://…/install.ps1 -OutFile install.ps1.
  3. Открой в редакторе и прочитай. Ищи обфусцированные куски, base64, странные исходящие адреса, iex внутри самого скрипта.
  4. Выполни локально через оператор вызова: & .\install.ps1, без Bypass, если скрипт подписан.
  5. Если ставишь через пакетный менеджер, используй lock-файлы, явные версии, проверенные хэши или подписи и изолированное окружение: сам менеджер не гарантирует безопасность.

Для CI/CD ФБР рекомендует: пиновать GitHub Actions к полным SHA коммитов вместо плавающих тегов (именно плавающие теги и переписали в Trivy); выдерживать минимальный возраст пакета семь дней во всех средах - в окне LiteLLM это спасло бы тебя автоматически; включить фишинг-устойчивый MFA для аккаунтов с правом публикации; мониторинг раннеров вроде Harden-Runner на неожиданные исходящие соединения; аудит npm-аккаунтов на протухшие recovery-домены.

Уже выполнил подозрительную команду - что теперь?

Коротко: отключи машину от сети, проверь точки закрепления и начинай ротацию ключей, не дожидаясь «симптомов». В кейсе Trivy жертвы ничего не замечали - сканер работал как обычно, пока креды уже были на чужом сервере. Отсутствие признаков здесь ничего не значит.

Порядок такой. Сначала изолируй машину от сети. Потом проверь Run-ключи реестра и планировщик на связку -ExecutionPolicy Bypass плюс iex(irm …) - Microsoft называет её типичным признаком персистентности. Дальше - GitHub: ищи в своей организации репозитории tpcp-docs или docs-tpcp, их создание ФБР считает маркером заражения. И ротация: облачные креды, SSH-ключи, токены CI/CD и API-ключи к LLM в первую очередь - именно они были главной целью TeamPCP. Секреты, токены, артефакты и окружения, попавшие в область экспозиции 19-24 марта, нужно расследовать по конкретным задачам CI и раннерам; секреты и креды из этого окна - ротировать.

Чего этот ритуал не решает

Коротко: «скачал, прочитал, запустил» защищает от случайной дрянной ссылки, но не от компрометации самого вендора. Бэкдор в LiteLLM приехал в официально опубликованном на PyPI пакете с валидным RECORD-хэшем, а Trivy был отравлен в доверенном GitHub Action: целостность колеса не подтверждает добросовестность публикации.

Поэтому честная картина такая. Ритуал проверки закрывает бытовой сценарий «нашёл однострочник в чате». Системный риск цепочки поставок он не снимает: там работают только пин версий и SHA, возрастной ценз пакетов, изоляция секретов от пайплайнов и мониторинг исходящего трафика. Меня в этой истории больше всего напрягает именно это: даже идеальная паранойя пользователя не спасла бы от колеса 1.82.8 с валидным хэшем.

Когда provod.ai не подходит

Коротко: provod.ai решает доступ к моделям и оплату из России - и ничего из области безопасности твоего пайплайна. Если твоя задача - защитить CI/CD, ритуалы выше придётся внедрять самому.

Агрегатор не просканирует твои зависимости, не заменит Harden-Runner и не отменит ротацию секретов - если ты гонял отравленные версии в марте 2026, чини это независимо от того, где берёшь модели. Не закрывает он и сценарии on-prem и fine-tuning: для закрытого контура с собственными весами нужна другая инфраструктура. А прямой Enterprise-контракт с вендором ради их SLA - отдельная история, где посредник не нужен. Для обычной работы с API и чатом из России - с оплатой в рублях, договором и закрывающими для юрлица - агрегатор проще самодельных схем с зарубежными картами.


provod.ai — российский AI API-роутер для личных и корпоративных сценариев

Один API и веб-интерфейс объединяют привычную AI-экосистему: от первого запроса в чате до агентных систем, мультимедиа и production-интеграций для бизнеса.

В одном каталоге — актуальные модели для текста и медиа: GPT от OpenAI, Claude от Anthropic, Gemini от Google, Grok от xAI, DeepSeek, Qwen, GLM, Kimi и MiniMax; для изображений — Nano Banana 2 Pro и GPT Image; для видео — последние версии Seedance, Kling, Veo и Google Omni. Также доступны модели для reasoning, поиска, документов, эмбеддингов, музыки и аудио.

Ценовая основа платформы — официальный тариф без собственной маржи: 1:1 с провайдером, оплата в рублях, единый баланс и документы для бизнеса. Это один из самых прямых и доступных способов оплачивать мировой AI-каталог из России.

Подключитесь к provod.ai: форма регистрации · цены на модели · защита данных по 152-ФЗ · главная provod.ai

FAQ

Коротко: пять вопросов, которые возникают после таких разборов, с ответами без повторов уже сказанного.

iex в PowerShell - это вирус?
Нет, это штатный командлет Invoke-Expression, он десятилетиями в системе. Опасно применение к непроверенному вводу: Microsoft в официальной документации держит для этого блок Caution и советует оператор & как более безопасную альтернативу.

Чем irm | iex отличается от curl | bash?
Модель одна: скачать текст в память и исполнить, не сохраняя. Различия в синтаксисе и в правах: PowerShell-вариант чаще запускают от администратора, так что права у малвари сразу максимальные.

Выполнил команду, и ничего не случилось - я в безопасности?
Не факт. Отравленный Trivy после кражи кредов честно делал свою работу, и CrowdStrike прямо отмечает отсутствие признаков в логах. Ключи ротируй без ожидания симптомов.

Как ФБР рекомендует защищать CI/CD?
Пин Actions к полным SHA, возраст пакета от семи дней, фишинг-устойчивый MFA на публикацию, мониторинг исходящих соединений раннеров, ротация секретов из окна экспозиции.

Почему взлом LiteLLM касается тех, кто просто пользуется API ChatGPT или Claude?
Потому что шлюзы вроде LiteLLM - точка, где концентрируются ключи сразу ко многим провайдерам, а ключи и были главной целью атаки.

Урок TeamPCP сводится к одному предложению: пауза между «скачал» и «выполнил» - это гигиена, и в 2026 году ФБР пишет про неё в официальных бюллетенях. Проверь домен, сохрани файл, прочитай, выполни локально; в CI - пинуй версии и держи семидневный ценз на свежие пакеты. А привычку «разбрасывать секреты по машинам и ставить что-то от админа» пора оставить в прошлом.

Один ключ provod.ai вместо россыпи токенов по машинам

Хочешь попробовать модели без установочных скриптов от администратора и без зарубежной карты: зайди на provod.ai - подключение это замена ключа и base_url в твоём клиенте, оплата в рублях по официальным тарифам провайдеров, для юрлиц договор и закрывающие документы.

Спорный момент напоследок: я считаю, что проекты, которые до сих пор предлагают irm | iex как способ установки по умолчанию, несут часть ответственности за нормализацию этой привычки. Согласен - или вина целиком на тех, кто выполняет не глядя?

Источники

Top comments (0)