9. 안드로이드 앱 진단 실습 (7) - 항목별 진단 실습 4 : 취약한 웹 뷰 구현
[목차]
Insecure Webview implementation (취약한 웹 뷰 구현)
1. 취약점 설명
2. 진단 방법
- 앱 구동 후 웹뷰가 사용되거나
웹뷰와 연관이 있는 기능들 검토
- 웹뷰가 사용되고 있는 코드 검토
- 스크립트 명령어를 웹뷰와 연관 있는
UI 등에 대입 후 반응 확인
3. 대응 방안
[Insecure Webview implementation]
1. 취약점 설명
웹 뷰(안드로이드 앱의 UI 또는 패킷)에서
자바스크립트 코드가 강제로 실행되게 함으로써
다른 사용자의 중요 정보를 탈취하는 취약점
(XSS)
인시큐어뱅크에서는 자바스크립트 코드가
로컬에서만 실행되게 할 수 있는데
만약 다른 사용자에게 자바스크립트 코드를
보낼 수 있다면 타 사용자가 의도하지 않은
코드의 실행 및 특정 중요정보 탈취 등의
행위가 가능한 취약점
2. 진단 방법
(1) 앱 구동 후 웹뷰가 사용되거나
웹뷰와 연관이 있는 기능들 검토
ㄱ. 웹 뷰를 어디서 어떻게 사용하는지 확인
안드로이드 스튜디오 > ctrl + shift + f > WebView 검색

위 창 우측 하단의

Open in Find Window 또는
ctrl + enter 누르면

메인 화면 하단에 검색 결과가 출력됨
Found Occurrences 하단의
Unclassified 메뉴를 살펴보면

두 가지 클래스에서 WebView라는 문자열이 검색되었고
해당 클래스 들을 확인해 보면 어느 메서드에서 사용되었는지
확인 가능
(2) 웹뷰가 사용되고 있는 코드 검토

이 중 살펴볼 것을
View Statiement.java 클래스로

해당 기능은 앱 상에서 이루어진
송금(transfer) 기능의 내역을
확인하는 기능이고

코드를 보면

ViewStatement라고 하는 Activity에서
웹 뷰가 사용되는 것을 확인할 수 있다.
(3) 스크립트 명령어를 웹뷰와 연관 있는
UI 등에 대입 후 반응 확인
: 해당 소스 내 저장된 파일을 load 하는 코드를 확인

스크립트 구문 입력 시도,

송금은 fail 되지만


viewstatment 메뉴에
접근해 보면

저장된 스크립트 구문이
정상 실행된다.
transfer 코드를 살펴보면
DoTransfer 클래스
doInBackground 내 코드를 보면

전송한 viewstatement 정보가
MYFILE 변수, external storage 경로
/Statements + 사용자명.html 로
저장되고 해당 코드는 전송 성공, 실패
모든 경우에 동일하게 들어가 있다.
쉘에 접속해
external storage인
/sdcard 경로를 들어가 보면
Statements_jack.html 파일이 존재하고

내용을 살펴보면
입력했던 스크립트 구문이 함께
저장되어 있다.
결국 ViewStatement는
위 파일을 읽어 웹 뷰 형식으로
사용자에게 보여주는 것
3. 대응 방안
- 스크립트 구문 필터링(특수문자 치환) 코드 추가
- 사용자 입력 값을 점검하여 지정된 데이터 형식 외 사용 금지
-WebView 설정 중 setJavaScriptEnabled 메서드를 false로 설정
