Все уязвимости

CVE-2026-112937

filelock: риск удаления соседних данных в ReadWriteLock — CVE-2026-112937

Проверьте Python-пакет filelock 4.1.0–4.2.0, если приложение использует ReadWriteLock или AsyncReadWriteLock в уязвимых условиях на POSIX-системе. Обновитесь как минимум до исправления 4.2.1; на 27 октября 2026 года GitHub показывает 4.2.4 как последний релиз.

Проверено 27 октября 2026GitHub Reviewed advisory: Moderate; CVSS 3.1 — 6.1 (AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L). Это оценка тяжести по CVSS, а не вероятность атаки и не вывод о применимости к конкретной установке. Условия требуют локального пользователя с правом менять имена в каталоге блокировки и соответствующего системного маршрута.

Кому нужно проверить

Разработчикам Python-приложений и администраторам серверов, контейнеров и macOS-систем, где используется пакет filelock. Особенно важно проверить приложения с несколькими пользователями или процессами, если они применяют ReadWriteLock либо AsyncReadWriteLock и размещают базу блокировки в общей директории. Важна не только марка продукта, но и конкретная версия, способ установки, операционная система и конфигурация.

В чём риск

ReadWriteLock хранит состояние блокировки в SQLite и создаёт временные каталоги-ссылки. В описанном advisory дефекте при очистке использовался запомненный путь без проверки, что по нему всё ещё находится созданный самой библиотекой каталог. При подходящем системном маршруте и доступе другого локального пользователя к переименованию записей процесс приложения мог рекурсивно удалить подменённое дерево с правами самого приложения. Возможный результат — удаление файлов и каталогов, доступных процессу-владельцу блокировки; advisory сообщает, что операция могла завершиться без ошибки. Это локальный сценарий, а не удалённый доступ через обычный запрос к сайту. Не запускайте искусственные проверки гонки на рабочей системе.

Затронутые версии

GitHub Security Advisory относит к уязвимым filelock 4.1.0–4.2.0 включительно. Проблемный код относится к SQLite-блокировкам ReadWriteLock и AsyncReadWriteLock и проявляется на маршруте с жёсткими ссылками. Он используется на macOS начиная с 4.1.1 и на POSIX-системах, где недоступен пригодный путь /proc/self/fd, например в контейнере или chroot без смонтированного /proc. Дополнительно другой локальный пользователь должен иметь возможность переименовывать записи в каталоге базы блокировки; риск касается, в частности, общего каталога с правом записи для группы или всех пользователей и без sticky bit. По advisory, штатный Linux с доступным /proc не затронут именно этим сценарием. Само наличие пакета в диапазоне не означает, что условия атаки выполнены.

Исправленные версии

Исправление выпущено в filelock 4.2.1. На 27 октября 2026 года страница релизов проекта отмечает 4.2.4 как последний релиз; выбирайте актуальный совместимый выпуск, содержащий исправление, а не ограничивайтесь установкой старого минимального 4.2.1. В advisory не перечислен отдельный backport в старые ветки; сопровождающий в PR сообщил, что старые minor-ветки не поддерживаются. Для пакетов ОС и производных сборок сверяйте сведения их поставщика.

Что сделать

  1. 1Сначала определите Python-окружения, в которых реально работают веб-приложение, фоновые задачи и контейнеры. Выполните безопасную команду ниже именно тем интерпретатором, который запускает службу; отдельно проверьте lock-файлы зависимостей и собранные образы.
  2. 2Проверьте использование ReadWriteLock и AsyncReadWriteLock в коде и выясните, где находится их SQLite-файл. Зафиксируйте операционную систему, доступность /proc/self/fd в том же контейнере или chroot и права на каталог базы и его родительские каталоги. Не считайте штатный Linux с доступным /proc уязвимым именно по описанному advisory сценарию, но всё равно обновите зависимость.
  3. 3Если установка работает на затронутом POSIX-маршруте и обновление нельзя выполнить сразу, временно перенесите базу ReadWriteLock в каталог, куда писать может только учётная запись блокировки (или root), без права записи для группы и остальных. Проверьте также родительские каталоги: по рекомендациям проекта они должны принадлежать этой учётной записи или root и быть недоступны для записи посторонним либо иметь sticky bit. Не делите базу между учётными записями через общий доступный для записи каталог и не держите ценные соседние каталоги рядом с базой в такой общей директории. Это временная мера, не замена обновлению.
  4. 4Перед обновлением сохраните файл фиксации зависимостей, конфигурацию сборки и нужные данные приложения. На staging-среде обновите пакет до актуального совместимого выпуска с исправлением; минимально исправленным advisory называет 4.2.1, а страница релизов на дату проверки показывала 4.2.4. Проверьте совместимость приложения и его тесты до выкладки.
  5. 5Для отката подготовьте прежний артефакт приложения, но не возвращайте уязвимую версию без сохранения временных ограничений доступа к каталогу. Если совместимость требует отката к версии 4.2.0 или ниже, сначала согласуйте безопасный режим и ограничьте доступ к каталогу базы.
  6. 6Разверните новый пакет во всех виртуальных окружениях, образах, workers и экземплярах службы, затем перезапустите процессы, чтобы они загрузили обновлённую библиотеку. Повторите проверку версии в фактическом окружении и убедитесь, что каталог блокировки имеет запланированные владельца и права.
  7. 7Проверьте штатные сценарии чтения и записи приложения, совместную работу процессов и журналы на предмет неожиданных ошибок или отсутствующих файлов. Если приложение работало с общей директорией и есть признаки удаления данных, сохраните журналы и резервные копии для расследования; одно обновление не восстанавливает уже удалённые данные.

Когда версия filelock требует особого внимания

Статичная схема отделяет сам факт наличия старой версии от условий применимости CVE. Она читается как нумерованный список и не использует цвет или движение для передачи смысла.

  1. 1Приложение использует ReadWriteLock или AsyncReadWriteLock из filelock.
  2. 2Версия попадает в диапазон 4.1.0–4.2.0, а процесс идёт по маршруту с жёсткими ссылками.
  3. 3Другой локальный пользователь может менять имена записей в доступном для записи каталоге базы блокировки.
  4. 4Обновите библиотеку и ограничьте права каталога; затем проверьте фактическую версию и работу приложения.

Примеры конфигурации и проверки

Проверить версию filelock в активном Python-окружении (shell)
python - <<'PY'
from importlib.metadata import PackageNotFoundError, version

try:
    print('filelock:', version('filelock'))
except PackageNotFoundError:
    print('filelock: не установлен в этом Python-окружении')
PY

Диагностическая команда для Python 3.8 и новее: читает метаданные установленного пакета и ничего не меняет. Запускайте без sudo тем интерпретатором и внутри того контейнера или virtualenv, которым пользуется нужная служба. Ожидается версия filelock либо сообщение, что пакет не установлен именно в этом окружении. Проверьте также lock-файл зависимостей и другие окружения: отсутствие пакета здесь не исключает его в другом сервисе. Команда не проверяет операционную систему, использование ReadWriteLock и права на каталог; откат не нужен.

Как не подпустить ботов к сайту

BotProtection принимает запросы перед вашим сайтом и фильтрует автоматизированные обращения. Поэтому ботам сложнее добраться до уязвимого компонента и начать его проверять или атаковать, а вероятность успешной автоматизированной атаки становится значительно ниже. Это дополнительный слой защиты: обновление уязвимых компонентов, проверка журналов и реагирование на инциденты остаются обязательными.

Первоисточники

Снизьте шанс атаки до того, как бот дойдёт до сайта

Подключите BotProtection как фильтр перед сайтом: подозрительные автоматизированные запросы отсекаются до обращения к вашему серверу. Это значительно снижает вероятность автоматизированной атаки, но не исправляет саму уязвимость, поэтому обновление и настройка компонентов остаются обязательными.