
polkit의 race condition을 통한 권한 상승
polkit의 race condition을 통한 권한 상승.
CVE-2021-3560은 polkit의 race condition으로, 인증되지 않은 로컬 사용자가 root 권한을 얻을 수 있게 합니다. 이 취약점은 polkit이 연결이 끊어졌을 때 D-Bus 오류를 처리하는 방식에 존재합니다.
최적의 타이밍을 결정하려면 다음 명령을 실행하세요:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
코드에서는 real 시간의 절반 ± 0.003 범위를 사용합니다.
타이밍이 왜 중요한가요?
프로세스를 너무 일찍 죽이면 — 요청이 전송되기 전입니다
너무 늦게 죽이면 — polkit이 인증 확인을 마치고 거부합니다
polkit이 요청을 이미 받았지만 아직 인증을 확인하지 않은 "황금 창(golden window)"에 맞춰야 합니다
익스플로잇은 어떻게 동작하나요?
int32:1 매개변수(wheel 그룹에 추가)로 사용자 생성 D-Bus 요청이 전송됩니다
요청이 중간에 중단됩니다(race condition)
polkit이 인증 확인을 완료하지 못합니다
D-Bus가 발신자를 찾을 수 없습니다
polkit이 오류를 잘못 처리하여 UID = 0 (root)을 할당합니다
사용자가 인증 없이 생성됩니다
새 사용자에 대한 비밀번호 설정 요청이 전송됩니다(동일한 타이밍으로)
성공 통계
사용자는 1-2회 시도로 생성될 수 있습니다
비밀번호 할당에는 더 많은 시도가 필요합니다
100회 반복은 높은 성공 확률을 제공합니다
익스플로잇이 작동하지 않으면 다음을 시도하세요:
코드에서 TIMING_RANGE 확장
스크립트를 여러 번 실행
SSH 세션(그래픽 세션이 아님)에 있는지 확인