Уязвимость BDU:2024-11662 в Nix
Уязвимость BDU:2024-11662 в Nix
Категория: Программы Теги: Уязвимости Опубликовано: 10 апреля 2025

Уязвимость 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-архив, содержащий:

  1. Файл A.txt.

  2. Файл 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 будет заменён на злонамеренный.


Способы защиты

  1. Обновите Nix до версии 2.24.6 или выше:

    nix-env --upgrade nix  
  2. Ограничьте права Nix-демона:

    • Запускайте демон от непривилегированного пользователя.

    • Используйте Linux namespaces для изоляции.

  3. Проверяйте источники NAR-архивов:

    • Используйте только доверенные бинарные кэши (например, cache.nixos.org).

    • Включите подпись NAR:

      allowed-uris = https://example.com/cache  
      require-sigs = true  
  4. Мониторинг файловой системы:

    • Настройте аудит изменений критических файлов (например, через auditd).

    • Используйте инструменты вроде Tripwire или AIDE.


Детали исправления

Ключевые изменения в коде:

  • Проверка коллизий после применения суффикса (src/libutil/archive.cc).

  • Корректная обработка путей в RestoreSink::createDirectory (теперь выбрасывается ошибка при существующем пути).

  • Новые тесты в tests/functional/nars.sh для проверки коллизий и восстановления.


Рекомендации для разработчиков

  • Избегайте использования use-case-hack на case-sensitive ФС (отключите опцию в nix.conf).

  • Регулярно обновляйте зависимости и проводите аудит кода на уязвимости.

Алексей Черемных Алексей Черемных
41