Лінус Торвальдс розкритикував регістронезалежні файлові системи
Творець Linux Лінус Торвальдс нещодавно висловив різку критику на адресу розробників файлової системи Bcachefs після їхнього повідомлення про виправлення помилки, пов’язаної з режимом без врахування регістру в іменах каталогів. На його думку, проблема не є новою, і розробники, схоже, не зробили висновків із попередніх помилок.
Суть проблеми
Суть питання полягає в особливостях стандарту Unicode, який є дуже гнучким і водночас складним. Його система так званого «case folding» — тобто приведення символів до єдиного регістру — має безліч винятків і крайніх випадків, які майже неможливо врахувати в повному обсязі. У результаті поведінка програми може не збігатися з тим, як аналогічні символи обробляє конкретна файлова система. Наприклад, деякі символи можуть виглядати однаково для користувача, але мати різне технічне подання на рівні байтів, і навпаки.
Торвальдс вважає, що спроби зробити регістронезалежну обробку «правильною» лише ускладнюють ситуацію: розробники змушені надавати особливе значення окремим байтам або послідовностям символів, що, у свою чергу, породжує нові класи помилок і потенційних вразливостей. Це, зокрема, може вплинути на безпеку — коли програми очікують одне ім’я файлу, а система трактує його інакше.
На завершення Торвальдс нагадав, що часи файлової системи FAT, у якій регістронезалежність була нормою, давно позаду. Він наголосив: сучасні файлові системи повинні рухатися вперед, а не відтворювати архаїчні підходи, які в нинішніх умовах можуть більше зашкодити, ніж допомогти.
Нижче можете ознайомитися з листом Торвальдса в розсилці розробників Linux 👇
Єдиний висновок тут — розробники файлових систем нічому не вчаться.
Імена без врахування регістру — це катастрофічна помилка, яку взагалі не слід було допускати. Проблема не в недостатньому тестуванні — проблема в тому, що ви взагалі вирішили це реалізувати.
А далі ситуація ще більше погіршується, коли люди намагаються «зробити правильно» те, що в принципі неможливо зробити правильно. У результаті виходить ще гірше: довільні байти починають використовуватись як «магічні» значення.
І, до речі, тести також повністю зламані. Востаннє, коли я їх переглядав, вони не охоплювали справді цікаві випадки — ті, що можуть призвести до уразливостей у користувацькому просторі.
Наприклад, такі уразливості: додаток у user-space перевіряє, що ім’я файлу не збігається з якимось безпечним шаблоном. А файловій системі з «регістронезалежністю» все одно вдається обійти цю перевірку — бо люди, які реалізують регістронезалежність, ЗАВЖДИ роблять речі на кшталт ігнорування непечатних символів тощо. У підсумку «регістронезалежність» перетворюється на «незалежність від чортзна-чого».
Приклади дивіться в комітах:
5c26d2f1d3f5 («unicode: Don’t special case ignorable code points»)
та
231825b2e1ff («Revert ’unicode: Don’t special case ignorable code points’»)
— і плачте.
Підказка: ❤ і ❤️ — це два різні Unicode-символи, що відрізняються лише за «ігнорованими» кодовими точками. І вгадайте що? Божевільні бездарні розробники, які хочуть, щоб ці два символи вважались однаковими — випадково роблять так, що інші (можливо, критично важливі з погляду безпеки) імена файлів також починають вважатися однаковими — просто через наявність цих ігнорованих символів.
У результаті кожен застосунок, який фільтрує шляхи, щоб не працювати з певними директоріями — може бути обманутий і змушений працювати з файлами, яких мав би уникати. І ні, це не якась рідкісна аномалія, а звичайна практика: багато програм покладаються на такі перевірки.
Чорт забирай. Регістронезалежність — це БАГ. Той факт, що розробники файлових систем досі вважають це фічею, для мене незрозумілий. Таке враження, що вони настільки обожнюють древню файлову систему FAT, що не можуть не спробувати її відтворити — тільки ще гірше.
Що думаєте з цього приводу? Регістронезалежні ФС і справді не мають права на життя чи все таки шанс в них є?
47 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів