Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Dirty-Pipe-Exploits — CVE-2022-0847(Dirty Pipe) 취약점 악용. | Kitploit
도구/GitHubGitHub/gustavo-nogueira/dirty-pipe-exploits
Privilege EscalationVulnerability AnalysisExploitationLearning & EducationBinary ExploitationLabs & Practice
GitHubgustavo-nogueira/dirty-pipe-exploits

Dirty-Pipe-Exploits

CVE-2022-0847(Dirty Pipe) 취약점 악용.

저장소 보기
2123년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

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를 주입함으로써, 특별히 준비된 파이프에 새 데이터를 쓰기만 하면 페이지 캐시의 데이터를 덮어쓰는 것이 가능해졌습니다(이 과정은 다음 단락에서 설명됩니다). 따라서 권한이 없는 로컬 사용자는 이 결함을 사용하여 읽기 전용 파일이 지원하는 페이지 캐시의 페이지를 덮어쓰거나 기록하고 시스템에서 권한을 상승시킬 수 있습니다.

이를 위해 취약점을 익스플로잇하려면 다음 단계를 따라야 합니다:

  1. 파이프를 생성합니다.
  2. 파이프를 임의의 데이터로 채웁니다(원형 배열의 모든 항목에 PIPE_BUF_FLAG_CAN_MERGE 플래그를 설정하기 위해).
  3. 파이프를 비웁니다(원형 배열의 모든 struct pipe_buffer 인스턴스에 PIPE_BUF_FLAG_CAN_MERGE 플래그가 설정된 상태로 남김). 일반적으로 플래그는 재설정되어야 합니다. 그러나 Dirty Pipe 취약점으로 인해 플래그가 1로 설정된 상태로 유지됩니다.
  4. splice 시스템 호출을 사용하여 읽기 전용 파일을 파이프로 전송합니다.
  5. 읽기 전용 파일을 수정합니다. splice 시스템 호출이 참조에 의한 전달(pass-by-reference) 방식을 사용하기 때문에, 공격자는 PIPE_BUF_FLAG_CAN_MERGE 플래그로 인해 파일을 덮어쓸 수 있습니다.

익스플로잇

다음 명령어로 모두 컴파일합니다:

root@kitploit:~
make

익스플로잇 1 - 읽기 전용 파일 덮어쓰기

실행

root@kitploit:~
./exploit-1

설명

리포지토리의 exploit-1.c 파일에 있는 익스플로잇 1은 /etc/passwd 파일(이 파일은 암호화된 비밀번호와 같은 사용자 계정 정보를 포함)에 있는 root 사용자의 비밀번호를 덮어쓰고 최종적으로 root 액세스 권한이 있는 터미널을 제공합니다. 이를 위해 다음이 필요했습니다:

  1. /etc/passwd 파일의 백업을 수행합니다.
  2. PIPE_BUF_FLAG_CAN_MERGE 플래그를 사용하여 파이프를 준비합니다(위에서 언급한 1, 2, 3단계에 따라).
  3. /etc/passwd 파일을 파이프로 전송하고 이 파일의 내용을 알려진 새로운 root 비밀번호로 덮어씁니다(위에서 언급한 4, 5단계에 따라).
  4. 설정된 새 비밀번호로 root 세션을 생성합니다.
  5. 그런 다음 백업에서 비밀번호를 원래 값으로 재설정하여 흔적을 남기지 않습니다.
  6. 마지막으로, root 세션이 설정된 상태에서 root 액세스 권한이 있는 셸 터미널이 열립니다.

익스플로잇 2 - SUID 바이너리 하이재킹

SUID 바이너리 찾기

root@kitploit:~
find / -perm -4000 2>/dev/null

실행

root@kitploit:~
./exploit-2 <path-of-suid-binary>

설명

리포지토리의 exploit-2.c 파일에 있는 익스플로잇 2는 SUID 바이너리를 덮어쓰고 하이재킹하는 것으로 구성되며(이러한 유형의 공격은 섹션 3.5.2에서 보고됨), 최종적으로 root 액세스 권한이 있는 터미널을 제공합니다. 이를 위해 다음이 필요했습니다:

  1. 매개변수로 받은 SUID 바이너리를 덮어쓰는 데 사용할 ELF 실행 파일 코드를 준비합니다. 익스플로잇에서 사용되는 ELF 실행 파일은 새로운 실행 파일(/tmp/sh)을 생성하며, 이 파일은 root 액세스 권한이 있는 셸 터미널을 생성합니다.
  2. SUID 바이너리의 경로를 매개변수로 받습니다.
  3. 받은 바이너리의 백업을 수행합니다.
  4. PIPE_BUF_FLAG_CAN_MERGE 플래그를 사용하여 파이프를 준비합니다(위에서 언급한 1, 2, 3단계에 따라).
  5. 받은 바이너리 파일을 파이프로 전송하고 이 파일의 내용을 1단계에서 언급한 ELF 실행 파일로 덮어씁니다(위에서 언급한 4, 5단계에 따라).
  6. 그런 다음 받은 바이너리는 백업에서 원래 내용으로 복원되어 흔적을 남기지 않습니다.
  7. 마지막으로 1단계에서 언급한 실행 파일 /tmp/sh가 실행되어 root 액세스 권한이 있는 새 셸을 엽니다.

익스플로잇 3 - 원격 액세스를 위한 키 추가

실행

root@kitploit:~
./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일.

도구 다운로드