
CVE-2023-6931 커널 패닉 PoC
CVE-2023-6931용 커널 패닉 PoC
CVE-2023-6931은 perf_event의 취약점으로, 그룹의 read_size에서 정수 오버플로로 인해 힙 버퍼 오버플로가 발생합니다.
perf_events는 Linux 커널이 제공하는 성능 모니터링 및 분석 프레임워크입니다. 이 프레임워크는 하드웨어와 소프트웨어 구성 요소에서 생성되는 다양한 성능 관련 데이터를 추적할 수 있게 해줍니다.
perf_event_open 시스템 콜
사용자 공간에서 커널의 성능 이벤트를 구성하고 제어할 수 있는 인터페이스입니다.
이벤트 생성, 그룹화, 제어 또는 데이터 읽기에 사용됩니다./proc/sys/kernel/perf_event_paranoid 값이 1 이하여야 합니다.ulimit -n 명령어로 확인하거나 수정할 수 있습니다.CONFIG_PERF_EVENTS가 설정되어 있어야 합니다.이 취약점은 그룹의 read_size에서 발생하는 정수 오버플로로 인해 발생합니다. perf_event_validate_size 함수는 read_size에 대한 검증을 수행합니다. 그러나 read_size가 검증되는 방식은 현재 이벤트의 read_size만 확인합니다.
핵심은 각 검증 중에 현재 이벤트만 검증되고 이전 이벤트는 검증되지 않는다는 점입니다. 그룹 리더에 PERF_FORMAT_GROUP이 설정되어 있으면 현재 이벤트를 추가하는 것만으로도 그룹 리더의 read_size가 증가할 수 있습니다.
이는 궁극적으로 perf_read_group에서 문제를 일으킵니다. event->read_size의 계산은 그룹 리더의 read_format을 기준으로 nr_siblings를 곱한 값입니다. read_size 변수는 2바이트 u16이므로 저장할 수 있는 최대값은 0xffff입니다.
이를 악용하기 위해 공격자는 먼저 가능한 모든 read_format 옵션이 설정된 그룹 리더 이벤트를 생성합니다. 그 다음 수많은 형제(sibling) 이벤트를 생성합니다. 이 형제 이벤트들은 perf_event_validate_size에서 검증 문제가 발생하지 않도록 read_Format에 PERF_FORMAT_TOTAL_TIME_RUNNING만 설정합니다. 그 결과 nr_siblings 값이 매우 커지지만 각 형제 이벤트가 개별적으로 검증을 통과하므로 이 단계에서는 문제가 없습니다.
이 상태에서 perf_read_group이 호출되면 PERF_FORMAT_GROUP이 설정되어 있으므로 그룹 리더의 read_size가 계속 증가합니다. 결국 정수 오버플로가 발생하고 kzalloc은 매우 작은 버퍼를 할당합니다. 그러나 실제 이벤트 수는 매우 많기 때문에 힙 버퍼 오버플로가 발생하여 커널 패닉이 발생합니다.