티스토리 뷰
[ 안드로이드 복사/붙여넣기 취약점 ]
: 사용자가 개인 정보나 중요한 정보 복사할 때 클립보드에 저장된 임시 정보를
별도의 권한 없이 허가되지 않은 사용자가 확인할 수 있기 때문에 발생하는 취약점
< Android Clipboard Framework >
- 안드로이드는 복사/붙여넣기 기능 위해 강력한 클립보드 기반의 프레임워크 지원
- 지원하는 데이터 종류 : TEXT, URI, Intent
- 클립보드는 한 번에 한 가지 클립 오브젝트만 저장하므로 새로운 클립 오브젝트로 정보 넣을 경우,
이전 클립 오브젝트 정보는 사라짐
- 안드로이드 시스템에서 clipboard는 global clipboard class로도 표현
- clipboard manager 사용 위해 getSystemService() 메서드 사용
< GetSystemService(CLIPBOARD_SERVICE) >
- 데이터를 클립보드에 저장하기 위해서 ClipData 오브젝트에 데이터에 대한 설명과 실제 데이터를 함께 넣어야 함
- ClipData는 ClipDescription 오브젝트와 하나 이상의 ClipData.Item 오브젝트 추가한 후 ClipboardManager에 등록해 관리
* 복사 프로세스
클립보드 시스템을 얻어 옴
// 사용자가 복사를 선택할 경우
case R.id.menu_copy:
// clipboard 서비스를 얻어 옴
ClipboardManager clipboard = (ClipboardManger)
getSystemService (Context.CLIPBOARD_SERVICE);
// 클립보드에 새로운 텍스트 클립을 생성
ClipData clip = ClipData.newPlainText ("simple text", "Hello, World!");
// 클립보드에 첫 번째 클립을 지정
clipboard.setPrimaryClip();
- 복사 메뉴 선택했을 때 getSystemService로 클립보드 서비스 불러온 후 클립 데이터 생성
- 저장할 데이터 타입에 따라 각각 다른 메서드 사용
ClipData clip = ClipData.newPlainText(CharSequence label, CharSequence text) |
- 텍스트 스트링 값을 가진 하나의 ClipData.Item 오브젝트를 포함하는 ClipData 오브젝트를 리턴
- 위 코드에서 ClipDescription 오브젝터의 라벨 값은 "Simple text", 데이터 타입값은 MI<ETYPE_TEXT_PLAIN 타입
* 붙여넣기 프로세스
ClipboardManger clipboard = (ClipboardManger)
getSystemService (Context.CLIPBOARD_SERVICE);
String pasteData = "";
- 텍스트를 붙여넣기 위해 global clipboard 서비스를 얻어 옴
- clip에 저장된 데이터 타입에 따라서 클립보드에 저장된 데이터가 텍스트 파일이 아닐 경우,
현재, Activity에서 붙여넣기 기능 활성화/비활성화 여부 정해야 함
데이터 타입에 따른 붙여넣기 기능 활성화 여부
// "붙여넣기" 메뉴의 ID 값을 얻어 옴
MenuItem mPasteItem = menu.findItem(R.id.memnu_paste);
// 만약 클립보드가 데이터 포함하지 않을 경우, 붙여넣기 메뉴 비활성화
// 만약 데이터 포함할 경우, 붙여넣기 메뉴 활성화
if (!(clipboard.hasPrimaryClip())) {
mPasteItem.setEnabled(false);
}
else if (!(clipboard.getPrimaryClipDescription().hasMimeType (MIMETYPE_TEXT_PLAIN)) {
// 텍스트 파일 아닌 정보가 클립보드에 저장되어 있는 경우, 붙여넣기 메뉴 비활성화
mPasteItem.setEnabled(false);
}
else {
// 텍스트 정보가 클립보드에 저장되어 있는 경우, 붙여넣기 메뉴 활성화
mPasteItem.setEnabled(true);
}
- 사용자가 붙여넣기 메뉴 선택하면 클립보드에 첫 번째 값이 저장되어 있는지 확인
- 값이 저장되어 있으면 데이터 타입값 확인하기 위해 hasMimeType 클래스로 ClipDescription 오브젝트의 데이터
타입값이 MIMETYPE_TEXT_PLAIN인지, 아닌지 확인 후 붙여넣기 메뉴 활성화
사용자가 붙여넣기 선택한 후 프로세스
// 사용자가 "붙여넣기 서낵한 후 프로세스
case R.id.menu_paste:
// 클립보드에 있는 item 검사. 만약 gettext() 함수가 'null' 반환하지 않으면 clip item에
// 텍스트가 저장되어 있는 것. 이 앱은 한 번에 하나의 item만 처리한다고 가정
ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
// 클립보드 정보를 텍스트로 저장
pasteData = item.getText();
// 문자열 데이터 포함한 경우, 붙여넣기 작업 완료
if (pasteData != null) {
return;
}
// 클립보드에 텍스트 정보 아닌 URI 정보 있을 경우, URI 정보로부터 데이터 얻어오기 시도
else {
Uri pasteUri = item.getUri();
// 만약 URI에 텍스트 데이터 포함되어 있을 경우 데이터 추출 위한 조건문
if (pasteUri != null) {
// URI에서 데이터 추출하는 루틴 호출하지만, 이 책에서 간단하게 표현됨
pasteData = resolveUri(Uri);
return;
}
else {
// MIME 타입이 일반 텍스트로 설정되어 있지만, 클립보드가 텍스트나 URI 아닌 경우나
// 문제가 있을 경우, 에러 발생
Log.e("Clipboard contains an invalid data rype");
return;
}
}
- getText() 함수로, 클립보드 안의 item에 잇는 데이터 추출한 후 추출한 데이터 붙여넣는데 사용
< 취약점 진단 과정 >
'Security Study > Android' 카테고리의 다른 글
윈도우11 노트북에서 NOX(녹스) VT 활성화 방법 (1) | 2024.03.17 |
---|---|
[MobSF] 설치 및 사용 방법 (0) | 2023.03.10 |
[InsecureBankv2] 애플리케이션 디버깅 기능 (1) | 2023.01.27 |
[InsecureBankv2] 안드로이드 키보드 캐시 이슈 (0) | 2023.01.27 |
[InsecureBankv2] 안전하지 않은 로깅 메커니즘 (1) | 2023.01.27 |
- Total
- Today
- Yesterday
- 모바일
- rev
- 스테가노그래피
- networking
- MISC
- forensic
- 안드로이드
- 취약점
- sqlinjection
- FTKImager
- cheatengine
- md5
- web
- reversing
- CTF
- AssaultCube
- Cookie
- 포렌식
- Fiesta
- 해킹
- Android
- SQLi
- 인시큐어뱅크
- 리버싱
- Steganography
- 드림핵
- mongodb
- dreamhack
- forensics
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |