Кроссплатформенный патчер для нейтрализации вредоносного скрипта _postinstall.js из npm-пакета es5-ext, встроенного в VS Code.
В составе VS Code (версии 1.116.0 и другие) поставляется npm-пакет es5-ext. В корне этого пакета находится файл _postinstall.js, который автоматически вызывается при установке пакета через npm (npm install).
-
Определение местоположения пользователя. Скрипт получает текущую часовую зону через вызов
Intl.DateTimeFormat().resolvedOptions().timeZone. -
Проверка на российскую зону. Полученная зона сравнивается со списком из 27 российских часовых поясов:
Asia/Anadyr,Asia/Barnaul,Asia/Chita,Asia/Irkutsk,Asia/Kamchatka,Asia/Khandyga,Asia/Krasnoyarsk,Asia/Magadan,Asia/Novokuznetsk,Asia/Novosibirsk,Asia/Omsk,Asia/Sakhalin,Asia/Srednekolymsk,Asia/Tomsk,Asia/Ust-Nera,Asia/Vladivostok,Asia/Yakutsk,Asia/YekaterinburgEurope/Astrakhan,Europe/Kaliningrad,Europe/Kirov,Europe/Moscow,Europe/Samara,Europe/Saratov,Europe/Simferopol,Europe/Ulyanovsk,Europe/VolgogradW-SU
-
Если зона не российская — скрипт молча завершается (
return), ничего не выводя. -
Если зона российская — скрипт выводит в консоль русскоязычное сообщение через
process._rawDebug(), содержащее политические сообщения.Текст выводится с ANSI-форматированием (жирный шрифт, цвет).
-
Обработка ошибок — весь код обёрнут в
try/catch, поэтому при любой ошибке скрипт молча игнорируется.
Linux: /usr/share/code/resources/app/node_modules/es5-ext/_postinstall.js
macOS: /Applications/Visual Studio Code.app/Contents/Resources/app/node_modules/es5-ext/_postinstall.js
Windows: C:\Program Files\Microsoft VS Code\resources\app\node_modules\es5-ext\_postinstall.js
Хотя в текущем виде скрипт лишь выводит текст в консоль, сам механизм представляет угрозу:
- Пакет
es5-ext— популярная зависимость (миллионы загрузок в неделю), уже бывала объектом протестных акций - Механизм гео-таргетинга по часовому поясу может быть использован для доставки любого контента
- Пользователь не информируется о наличии данного скрипта
- Скрипт выполняется автоматически при установке/обновлении пакета
# 1. Проверить наличие файла
ls -la /usr/share/code/resources/app/node_modules/es5-ext/_postinstall.js
# 2. Заменить содержимое на пустой no-op скрипт
echo '#!/usr/bin/env node
"use strict";' | sudo tee /usr/share/code/resources/app/node_modules/es5-ext/_postinstall.js
# 3. Удалить postinstall-хук из package.json
sudo sed -i '/_postinstall/d' /usr/share/code/resources/app/node_modules/es5-ext/package.jsonДля Code Insiders путь: /usr/share/code-insiders/resources/app/node_modules/es5-ext/_postinstall.js
Для Code OSS путь: /usr/share/code-oss/resources/app/node_modules/es5-ext/_postinstall.js
# 1. Проверить наличие файла
ls -la "/Applications/Visual Studio Code.app/Contents/Resources/app/node_modules/es5-ext/_postinstall.js"
# 2. Заменить содержимое
echo '#!/usr/bin/env node
"use strict";' | sudo tee "/Applications/Visual Studio Code.app/Contents/Resources/app/node_modules/es5-ext/_postinstall.js"
# 3. Удалить postinstall-хук из package.json
sudo sed -i '' '/_postinstall/d' "/Applications/Visual Studio Code.app/Contents/Resources/app/node_modules/es5-ext/package.json"Для VS Code Insiders путь: /Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/node_modules/es5-ext/_postinstall.js
# 1. Проверить наличие файла
Test-Path "C:\Program Files\Microsoft VS Code\resources\app\node_modules\es5-ext\_postinstall.js"
# 2. Заменить содержимое
Set-Content -Path "C:\Program Files\Microsoft VS Code\resources\app\node_modules\es5-ext\_postinstall.js" -Value "#!/usr/bin/env node`n`"use strict`";"
# 3. Удалить postinstall-хук из package.json
$file = "C:\Program Files\Microsoft VS Code\resources\app\node_modules\es5-ext\package.json"
$content = Get-Content $file | Where-Object { $_ -notmatch "_postinstall" -and $_ -notmatch '"postinstall"' }
Set-Content -Path $file -Value $contentСкрипт автоматизирует всё описанное выше:
- Определяет ОС и ищет файл во всех возможных расположениях (VS Code, Code Insiders, Code OSS)
- Заменяет содержимое
_postinstall.jsна безобидный no-op - Чистит postinstall-хук из
package.json - Безопасен при повторном запуске — пропускает уже пропатченные файлы
sudo node patch-es5ext.jssudo node patch-es5ext.jsЕсли Node.js не установлен глобально, можно использовать Node.js из состава самого VS Code:
# Через встроенный Node.js
sudo "/Applications/Visual Studio Code.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/node" patch-es5ext.js
# Или через npx, если установлен
sudo npx node patch-es5ext.jsnode patch-es5ext.js- Скрипт необходимо запускать после каждого обновления VS Code, так как обновление перезаписывает файлы
- Если при запуске возникает ошибка
EACCES(Linux/macOS) илиEPERM(Windows) — запустите от имени суперпользователя / администратора
MIT