Typosquatting у npm: як фальшивий @acitons/artifact цілився у GitHub Actions

CyberSecureFox 🦊

Аналіз Veracode зафіксував у реєстрі npm підроблений пакет @acitons/artifact, що видавав себе за легітимний @actions/artifact і був націлений на оточення GitHub Actions. Згодом GitHub підтвердив: мова йде не про реальну компрометацію, а про строго контрольовані навчання Red Team, покликані перевірити надійність внутрішніх процесів безпеки.

Що сталося: опублікований пакет і масові встановлення

Пакет з’явився 29 жовтня 2025 року та швидко набрав охоплення: загалом 47 405 завантажень, з них 31 398 за останній тиждень. Ключова ідея — typosquatting: помилка у scope (@acitons замість @actions) спрацьовує на людський фактор під час додавання залежностей.

За даними Veracode, шкідливу логіку містили шість версій — 4.0.12–4.0.17. Вони були розміщені з облікового запису blakesdev, а під час перевірки небезпечні релізи поступово видалялися; «чистою» лишалася 4.0.10. Дослідники також виявили споріднений пакет 8jfiesaf83 (згодом видалений), який встигли завантажити 1 016 разів.

Механіка атаки: typosquatting і postinstall у ланцюгу інсталяції

У версіях із шкідливою логікою спрацьовував postinstall-хук — автоматичний сценарій, що запускається під час інсталяції пакету. Він завантажував двійковий файл harness зі вже видаленого GitHub-акаунта. Насправді це був обфускований shell-скрипт із «таймером»: якщо системна дата була 6 листопада 2025 року і пізніше, завантаження не виконувалося.

Далі запускався verify.js, який перевіряв наявність змінних середовища GITHUB_*, характерних для раннерів GitHub Actions. Якщо виявлялося цільове середовище, відбувалася екфільтрація тимчасових токенів з шифруванням та передачею на піддомен app.github.dev. Додатково застосовувалася фільтрація за власником репозиторію: при невідповідності GITHUB_REPOSITORY_OWNER організації GitHub виконання припинялося, що свідчить про таргетований задум.

Чому це важливо: ризики для ланцюга постачання ПЗ та DevOps

Подія демонструє, наскільки вразливими є ланцюги постачання ПЗ до поєднання typosquatting і lifecycle-скриптів. Оскільки postinstall виконується автоматично, одна опечатка в імені пакета може перетворитися на точку входу. У контексті CI/CD наслідки включають доступ до секретів пайплайна, артефактів збірки і тимчасових токенів для операцій з репозиторіями.

Хоча GitHub підкреслив, що це були реалістичні, але контрольовані навчання, сценарій перегукується з реальними інцидентами в екосистемі відкритого коду (наприклад, event-stream чи UAParser.js) та підтверджує цінність підходу «мінімально необхідних привілеїв» і жорсткої перевірки походження залежностей.

Позиція GitHub і етичний вимір публічних тренувань

Представники GitHub заявили, що «системи та дані GitHub не перебували під загрозою». Водночас той факт, що «навчальний» пакет опинився у публічному npm і зібрав майже 50 тис. установок, порушує питання меж допустимого реалізму, потенційного впливу на сторонніх розробників і необхідності оперативної ревокації артефактів навчань у відкритих реєстрах.

Практичні кроки захисту CI/CD та залежностей

Базові дії для команд розробки та DevOps

1) Мінімізуйте опечатки та підміну scope. Використовуйте внутрішні реєстри/дзеркала, allowlist для namespaces, шаблони залежностей і code review.

2) Жорстке версіонування. Фіксуйте версії через lock-файли (package-lock.json), встановлюйте через npm ci, проводьте регулярний аудит залежностей і уникайте автоматичних мажорних оновлень.

3) Обмеження виконання скриптів. У CI за замовчуванням вимикайте lifecycle-скрипти (npm install –ignore-scripts), дозволяючи їх точково там, де це справді потрібно.

4) Зміцнення GitHub Actions. Знижуйте права GITHUB_TOKEN до мінімально необхідних, застосовуйте environment protection rules, OIDC і політику «deny-by-default» для секретів.

5) Сегментація мережі та моніторинг. Обмежуйте вихідні з’єднання раннерів за allowlist, логувуйте нетиповий трафік, інтегруйте EDR/NSM у CI.

6) Прозорість ланцюга постачання. Формуйте SBOM (наприклад, CycloneDX), перевіряйте цілісність артефактів і впроваджуйте політики довіреного походження пакетів.

Історія з @acitons/artifact — нагадування про крихкість екосистеми відкритого ПЗ і необхідність дисципліни

Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються дані ваших коментарів.