habrahabr

Линус Торвальдс жёстко разнёс регистронезависимые ФС

  • воскресенье, 27 апреля 2025 г. в 00:00:11
https://habr.com/ru/articles/904564/

Линус Торвальдс сегодня в привычной для себя прямой и резкой манере высказался о файловых системах с поддержкой case folding (регистронезависимых файлов и папок).

Поводом послужила проблема с поддержкой case folding в Bcachefs, обнаруженная на этой неделе и уже имеющая фикс для Linux 6.15. Линус написал огромное сообщение в рассылке разработчиков Linux (LKML), изложив своё мнение о реализации case folding.

Стоит отметить, что проблема с case folding в Bcachefs — не первая для Linux: ранее уже возникали баги, связанные с обработкой эмодзи и других специальных символов Unicode.

"Единственный вывод здесь — разработчики файловых систем ничему не учатся.

Имена без учёта регистра — это катастрофическая ошибка, которую вообще не стоило допускать. Проблема не в недостаточном тестировании — проблема в том, что вы вообще решили это реализовать.

Затем ситуация ещё усугубляется, когда люди пытаются "сделать правильно" то, что в принципе правильно сделать невозможно. В итоге получается ещё хуже: произвольные байты начинают использоваться как "магическое" значение.

И кстати, тесты тоже полностью сломаны. Последний раз, когда я их смотрел, они не покрывали действительно интересные случаи — те, что могут приводить к уязвимостям в user-space.

Например, такие уязвимости: приложение в user-space проверяет, что имя файла не совпадает с каким-то безопасным паттерном. А файловая система с "регистронезависимостью" всё равно позволяет обойти эту проверку - потому что люди, реализующие регистронезависимость, ВСЕГДА делают вещи типа игнора непечатаемых символов и тд. В итоге "регистронезависимость" превращается в "независимость от черт знает чего".

Примеры смотрите в коммитах:

5c26d2f1d3f5 ("unicode: Don't special case ignorable code points")

и

231825b2e1ff ("Revert "unicode: Don't special case ignorable code points"")

— и плачьте.

Подсказка: ❤ и ❤️ — это два разных Unicode-символа, различающихся только по "игнорируемым" кодовым точкам. И угадайте что? Безумные бездарные разработчики, желающие чтобы эти два символа считались одинаковыми — случайно делают так, что другие(возможно относящиеся к безопасности) имена файлов начинают считаться одинаковыми — просто потому что содержат эти игнорируемые символы.

В результате каждое приложение, которое фильтрует пути, чтобы не трогать определенные директории — может быть обмануто и заставлено работать с файлами, которых оно должно было избегать. И нет, такое поведение не редкость и не что-то странное, а стандартная практика: множество программ полагаются на такие проверки.

Чёрт возьми. Регистронезависимость — это БАГ. Тот факт, что разработчики файловых систем до сих пор считают это фичей, для меня необъясним. Такое ощущение, что они настолько обожают древнюю файловую систему FAT, что не могут не попытаться её воссоздать — только ещё хуже."