Новости Тихий убийца RAID-массивов: как флаг O_DIRECT превращает обычное приложение в разрушителя данных

NewsMaker

I'm just a script
Премиум
21,359
46
8 Ноя 2022
Даже пользователь без прав администратора способен вызвать необратимую рассинхронизацию дисков.


gg72l6j46d2hx3bt3awnvwumrb0ykfuh.jpg

В Linux обнаружена серьёзная уязвимость, существующая уже более десяти лет, и связана она с механизмом программного RAID при использовании флага O_DIRECT. Проблема позволяет привести массив в несогласованное состояние, причём без каких-либо ошибок или предупреждений со стороны системы. Несмотря на то, что баг впервые был зарегистрирован ещё в 2015 году, интерес к нему вновь возрос в контексте современных задач, таких как живая миграция виртуальных машин.

Суть проблемы заключается в том, как пользовательские программы взаимодействуют с блочными устройствами при помощи O_DIRECT. Этот флаг позволяет выполнять прямой доступ к данным, минуя кэш ядра, что полезно для повышения производительности в ряде задач. Однако в случае программного RAID, такого как MD RAID, DRBD или LVM RAID, это приводит к тому, что каждый диск массива может получить разные данные, даже если они записываются с одного и того же указателя в пользовательском пространстве. В результате данные на отдельных устройствах перестают быть синхронизированными — массив остаётся «рабочим» с точки зрения системы, но фактически оказывается повреждённым.

Причём проблема не в самих данных, а в нарушении согласованности между дисками. Даже если данные представляют собой «мусор», они должны быть одинаковыми на каждом RAID-устройстве. В текущем же случае каждый диск получает свою версию этих данных. Причина в том, что каждый из драйверов нижнего уровня получает доступ к одной и той же области пользовательской памяти независимо друг от друга, что приводит к расхождениям при чтении и записи.

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

С момента публикации первоначального отчёта в 2015 году обсуждение проблемы периодически всплывало в технических сообществах. В частности, недавно разработчики подняли вопрос, может ли эта ошибка повлиять на стабильность систем при переносе виртуальных машин в реальном времени, где согласованность данных критична.

Из всех файловых систем Linux, известны только две, не подверженные этому дефекту при использовании с программным RAID — это OpenZFS и Bcachefs. Остальные решения остаются потенциально уязвимыми. Проблема до сих пор числится как открытая и не имеет официального исправления. Подробности и технические детали инцидента можно найти на платформе BugZilla , где и был размещён оригинальный отчёт.
 
Источник новости
www.securitylab.ru

Похожие темы