Компания Qualys выявила уявзвимость (CVE-2021-4034) в системном компоненте Polkit (бывший PolicyKit), используемом в дистрибутивах для организации выполнения непривилегированными пользователями действий, требующих повышенных прав доступа. Уязвимость позволяет непривилегированному локальному пользователю повысить свои привилегии до пользователя root и получить полный контроль над системой. Проблема получила кодовое имя PwnKit и примечательна подготовкой рабочего эксплоита, работающего в конфигурации по умолчанию в большинстве дистрибутивов Linux.
Muammo PolKit pkexec yordam dasturida mavjud bo'lib, u SUID ildiz bayrog'i bilan birga keladi va belgilangan PolKit qoidalariga muvofiq boshqa foydalanuvchining imtiyozlari bilan buyruqlarni bajarish uchun mo'ljallangan. Pkexec-ga uzatilgan buyruq qatori argumentlarining noto'g'ri ishlashi tufayli, imtiyozsiz foydalanuvchi autentifikatsiyani chetlab o'tishi va o'rnatilgan kirish qoidalaridan qat'i nazar, o'z kodini ildiz sifatida ishga tushirishi mumkin. Hujum uchun PolKit-da qanday sozlamalar va cheklovlar ko'rsatilganligi muhim emas, pkexec yordam dasturi bilan bajariladigan fayl uchun SUID ildiz atributini o'rnatish kifoya.
Pkexec не проверяет корректность счётчика аргументов командной строки (argc), передаваемых при запуске процесса. Разработчиками pkexec подразумевалось, что первая запись массива argv всегда содержит имя процесса (pkexec), а вторая либо значение NULL, либо имя запускаемой через pkexec команды. Так как счётчик аргументов не проверялся на соответствие фактическому содержимому массива и полагалось, что он всегда больше 1, в случае передачи процессу пустого массива argv, что допускает функция execve в Linux, pkexec воспринимал значение NULL как первый аргумент (имя процесса), а следующую за пределами буфера память, как далее идущее содержимое массива. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL
Muammo shundaki, argv massividan keyin xotirada muhit o'zgaruvchilari bo'lgan envp massivi mavjud. Shunday qilib, agar argv massivi bo'sh bo'lsa, pkexec kengaytirilgan imtiyozlar bilan ishga tushirilgan buyruq haqidagi ma'lumotlarni muhit o'zgaruvchilari bilan massivning birinchi elementidan chiqaradi (argv[1] envp[0] bilan bir xil bo'ldi), uning mazmuni boshqarilishi mumkin. hujumchi tomonidan.
argv[1] qiymatini olgandan so'ng, pkexec PATH-dagi fayl yo'llarini hisobga olgan holda bajariladigan faylga to'liq yo'lni aniqlashga harakat qiladi va argv[1] ga qaytish to'liq yo'li bilan satrga ko'rsatgich yozadi. argv[1] envp[0] bilan bir xil bo'lgani uchun birinchi muhit o'zgaruvchisi qiymatini qayta yozishga olib keladi. Birinchi muhit o'zgaruvchisining nomini manipulyatsiya qilish orqali tajovuzkor pkexec-da boshqa muhit o'zgaruvchisini almashtirishi mumkin, masalan, suid dasturlarda ruxsat etilmagan "LD_PRELOAD" muhit o'zgaruvchisini o'rniga qo'yishi va o'zlarining umumiy kutubxonasini kompyuterga yuklanishini tartibga solishlari mumkin. jarayon.
Ishchi ekspluatatsiya GCONV_PATH o'zgaruvchisini almashtirishni o'z ichiga oladi, bu o'zgaruvchining kodi iconv_open() dan foydalanadigan g_printerr() funksiyasiga qo'ng'iroq qilishda dinamik ravishda yuklangan belgilarni transkodlash kutubxonasiga yo'lni aniqlash uchun ishlatiladi. GCONV_PATH da yo‘lni qayta belgilash orqali buzg‘unchi yuklangan standart iconv kutubxonasi emas, balki pkexec bilan ishlayotgan bo‘lsa, xato xabari ko‘rsatilganda ishlovchilar bajariladigan o‘zining kutubxonasi ekanligini ta’minlashi mumkin. ildiz huquqlari va ishga tushirishdan oldin ruxsatlar tekshiriladi.
Отмечается, что несмотря на то, что проблема вызвана повреждением памяти, она может надёжно и повторяемо эксплуатироваться независимо от используемой аппаратной архитектуры. Подготовленный эксплоит успешно протестирован в Ubuntu, Debian, Fedora va CentOS, но может быть использован и в других дистрибутивах. Оригинальный эксплоит пока не доступен публично, что свидетельствует о том, что он является тривиальным и может быть легко воссоздан другими исследователями, поэтому на многопользовательских системах важно как можно скорее установить обновление с исправлением. Polkit также доступен для BSD-систем и Solaris, но изучение возможности эксплуатации в них не производилось. Известно только то, что атака не может быть осуществлена в OpenBSD, так как ядро OpenBSD не допускает передачу при вызове execve() нулевого значения argc.
Проблема присутствует с мая 2009 года, со времени добавления команды pkexec. Исправление уявзимости в PolKit пока доступно в виде патча (корректирующий выпуск не сформирован), но так как разработчики дистрибутивов были заранее уведомлены о проблеме, большинство дистрибутивов опубликовало обновление одновременно с раскрытием информации об уязвимости. Проблема устранена в RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux и Manjaro. В качестве временной меры для блокирования уязвимости можно убрать флаг SUID root с программы /usr/bin/pkexec («chmod 0755 /usr/bin/pkexec»).
Manba: opennet.ru
