Google отключил поддержку io_uring в ChromeOS и Android из-за плачевного состояния безопасности

Компания Google объявила об отключении по умолчанию интерфейса асинхронного ввода/вывода io_uring в ChromeOS, Android и на рабочих серверах. Дополнительно рассматривается возможность отключения io_uring по умолчанию в GKE AutoPilot (Google Kubernetes Engine). В качестве причины отключения называется плачевная ситуация с безопасностью в io_uring, которая перевешивает достоинства применения io_uring для повышения производительности.

Анализ результатов действующей с 2020 года программы по выплате денежных вознаграждений за выявление уязвимостей в ядре Linux (kCTF Vulnerability Rewards Program) показал, что в 60% полученных в рамки программы заявок, эксплуатируются уязвимости в io_uring и ситуация не меняется со временем. Всего за связанные с io_uring эксплоиты было выплачено вознаграждений на сумму около миллиона долларов, при том, что за всё время существования инициативы общая сумма вознаграждений, выплаченных за уязвимости в ядре Linux, составила 1.8 млн долларов за 42 предоставленных эксплоита для ещё не исправленных уязвимостей (максимальный размер вознаграждения – 133 тысячи долларов).


В прошлом году для усиления безопасности ядра Linux, используемом в эталонном окружении, в котором должен работать претендующий на получение премии эксплоит, Google применил дополнительные настройки и патчи для блокирования типовых методов работы эксплоитов. Например, была добавлена защита от повреждения структуры Freelist, запрещена запись за пределы буфера в slab и реализовано блокирование атак, связанных с совместным использованием кэша. Но данные изменения не повлияли на возможность эксплуатации уязвимостей в io_uring, что подтолкнуло Google к прекращению поддержки io_uring в своих продуктах.

В ChromeOS поддержка io_uring отключена при сборке ядра (CONIFG_IO_URING в kernelconfig). В Android для блокирования доступа к io_uring временно задействован фильтр на основе seccomp-bpf, а в будущих выпусках планируется при помощи SELinux выборочно предоставить доступ к io_uring только проведенным системным компонентам.

Интерфейс io_uring, предоставляемый ядром Linux начиная с выпуска 5.1, примечателен поддержкой полинга (polling) ввода/вывода и возможностью работы как с буферизацией, так и без буферизации. В API io_uring разработчики ядра попытались устранить недостатки старого интерфейса aio. По производительности io_uring очень близок к SPDK и существенно опережает libaio при работе с включённым полингом. Например, применение io_uring в библиотеке libuv позволило добиться повышения пропускной способности в 8 раз, а включение асинхронной буферизированной записи на базе io_uring в файловой системе XFS привело к снижению задержек в 80 раз и повышению скорости передачи данных в 2.7 раза.

Release. Ссылка here.