피드로 돌아가기
Dev.toSecurity
원문 읽기
초기화 누락된 Flag 하나로 Page Cache 쓰기 권한을 획득한 Dirty Pipe 분석
How I Analyzed the Linux Kernel's Deadliest Logic Bug: A Deep Dive into Dirty Pipe (CVE-2022-0847)
AI 요약
Context
Linux 커널은 디스크 I/O 최적화를 위해 Page Cache를 운영하며, Copy-on-Write(CoW) 메커니즘을 통해 읽기 전용 파일의 무결성을 보장하는 구조임. splice() 시스템 콜을 통한 Zero-Copy 데이터 전송 최적화 과정에서 Page Cache와 Pipe Buffer가 직접 연결되는 아키텍처적 특성을 가짐.
Technical Solution
- splice() 호출 시 Page Cache 페이지를 Pipe Buffer에 직접 매핑하는 copy_page_to_iter_pipe() 함수 활용
- Circular Ring 구조의 Pipe Buffer 재사용 과정에서 기존에 설정된 PIPE_BUF_FLAG_CAN_MERGE 플래그가 초기화되지 않고 잔존하는 설계 결함 발생
- 잔존한 Merge 플래그로 인해 커널이 해당 Page Cache 페이지를 수정 가능한 버퍼로 오판하여 쓰기 허용
- CoW 메커니즘을 우회하여 읽기 전용 파일의 물리적 메모리 페이지에 직접 데이터를 덮어쓰는 로직 수행
- 서로 독립적으로 정상 작동하던 Page Cache, Pipe, splice() 세 하위 시스템의 상호작용 경계에서 상태 전이 오류 발생
실천 포인트
1. 구조체 재사용 로직 설계 시 모든 필드에 대한 명시적 초기화 수행 여부 검토
2. Zero-Copy 등 성능 최적화 구현 시 기존 보안 경계(Security Boundary) 무력화 가능성 분석
3. 하위 시스템 간 데이터 핸드오버 시 상태 플래그의 유효성 검증 프로세스 추가