Эксперты компании Qualys обнаружили критическую уязвимость в утилите sudo. Злоумышленник может получить доступ с правами root, используя уязвимость CVE-2021-3156 под любым пользователем и без наличия записи в файле /etc/sudoers. Уязвимость можно применять для повышения привилегий в системе в непривилегированном процессе.
Специалисты Qualys проверили эксплойты с уязвимостью на дистрибутивах Ubuntu 20.04 (sudo 1.8.31), Debian 10 (sudo 1.8.27) и Fedora 33 (sudo 1.9.2). В этих дистрибутивах они получили полные привилегии в системе. Уязвимости подвержены и другие дистрибутивы Linux с утилитой sudo всех версий от 1.8.2 до 1.8.31p2 (legacy) и от 1.9.0 до 1.9.5p1 (stable). Уязвимость устранена разработчиками sudo в версии 1.9.5p2. Qualys прислала им всю необходимую информацию для устранения уязвимости 13 января этого года.
Эксперты Qualys пояснили, что уязвимость попала в исходный код утилиты sudo в июле 2011 года. Ее использование возможно, если определенным образом вызвать переполнение буфера при обработке символов экранирования строки в параметрах, предназначенных для запуска команд в режиме shell при использовании sudoedit и указании аргументов "-i" или "-s". В этом случае экранирования параметров не происходит и появляется возможность работать далее с переполнением буфера и использовать ошибки в обработчике утилиты. Специалисты Qualys с помощью трех эксплойтов смогли активировать уязвимость и получить права root в системе, манипулируя значениями аргументов и при вызове sudoedit.
Пример использования уязвимости. Qualys не опубликовала исходный код эксплойтов для ее активации.
Для проверки наличия уязвимости в системе нужно под обычным пользователем запустить команду
sudoedit -s /
. Если в ответ будет выдана ошибка с текстом в начале «sudoedit:», то уязвимость есть. Исправленные версии sudo выдают в этом случае текст с ошибкой, начинающейся с «usage:».
v1000
Интересные комментарии к коду, который поменяли в 2011 году. То, что старый код был лучше читаем менять его с точки зрения производительности особого смысла не было. И что выглядит как конспирологический способ добавить бэкдор.
avdx
По моему автор этого комментария просто не понял смысл правок. В том месте (parse_args.c ), которое, как я понял, он назвал «оптимизацией», на мой взгляд цель в другом — сделать так, чтобы аргументы остались лежать в памяти подряд, как они и лежали до этого.
Но баг то как раз не в этом месте, а в правке в первом файле (sudoers.c).