Уязвимость в Python-пакете Js2Py, загружаемого более миллиона раз в месяц

В Python-пакете Js2Py, который был загружен в прошлом месяце 1.2 млн раз, выявлена уязвимость (CVE-2024-28397), позволяющая обойти sandbox-изоляцию и выполнить код в системе при обработке специально оформленных данных на JavaScript. Уязвимость может использоваться для атаки на программы, применяющие Js2Py для разбора JavaScript-кода. Исправление пока доступно только в виде патча. Для проверки возможности атаки подготовлен прототип эксплоита.

Пакет Js2Py реализует интерпретатор и транслятор JavaScript, позволяющий выполнять JavaScript-код в изолированной виртуальной машине или транслировать JavaScript в представление на языке Python. Проект написан целиком на языке Python и не использует сторонние JavaScript-движки. На практике библиотека используется в различных web-индексаторах, системах загрузки и анализаторах сайтов, поддерживающих обработку контента, генерируемого кодом на JavaScript.

Из приложений, которые затрагивает уязвимость, отмечаются Lightnovel Crawler (утилита для загрузки книг из online-сервисов и сохранения их в различных форматах для offline-чтения), cloudscraper (автоматически обход используемых в CDN Cloudflare страниц защиты от ботов) и pyLoad (менеджер загрузок, поддерживающий обработку страниц, генерируемых на JavaScript). При обработке в данных приложениях специально оформленного JavaScript-контента злоумышленник может добиться выполнения произвольного кода на уровне системы пользователя.

Уязвимость вызвана использованием глобальной переменной внутри js2py, позволяющей получить ссылку на Python-объект из выполняемого в изолированном окружении коде на JavaScript, невзирая на вызов метода js2py.disable_pyimport() для отключения импорта Python-объектов. Для выполнения произвольного кода в системе атакующий может воспользоваться уязвимостью для получения доступа к объекту Popen из Python-модуля subprocess. Примечательно, что изменение с устранением уязвимости было отправлено в проект Js2Py первого марта, но за три с половиной месяца так и не было принято.

Release. Ссылка here.