Компания Qualys выявила уявзвимость (CVE-2021-4034) в системном компоненте Polkit (бывший PolicyKit), используемом в дистрибутивах для организации выполнения непривилегированными пользователями действий, требующих повышенных прав доступа. Уязвимость позволяет непривилегированному локальному пользователю повысить свои привилегии до пользователя root и получить полный контроль над системой. Проблема получила кодовое имя PwnKit и примечательна подготовкой рабочего эксплоита, работающего в конфигурации по умолчанию в большинстве дистрибутивов Linux.
Nsogbu a dị na PolKit's pkexec utility, nke na-abịa na ọkọlọtọ SUID mgbọrọgwụ ma emebere ya iji mee iwu site na ikike nke onye ọrụ ọzọ dịka iwu PolKit akọwapụtara. N'ihi njikwa na-ezighi ezi nke arụmụka ahịrị iwu gafere na pkexec, onye ọrụ na-enweghị ohere nwere ike gafere nyocha wee mee ka koodu ha na-agba ọsọ dị ka mgbọrọgwụ, n'agbanyeghị agbanyeghị iwu nnabata etinyere. Maka mbuso agha, ọ baghị uru ihe ntọala na mmachi akọwapụtara na PolKit, o zuru ezu na edobere njirimara mgbọrọgwụ SUID maka faịlụ enwere ike iji ngwa pkexec.
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
Nsogbu bụ na mgbe argv array nwere usoro envp na ebe nchekwa nwere mgbanwe gburugburu ebe obibi. Ya mere, ọ bụrụ na argv array bụ ihe efu, pkexec na-ewepụta data gbasara iwu ahụ na-eji ihe ùgwù dị elu sitere na ihe mbụ nke nhazi ahụ na mgbanwe gburugburu ebe obibi (argv[1] ghọrọ otu na envp [0]), ọdịnaya nke nwere ike ịchịkwa ya. site n'aka onye agha.
N'ịbụ onye natara uru nke argv[1], pkexec na-agba mbọ, na-eburu n'uche ụzọ faịlụ dị na PATH, iji chọpụta ụzọ zuru ezu na faịlụ a na-arụ ọrụ ma dee ihe nrịbama na eriri na ụzọ zuru ezu azụ na argv[1], nke na-eduga na idegharị uru nke mgbanwe gburugburu ebe obibi mbụ, ebe ọ bụ na argv[1] yiri envp[0]. Site n'ịgbanwe aha nke mgbanwe gburugburu ebe obibi mbụ, onye na-awakpo nwere ike dochie mgbanwe gburugburu ebe ọzọ na pkexec, dịka ọmụmaatụ, dochie "LD_PRELOAD" mgbanwe gburugburu ebe obibi, nke anaghị anabata na mmemme suid, ma hazie ka ebuba n'ọbá akwụkwọ ha na-ekekọrịta n'ime ụlọ ọrụ ahụ. usoro.
Nrigbu a na-arụ ọrụ gụnyere dochie mgbanwe GCONV_PATH, nke a na-eji achọpụta ụzọ gaa n'ọbá akwụkwọ transcoding akara, na-arụ ọrụ nke ọma mgbe ị na-akpọ ọrụ g_printerr (), koodu nke na-eji iconv_open(). Site n'ịkọwagharị ụzọ na GCONV_PATH, onye na-awakpo nwere ike hụ na ọ bụghị akwụkwọ ndekọ aha iconv ka a na-ebu, kama ọ bụ ọbá akwụkwọ nke ya, ndị na-ahụ maka ya ga-esi na ya gbuo mgbe egosipụtara njehie na ọkwa mgbe pkexec ka na-arụ ọrụ. ikike mgbọrọgwụ na tupu enyocha ikike mmalite.
Отмечается, что несмотря на то, что проблема вызвана повреждением памяти, она может надёжно и повторяемо эксплуатироваться независимо от используемой аппаратной архитектуры. Подготовленный эксплоит успешно протестирован в Ubuntu, Debian, Fedora na 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»).
isi: opennet.ru
