Android/iOS Memory dump
취약점 점검을 하면서 모바일 APP/모바일 Web 등 환경에서 특정 시점의 메모리 상태를 검증해야 할 때가 있다.
중요/개인정보나 해당 정보가 포함된 이미지파일 등을 처리하는 로직이 있다고 가정하면, 해당 데이터를 처리한 이후에도 해당 정보가 메모리에 적재되어있는지 확인이 필요한 경우에 아래와 같은 절차로 확인 해 볼 수 있다.
Frida가 셋팅되어있는 환경에서 fridump라는 툴을 사용해서 특정 시점의 메모리를 dump 할 수 있다. Frida 셋팅이나 fridump 설치같은 절차는 이 글에서 다루지는 않겠다.(추후에 여유가 되면 추가..)
예를 들어, 신분증 이미지를 다루는 로직이 있다고 가정하면, 해당 정보를 처리하는 로직이 종료된 시점에서는 메모리에서도 관련 정보가 노출되지 않도록 처리를 해야 한다.
무튼, 점검 방법 예시는 아래와 같다.
USB로 연결되어있는 휴대폰 기준으로, 아래와 같이 메모리 Dump 대상 정보를 추출하고..
frida-ps -Uai
fridump를 통해 아래와 같이 메모리 덤프를 시도한다. 참고로 fridump를 셋팅할수있는 채널이 여러개 있는것으로 알고있는데, 경우에 따라 USB 옵션이 -u 또는 -U 중에 다른 경우가 있었고, -r 의 인자가 PID가 유효한 경우, NAME이 유효한 경우 등 약간 다른 케이스가 있었다.
python fridump.py -U -r [PID or NAME]
정상적으로 실행 되면, 아래와 같이 .data 파일들이 추출된다. 참고로 -s 옵션을 추가하면 추출되는 String이 모아져있는 파일이 하나 생성되기도 한다. 개인적으로는 Notepad++의 기능 중 경로내 파일들을 대상으로 서치하는 기능을 사용하곤 했다.
이미지를 추출하기 위해서는 foremost라는 Tool을 셋팅해야하는데 리눅스 기반으로 알고있어서 개인적으로는 wsl을 셋팅해서 사용하곤 했다.
간편하게 이미지 추출을 하기 위해, 간단하게 아래와 같은 파이썬 코드를 통해 .data 파일들을 바이트 단위로 병합해서 하나의 파일로 만들어 준 후..
import os
def concatenate_data_files():
files = os.listdir()
with open("concatenated_data.bin", "wb") as output_file:
for file_name in files:
if file_name.endswith(".data"):
with open(file_name, "rb") as input_file:
output_file.write(input_file.read())
print("Data from .data files has been concatenated into concatenated_data.bin")
concatenate_data_files()
아래 명령어를 통합한 파일 하나를 대상으로 하여 이미지 파일를 추출했다.
foremost -t jpg -i concatenated_data.bin
그 결과 덤프된 메모리 내 암호화 되지 않은 이미지 파일이 존재한다면 아래와 같이 확인 할 수 있다.
위 과정을 통해 취약점이 발견되었을 경우, 일반적인 조치방법으로는 중요 정보 문자열을 다룰 때 Str 대신 char[] 형식으로 다뤄주거나, 해당 값들을 담았던 변수들을 강제로 메모리 Clear를 해줘야 한다.
이미지의 경우 bitmap.copyPixelsToBuffer 등으로 다루는게 권장되는것으로 알고 있다.(추후에 추가 설명..?)