
20년 이상 된 도구를 사용하여 Linux 실행 공간 보호를 우회하기 (CVE-2022-25265).
이 POC는 바이너리의 실행 불가 영역으로 간주되는 곳에 위치한 바이트를 실행하여 실행 공간 보호를 완전히 우회하는 것을 시연합니다.
이에 대한 근본 원인은 여기에서 확인할 수 있습니다. https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/elf.h#L280
알고 보면, NX가 없는 시스템 또는 NX가 있는 IA32 시스템에서 빌드되었지만 PT_GNU_STACK 헤더를 포함하지 않는 바이너리 파일은 exec-all로 표시됩니다.
이로 인해 바이너리 내 모든 곳에서 완전한 RWX(읽기/쓰기/실행)가 허용됩니다.
이를 위해 우리는 "역사적인" 빌드 도구를 사용합니다.
이 경우에는 Linux 2.4.20을 사용하는 x86 Slackware9에서 실행되는 gcc 3.2.2입니다.
결과적으로 현대 Linux 시스템, 즉 Linux 5.16.1에서 실행할 수 있는 바이너리 파일을 얻게 됩니다.
동일한 효과는 특정 링커 인수/스크립트로도 달성할 수 있을 수도 있지만, 저는 이를 검증하지 않았습니다.
다음 코드는 dummy() 함수의 어셈블된 바이트를 문자 배열 harmless_str_buf로 복사한 다음 대상 배열을 함수로 실행합니다.
이 시연은 전적으로 교육 목적으로 제공됩니다. 어떠한 경우에도 이 코드의 작성자는 제공된 코드 및/또는 정보를 오용하여 발생한 직간접적 손해에 대해 책임을 질 수 없습니다.
자세한 내용은 LICENSE를 참조하십시오.