
CVE-2022-0847(Dirty Pipe) 취약점 악용.
2022년 3월 7일 Max Kellerman[2]에 의해 공개된 CVE-2022-0847은 Linux 커널(버전 5.8 ~ 5.16.11)의 취약점으로, 공격자가 읽기 전용 또는 변경 불가능한 파일을 덮어쓰고 피해자 시스템에서 권한을 상승시킬 수 있게 합니다. CVE-2022-0847은 Dirty Pipe라고 불리며 CVSS 점수는 7.8(높음)입니다.
Dirty Pipe 취약점은 struct pipe_buffer[7]의 flags 속성이 Linux 커널의 copy_page_to_iter_pipe 및 push_pipe 함수에서 적절히 초기화되지 않아 오래된 값을 포함할 수 있는 결함으로 설명됩니다. struct pipe_buffer의 flags 속성에 설정될 수 있는 플래그 중 하나는 PIPE_BUF_FLAG_CAN_MERGE입니다. 이 플래그는 pipe_buffer에 추가 데이터 병합이 허용되는지 여부를 나타냅니다. 따라서 데이터가 pipe_buffer로 복사될 때, 복사된 페이지의 크기가 4096바이트 미만이면 pipe_buffer에 더 많은 데이터를 추가할 수 있습니다.
페이지 캐시 참조에 PIPE_BUF_FLAG_CAN_MERGE를 주입함으로써, 특별히 준비된 파이프에 새 데이터를 쓰기만 하면 페이지 캐시의 데이터를 덮어쓰는 것이 가능해졌습니다(이 과정은 다음 단락에서 설명됩니다). 따라서 권한이 없는 로컬 사용자는 이 결함을 사용하여 읽기 전용 파일이 지원하는 페이지 캐시의 페이지를 덮어쓰거나 기록하고 시스템에서 권한을 상승시킬 수 있습니다.
이를 위해 취약점을 익스플로잇하려면 다음 단계를 따라야 합니다:
다음 명령어로 모두 컴파일합니다:
make
./exploit-1
리포지토리의 exploit-1.c 파일에 있는 익스플로잇 1은 /etc/passwd 파일(이 파일은 암호화된 비밀번호와 같은 사용자 계정 정보를 포함)에 있는 root 사용자의 비밀번호를 덮어쓰고 최종적으로 root 액세스 권한이 있는 터미널을 제공합니다. 이를 위해 다음이 필요했습니다:
/etc/passwd 파일의 백업을 수행합니다./etc/passwd 파일을 파이프로 전송하고 이 파일의 내용을 알려진 새로운 root 비밀번호로 덮어씁니다(위에서 언급한 4, 5단계에 따라).find / -perm -4000 2>/dev/null
./exploit-2 <path-of-suid-binary>
리포지토리의 exploit-2.c 파일에 있는 익스플로잇 2는 SUID 바이너리를 덮어쓰고 하이재킹하는 것으로 구성되며(이러한 유형의 공격은 섹션 3.5.2에서 보고됨), 최종적으로 root 액세스 권한이 있는 터미널을 제공합니다. 이를 위해 다음이 필요했습니다:
/tmp/sh)을 생성하며, 이 파일은 root 액세스 권한이 있는 셸 터미널을 생성합니다./tmp/sh가 실행되어 root 액세스 권한이 있는 새 셸을 엽니다../exploit-3
리포지토리의 exploit-3.c 파일에 있는 익스플로잇 3은 root 셸 액세스를 얻기 위해 익스플로잇 1과 동일한 단계를 사용합니다. 차이점은 익스플로잇 3이 root 셸 액세스를 얻은 후 공격자의 SSH 공개 키를 /root/.ssh/authorized_keys 파일에 로드하고 Ngrok 플랫폼을 사용하여 SSH 원격 액세스를 위한 TCP 터널을 생성한다는 것입니다.
[1] AHMED, Alexis. 권한 상승 기술: Windows 및 Linux 시스템 익스플로잇 기술 배우기. Birmingham: Packt Publishing, 2021년 10월.
[2] KELLERMANN, Max. Dirty Pipe 취약점. 출처: https://dirtypipe.cm4all.com/. 접속일: 2022년 7월 23일.
[3] Exploit Database. 출처: https://www.exploit-db.com/. 접속일: 2022년 8월 3일.
[4] Traitor: root 셸을 얻기 위해 쉬운 공격을 자동으로 익스플로잇합니다. 출처: https://github.com/liamg/traitor. 접속일: 2022년 8월 3일.
[5] PayloadsAllTheThings. Linux - 권한 상승. 출처: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cve-2022-0847-dirtypipe. 접속일: 2022년 8월 3일.
[6] Linux 커널 저장소 - Struct pipe_inode_info. 출처: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L76. 접속일: 2022년 8월 3일.
[7] Linux 커널 저장소 - Struct pipe_buffer. 출처: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L26-L32. 접속일: 2022년 8월 3일.
[8] ARNTZ, Pieter. Linux "Dirty Pipe" 취약점으로 권한 없는 사용자에게 root 액세스 권한 부여. Malwarebytes Lab. 출처: https://www.malwarebytes.com/blog/news/2022/03/linux-dirty-pipe-vulnerability-gives-unprivileged-users-root-access. 접속일: 2022년 8월 3일.
[9] Picus Security. Linux "Dirty Pipe" CVE-2022-0847 취약점 익스플로잇 설명. 출처: https://www.picussecurity.com/resource/linux-dirty-pipe-cve-2022-0847-vulnerability-exploitation-explained. 접속일: 2022년 8월 3일.
[10] Exploit Database - 로컬 권한 상승 (Dirty Pipe). 출처: https://www.exploit-db.com/exploits/50808. 접속일: 2022년 8월 3일.