android

Android 12 : cfi check fail 회피 방법

easy16 2022. 6. 30. 15:16

Android 12 Wifi driver에서 발생한 cfi_check fail 대한 회피 방법

 

결론부터 살펴보면 아래와 같이 cfi crash 발생하는 모듈의 Android.mk 또는 bp

LOCAL_SANITIZE LOCAL_SANITIZE_BLOCKLIST 등록하시면 됩니다.

(bp 경우, 별도의 방법 참조  : https://source.android.com/devices/tech/debug/cfi )

 

//wpa_blacklist.txt

fun:*driver_cmd*

 

 include $(CLEAR_VARS)
 LOCAL_MODULE := wpa_supplicant
+LOCAL_SANITIZE := cfi
+LOCAL_SANITIZE_BLOCKLIST := wpa_blacklist.txt


 include $(CLEAR_VARS)
+LOCAL_SANITIZE := cfi
+LOCAL_SANITIZE_BLOCKLIST := wpa_blacklist.txt
 LOCAL_MODULE := libwpa_hidl

 

실제로 wpa_supplicant libwpa_hidl 사이에서 따로 빌드된 Realtek static library 특정 함수를 호출(indirect call)하면서 발생하는 것으로 추측됩니다.

로그상의 crash로그를 보면 driver_cmd symbol 나타내고 있습니다.

 

따라서 해당 오류를 회피하기 위해 wpa_blacklist driver_cmd 함수에 대한 예외를 등록하면 컴파일 타임에 참조하게 되어 cfi_check 무사히 넘어갈 있습니다.

 

참조:

#Cfi 관련 포스트 1 (취약점에서 어떻게 cfi 동작하는지 + 컴파일 옵션)

https://www.redhat.com/en/blog/fighting-exploits-control-flow-integrity-cfi-clang

#Cfi 관련 포스트 2 (cfi컴파일 옵션에 대한 설명)

https://clang.llvm.org/docs/ControlFlowIntegrity.html#ignorelist