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
'android' 카테고리의 다른 글
logcat option 활용 (0) | 2022.10.25 |
---|---|
dumpsys package 참조 (0) | 2022.09.11 |
sendevent로 Linux keyevent 전송 방법 (0) | 2022.04.01 |
RecyclerView (0) | 2022.03.07 |
Fragment간 데이터 주고 받기 (0) | 2022.03.07 |