<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[PackageGate в 2026: защита npm-проекта от обхода --ignore-scripts через git и .npmrc]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/ea/ee/f9/1774342440961-generated_1774342415939.webp" alt="Обложка: PackageGate в 2026: как защитить npm-проект от обхода --ignore-scripts через git-зависимости в .npmrc" class=" img-fluid img-markdown" /></p>
<p dir="auto">PackageGate - это шесть zero-day уязвимостей в npm, pnpm, vlt и Bun, раскрытых в январе 2026. Главная проблема для npm: обход флага --ignore-scripts через git-зависимости с инъекцией .npmrc. Если вы полагаетесь на этот флаг в CI/CD, ваша защита пробита - атакующий запускает RCE без предупреждений.</p>
<p dir="auto">Это реальная угроза для npm-проектов. Злоумышленник пихает вредоносный .npmrc в git-репо, и npm выполняет его скрипты вместо git. npm отказался патчить, сказав, что сами ветируйте пакеты. Пора разбирать, как защитить стек и не попасть на удой.</p>
<h2>Как работает обход --ignore-scripts в npm</h2>
<p dir="auto">npm клонирует git-зависимость и парсит .npmrc внутри неё. Атакующий пишет в .npmrc строку вроде git=./malicious-script.sh и добавляет вложенную git-зависимость. При обработке nested dep npm запускает фейковый git - полный RCE, даже с --ignore-scripts. Это не теория: есть доказательства PoC с reverse shell в wild.</p>
<p dir="auto">Флаг --ignore-scripts блокирует lifecycle-скрипты вроде postinstall, но git-процесс вне его зоны. npm считает это expected behavior и не фиксит. В итоге ваша pipeline думает, что скрипты заблокированы, а на деле выполняется произвольный код с правами юзера.</p>
<p dir="auto">Вот типичный вектор атаки:</p>
<ul>
<li>Зависимость: “evil-pkg”: “git+https://github.com/attacker/malicious.git”</li>
<li>В malicious.git/.npmrc: <code>git=./pwn.sh</code></li>
<li><a href="http://pwn.sh" target="_blank" rel="noopener noreferrer">pwn.sh</a> содержит reverse shell или копирует секреты</li>
</ul>
<p dir="auto"><strong>Ключевой момент</strong>: nested git deps обрабатываются рекурсивно, каждый раз читая локальный .npmrc.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>–ignore-scripts</th>
<th>Обход через .npmrc</th>
<th>RCE</th>
</tr>
</thead>
<tbody>
<tr>
<td>tarball dep</td>
<td>блокирует</td>
<td>нет</td>
<td>нет</td>
</tr>
<tr>
<td>git dep</td>
<td>блокирует скрипты</td>
<td>да</td>
<td>да</td>
</tr>
<tr>
<td>nested git</td>
<td>пропускает git</td>
<td>да</td>
<td>да</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Нюанс</em>: работает только если git deps разрешены в проекте. Но кто их запрещает?</p>
<h2>Git-зависимости: красный флаг для безопасности</h2>
<p dir="auto">Git deps - это прямой импорт из репозитория, без registry. Удобно для private пакетов или bleeding-edge версий, но сканеры вроде Snyk их не видят. Атакующий форкает популярный репозиторий, пихает .npmrc и подменяет dep в pull request’е. CI/CD тянет git и выполняет код.</p>
<p dir="auto">В PackageGate это основной вектор. npm не проверяет .npmrc на безопасность при git-клоне. Другие менеджеры (pnpm, Bun) пофиксили свои дыры, но npm стоит на позиции “vet yourselves”. В реальных проектах git deps часто в lockfile, и их сложно вырезать.</p>
<p dir="auto">Проверьте свой package.json и package-lock.json:</p>
<ul>
<li><code>grep -r "git+" package-lock.json</code></li>
<li>Сканируйте на подозрительные .npmrc в deps</li>
<li>Блокируйте git deps в .npmrc: <code>git=never</code></li>
</ul>
<p dir="auto"><strong>Опасные паттерны</strong>:</p>
<ul>
<li>git+https://github.com/user/private-pkg#branch</li>
<li>Зависимости от форков без audit</li>
<li>CI без git credential isolation</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Менеджер</th>
<th>Git dep bypass</th>
<th>Статус</th>
<th>Альтернатива</th>
</tr>
</thead>
<tbody>
<tr>
<td>npm</td>
<td>.npmrc injection</td>
<td>не фиксится</td>
<td>pnpm/Bun</td>
</tr>
<tr>
<td>pnpm</td>
<td>prepare scripts</td>
<td>пофикшено</td>
<td>-</td>
</tr>
<tr>
<td>Bun</td>
<td>name spoofing</td>
<td>пофикшено</td>
<td>-</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: lockfile не спасает - attacker меняет git ref после фикса.</p>
<h2>Защита npm-проекта: шаг за шагом</h2>
<p dir="auto">Начните с аудита: отключите git deps полностью или мигрируйте на tarball. В .npmrc добавьте <code>git=never</code> - npm будет падать на git-зависимостях. Для CI используйте audit + sigstore для верификации артефактов. Переход на pnpm: он пофиксил PackageGate и имеет onlyBuiltDependencies по дефолту.</p>
<p dir="auto">Не полагайтесь только на --ignore-scripts - комбинируйте меры. Просканируйте текущие deps на уязвимости, настройте pre-commit хуки для проверки .npmrc. В больших командах внедрите policy: no git deps без review. Тестируйте: создайте PoC локально и убедитесь, что ваша защита держит.</p>
<p dir="auto">Конкретные шаги:</p>
<ol>
<li><code>npm config set git never</code> - глобальный бан git deps</li>
<li>Замените git deps на версии из registry: “pkg”: “1.0.0”</li>
<li>В package.json: скрипт “audit”: “npm audit &amp;&amp; npm ls --all”</li>
<li>CI: <code>npm ci --ignore-scripts --audit-level=high</code></li>
<li>Мониторинг: GitHub Dependabot + Socket.dev для git scans</li>
</ol>
<p dir="auto"><strong>Киллер-фича pnpm</strong>: <code>onlyBuiltDependencies</code> - скрипты только для trusted build deps.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Инструмент</th>
<th>Что ловит</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>npm audit</td>
<td>CVE в registry</td>
<td>пропускает git</td>
</tr>
<tr>
<td>socket.dev</td>
<td>malicious pkgs</td>
<td>платный</td>
</tr>
<tr>
<td>pnpm audit</td>
<td>+git checks</td>
<td>миграция нужна</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Подводный камень</em>: после миграции пересоберите lockfile.</p>
<h2>Фикс, который не случился: что дальше с npm</h2>
<p dir="auto">npm закрыл баг как “wontfix”, поставив ответственность на юзеров. Это two-tier security: enterprise версии фиксят приватно, open-source остаётся с дырой. В 2026 PackageGate показал - JS экосистема зрелая, но менеджеры пакетов отстают.</p>
<p dir="auto">Остаётся думать о hybrid подходе: npm для legacy + pnpm для новых проектов. Или полный переход на Deno/Bun с встроенной безопасностью. Git deps останутся болью, пока registry не заблокирует их по дефолту. Тестируйте свою защиту на PoC из Koi Security - лучше узнать дыру в lab, чем в проде.</p>
]]></description><link>https://forum.exlends.ru/topic/1898/packagegate-v-2026-zashita-npm-proekta-ot-obhoda-ignore-scripts-cherez-git-i-.npmrc</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:45:50 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1898.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Mar 2026 08:54:01 GMT</pubDate><ttl>60</ttl></channel></rss>