- 많은 앱이 AI 모델을 기기에 직접 통합하고 있음. 이는 빠른 추론과 오프라인 접근이 중요한 경우에 유리함
- 하지만 기기 내부에 모델 파일이 존재한다는 것은 사용자가 해당 파일을 추출하고 분석할 수도 있음을 의미함
목표
- Microsoft의 Seeing AI 앱은 시각 장애인을 위한 "말하는 카메라"로, 물체, 문서, 화폐 등을 인식하여 음성으로 설명해 줌
- 특히 화폐(currency) 인식 기능은 17개 이상의 통화를 지원하며, 225개의 고유한 지폐를 인식함
- 앱 배포 형식인 APK 파일 안에 모델이 포함되어 있지만, 암호화된 상태의 파일(
currency
)로 존재함
- 파일이 단순 암호화되어 있으면, 앱 실행 중 메모리나 복호화 과정을 추적해 파일을 추출할 수 있음
초기 조사
- Android 앱은 APK 파일로 배포되며, 이는 앱 실행에 필요한 모든 것을 포함하는 아카이브임.
- AI 모델은 일반적으로 이러한 자산과 함께 저장됨
-
apktool
을 사용하여 APK를 디컴파일하고 구조를 분석할 수 있음
-
assets
폴더에서 currency
라는 파일을 발견했으나, 암호화되어 있음
더 나아가기
- 앱이
currency
파일을 어떻게 복호화하는지 역공학할 수 있음
- TensorFlow Lite가
com.microsoft.seeingai
에서 사용됨을 확인함
-
org.tensorflow.lite.NativeInterpreterWrapper
를 사용하여 *.tflite
모델을 로드할 수 있음
Frida 사용하기
- Frida는 거의 모든 운영체제에서 실행 가능한 동적 계측 도구로, 실행 중인 프로세스에 연결하여 동작을 변경할 수 있음
- 프로세스 실행 중에 붙어 메서드 호출을 추적하고, 인자와 반환값을 확인하거나, 메서드 내용을 원하는 로직으로 덮어쓸 수 있음
- 예:
checkKey(key)
를 무조건 true
로 반환하도록 변경할 수도 있음
- Objection은 Frida 스크립트를 모아놓은 CLI 도구로, 모바일 앱 연구에 유용함
-
org.tensorflow.lite.NativeInterpreterWrapper
의 함수 호출을 추적하여 모델을 디스크에 덤프함
- 앱 실행 시
.createModelWithBuffer(java.nio.ByteBuffer, long)
가 호출되는데, 이 때 전달되는 ByteBuffer
가 복호화된 .tflite
모델일 가능성이 큼
- 훅킹을 통해 이 메서드를 덤프용 코드로 대체하면, 디스크에 해당 모델을 저장 가능함
-
adb pull
명령으로 추출한 .tflite
모델(currency.tflite
)을 로컬 디바이스로 가져옴
- Netron 같은 툴로 로드해 실제 TensorFlow Lite 모델이 맞는지(레이어, 가중치, 바이어스 등) 확인
- 화폐 인식 모델의 완벽한 덤프 성공
CTRL + C; CTRL + V
- TensorFlow Lite를 사용하는 앱에 대해 이 공격을 활용할 수 있음
- 예를 들어 Adobe Scan은 내가 실제로 자주 사용하는 멋진 앱으로, 휴대폰 카메라로 문서를 스캔하는 것이 가장 좋은 기능
주의사항
- 추출된 모델은 저작권이 있으므로, 적법한 허가 없이 무단 사용/수정은 지양해야 함
- 본 포스팅의 방법은 연구 목적이며, 실제 적용 시 관련 법규와 지적 재산권 이슈를 고려할 필요가 있음