Уязвимость в NPM-пакете pac-resolver, насчитывающем 3 млн загрузок в неделю

В NPM-пакете pac-resolver, насчитывающем более 3 млн загрузок в неделю, выявлена уязвимость (CVE-2021-23406), которая позволяет добиться выполнения своего JavaScript-кода в контексте приложения при отправке HTTP-запросов из Node.js-проектов, поддерживающих функцию автонастройки прокси-сервера.

Пакет pac-resolver осуществляет разбор PAC-файлов, включающих сценарий автоматической настройки прокси-сервера. PAC-файл содержит обычный JavaScript-код с функцией FindProxyForURL, определяющей логику выбора прокси в зависимости от хоста и запрашиваемого URL. Суть уязвимости в том, что для выполнения данного JavaScript-кода в pac-resolver применялся предоставляемый в Node.js API VM,
позволяющий выполнить JavaScript-код в другом контексте движка V8.

Указанный API явно помечен в документации как не предназначенный для запуска кода, не заслуживающего доверия, так как он не предоставляет полноценной изоляции запускаемого кода и позволяет получить доступ к изначальному контексту. Проблема устранена в выпуске pac-resolver 5.0.0, который переведён на использование библиотеки vm2, предоставляющей более высокий уровень изоляции, подходящий для запуска не заслуживающего доверие кода.


При использовании уязвимоей версии pac-resolver атакующий через передачу специально оформленного PAC-файла может добиться выполнения своего JavaScript-кода в контексте кода проекта, использующего Node.js, если в данном проекте используется библиотека Proxy-Agent, указанная в зависимостях у 360 проектов, включая urllib, aws-cdk, mailgun.js и firebase-tools, насчитывающих более сотни тысяч загрузок в неделю.

Если приложение, связанное зависимостями с pac-resolver, загружает PAC-файл, предоствляемый системой с поддержкой протокола автоматической настройки прокси WPAD, то для подстановки вредоносных PAC-файлов злоумышленники, имеющие доступ к локальной сети, могут воспользоваться распространением настроек прокси через DHCP.

Release. Ссылка here.