
Уязвимость BDU:2024-11662 в пакетном менеджере Nix
Уязвимость BDU:2024-11662 (CVE-2024-45593) в пакетном менеджере Nix позволяет злоумышленникам создавать специальные NAR-архивы (Nix Archive), которые при распаковке перезаписывают произвольные файлы в системе. Это происходит из-за некорректной обработки коллизий имён файлов, связанных с регистром символов (case-insensitive FS) и суффиксами ~nix~case~hack~*
. Уязвимость критична при использовании Nix-демона (с правами root).
Затронутые версии: Nix 2.24 до 2.24.6.
CVSS 3.0: AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
Технический анализ
1. Механизм Case-Hack
Nix использует суффикс ~nix~case~hack~N
для разрешения коллизий имён файлов в case-insensitive файловых системах (например, macOS). Например:
-
Файлы
Test.txt
иtest.txt
→ переименовываются вTest.txt~nix~case~hack~1
иtest.txt
.
Проблема: До версии 2.24.6 не проверялось, что добавление суффикса может создать новую коллизию (например, если злоумышленник создаст файлtest~nix~case~hack~1.txt
).
2. Уязвимый код
В файле src/libutil/archive.cc
:
// Было (до 2.24.6):
if (archiveSettings.useCaseHack)
name += caseHackSuffix + std::to_string(++i->second);
// Стало (в 2.24.6):
auto j = names.find(name);
if (j != names.end())
throw Error("NAR содержит имя '%s', конфликтующее с '%s'", prevName, j->first);
Теперь при добавлении суффикса выполняется проверка, что новое имя не конфликтует с существующими.
3. Вектор атаки
Злоумышленник создаёт NAR-архив, содержащий:
-
Файл
A.txt
. -
Файл
a.txt~nix~case~hack~1
.
При распаковке Nix:
-
Переименует
A.txt
→A.txt~nix~case~hack~1
. -
Обнаружит коллизию между
A.txt~nix~case~hack~1
и злонамеренным файлом → перезапишет его.
Если атакующий подменит, например, /etc/passwd
, это приведёт к эскалации привилегий.
Эксплуатация в реальных условиях
Пример вредоносного NAR:
# Создание структуры:
mkdir evil && cd evil
echo "malicious_data" > /etc/passwd~nix~case~hack~1
tar cf ../evil.nar .
# Распаковка с правами root:
nix-store --restore / < evil.nar
После распаковки файл /etc/passwd
будет заменён на злонамеренный.
Способы защиты
-
Обновите Nix до версии 2.24.6 или выше:
nix-env --upgrade nix
-
Ограничьте права Nix-демона:
-
Запускайте демон от непривилегированного пользователя.
-
Используйте Linux namespaces для изоляции.
-
-
Проверяйте источники NAR-архивов:
-
Используйте только доверенные бинарные кэши (например,
cache.nixos.org
). -
Включите подпись NAR:
allowed-uris = https://example.com/cache require-sigs = true
-
-
Мониторинг файловой системы:
-
Настройте аудит изменений критических файлов (например, через
auditd
). -
Используйте инструменты вроде Tripwire или AIDE.
-
Детали исправления
Ключевые изменения в коде:
-
Проверка коллизий после применения суффикса (
src/libutil/archive.cc
). -
Корректная обработка путей в
RestoreSink::createDirectory
(теперь выбрасывается ошибка при существующем пути). -
Новые тесты в
tests/functional/nars.sh
для проверки коллизий и восстановления.
Рекомендации для разработчиков
-
Избегайте использования
use-case-hack
на case-sensitive ФС (отключите опцию вnix.conf
). -
Регулярно обновляйте зависимости и проводите аудит кода на уязвимости.
