
CVE-2022-23093 FreeBSD 스택 기반 오버플로
⚠️ 기본적으로 사용되는 셸코드는 FreeBSD/x86-64 - execve - 28 bytes from Gitsnik입니다. 이를 변경하고 시작할 때 자신의 셸코드를 넣으세요. ⚠️
ping 유틸리티는 호스트 또는 게이트웨이로부터 ICMP ECHO_RESPONSE를 요청하는 데 사용되며, ICMP 프로토콜의 필수 ECHO_REQUEST 데이터그램을 통해 IPv4 대상(IPv4-host 또는 IPv4-mcast-group)으로 호출됩니다. ECHO_REQUEST 데이터그램은 IP 및 ICMP 헤더, 그 뒤를 잇는 "struct timeval"과 패킷을 채우기 위한 가변적인 수의 "pad" 바이트로 구성됩니다.
FreeBSD 프로젝트의 보안 권고에 따르면, ping 유틸리티는 네트워크에서 원시 IP 패킷을 수신하여 pr_pack() 함수 내에서 응답을 처리합니다. 응답 처리 과정에서 ping은 IP 헤더, ICMP 헤더, 그리고 존재하는 경우 ICMP 오류를 유발한 패킷을 나타내는 "quoted packet"을 재구성합니다. quoted packet에는 IP 헤더와 ICMP 헤더도 포함됩니다.
pr_pack() 함수는 수신된 IP 및 ICMP 헤더를 추가 처리를 위해 스택 버퍼로 복사합니다. 그러나 응답 또는 quoted packet에서 IP 헤더 뒤에 오는 IP 옵션 헤더의 가능성을 고려하지 못합니다. IP 옵션이 존재하는 경우, pr_pack()은 대상 버퍼를 최대 40바이트까지 오버플로시킵니다.
ping 유틸리티는 사용자 공간에서 실행되며, ping 명령을 호출하면 /sbin/ping에 위치한 바이너리가 실행됩니다. 이 유틸리티의 소스 코드는 FreeBSD 소스에서 공개적으로 확인할 수 있습니다. 취약한 함수인 pr_pack()은 "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."와 같은 문자열 형식으로 ICMP 패킷 응답 정보를 stdout에 출력합니다.
✔️ 요청과 응답 모두에서 ICMP 패킷은 위 다이어그램에 표시된 것처럼 선택적 Options 필드가 있는 IP 헤더로 구성됩니다. 악의적인 공격에서는 이러한 IP Options가 활성화되고 0이 아닌 바이트로 채워집니다. ✔️
ICMP 패킷이 대상 호스트로 가는 도중에 잘못되었거나 의도적으로 변조되었고 원래 echo request에서 IP Options가 활성화된 경우, pr_pack() 함수는 IP Options의 존재를 수용할 충분한 스택 공간을 할당하지 못하여 스택 오버플로가 발생합니다.
🤝 이러한 오류 상황에서 대상 호스트의 응답에는 ICMP 오류를 유발한 특정 패킷을 식별하는 "quoted packet"이 데이터 섹션에 포함될 수도 있습니다. pr_pack() 함수는 quoted packet에 ICMP 헤더가 포함되어 있을 때 스택을 오버플로시킵니다. 🤝