
CVE-2021-3560 — accounts-daemon D-Bus 경쟁 조건을 통한 Polkit 권한 상승 익스플로잇
CVE-2021-3560은 Linux 데스크톱 환경에서 사용되는 권한 부여 프레임워크인 Polkit(이전 PolicyKit)의 로컬 권한 상승 취약점입니다. 로컬의 권한이 없는 공격자는 accounts-daemon D-Bus 인터페이스의 경쟁 조건을 악용하여 권한이 있는 사용자를 생성하고, 암호를 설정한 후 궁극적으로 root 액세스 권한을 얻을 수 있습니다.
accounts-daemon (org.freedesktop.Accounts)은 사용자 계정(생성, 삭제, 암호 변경 등)을 관리하는 시스템 D-Bus 서비스입니다. 다음 메서드를 제공합니다:
| 메서드 | 동작 |
|---|---|
CreateUser | 새 시스템 사용자 생성 |
SetPassword | 사용자 암호 설정 |
DeleteUser | 사용자 삭제 |
이러한 작업에는 인증이 필요합니다. D-Bus 호출이 도착하면 Polkit이 호출자와 accounts-daemon 사이에 위치합니다:
호출자 → D-Bus → Polkit (인증 확인) → accounts-daemon (작업 실행)
Polkit은 호출자에게 권한이 있는지 결정하고, 권한이 있으면 요청을 accounts-daemon으로 전달하여 실행합니다.
이 취약점은 TOCTOU (Time Of Check, Time Of Use) 경쟁 조건입니다. 핵심은 다음과 같습니다:
accounts-daemon으로 전송됩니다 (예: CreateUser).accounts-daemon이 처리를 완료하기 전에 정확히 적절한 시점에 D-Bus 호출이 종료되면, 적절한 인증 없이 사용자 생성이 진행되지만 사용자 레코드는 불완전한 상태로 끝납니다 (예: 암호 없음, 홈 디렉터리 없음).SetPassword를 호출하거나, 불완전한 상태 자체가 상승된 권한을 부여합니다.요약: 올바른 시점에 요청을 종료하면 인증을 우회할 수 있습니다.
이 exploit.sh 스크립트는 전체 공격 체인을 자동화합니다:
# 저장소 클론
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# 익스플로잇 실행 가능하도록 설정
chmod +x exploit.sh
# 실행
./exploit.sh
익스플로잇이 완료되면 root 셸을 얻을 수 있습니다:
whoami
# root

| 구성 요소 | 영향 받는 버전 |
|---|---|
| polkit | ≤ 0.119 (패치되지 않음) |
| accounts-daemon (accountsservice) | 영향 받는 polkit을 사용하는 모든 버전 |
이 취약점은 polkit 0.120 이상에서 패치되었습니다.
패치된 배포판 (일부):
이 저장소는 교육 및 승인된 보안 연구 용도로만 제공됩니다. 소유하지 않거나 명시적 테스트 허가를 받지 않은 시스템에서 이 익스플로잇을 사용하지 마십시오. 저자는 오용에 대한 책임을 지지 않습니다.
| 단계 | 동작 |
|---|
| 1. 시간 보정 | 더미 CreateUser("nobody") 호출을 사용하여 D-Bus 왕복 시간을 측정하고 "종료 창"을 계산합니다 |
| 2. 사용자 생성 | 선택한 사용자 이름으로 CreateUser 호출을 전송하고, 백그라운드에서 시작한 후 계산된 창만큼 대기한 다음 종료합니다 — 경쟁 조건을 악용하여 승인되지 않은 사용자를 생성합니다 |
| 3. 암호 설정 | 사용자가 (불완전한 상태로) 존재하면 동일한 경쟁 조건 기법으로 SetPassword 호출을 전송하여 알려진 암호를 할당합니다 |
| 4. 권한 상승 | su를 사용하여 새 사용자로 전환하고, sudo를 실행한 후 (우회된 인증 경로를 통해 생성된 사용자이므로 작동함) /bin/bash를 SUID root로 /var/tmp/bash에 복사한 후 root 셸을 실행합니다 |