19
ADB Backup 관련 연구 2014. 11. 15. 3분기 NewHeart 내부 세미나 speaker. roland “때론 진지하게..”

ADB Backup 관련 연구

Embed Size (px)

DESCRIPTION

by roland

Citation preview

Page 1: ADB Backup 관련 연구

ADB Backup 관련 연구2014. 11. 15. 3분기 NewHeart 내부 세미나

speaker. roland

“때론 진지하게..”

Page 2: ADB Backup 관련 연구

목차• ADB 란?

• ADB Backup 명령과 옵션

• 프로젝트 진행 동기

• 프로젝트 목표 설정과 접근 방법

• ADB Backup 의 대략적인 매커니즘

• 주요 소스코드 설명

• Android Framework 보안 기제 : @hide annotation

• 향후 연구 발전 방향

Page 3: ADB Backup 관련 연구

ADB 란?

• Android Debug Bridge : 안드로이드 플랫폼이 설치된 기기(target)과 PC(host)가 target의 디버깅을 위해 PC와 연결되도록 지원되는 연결 방법.

• target이 “USB Debugging”이 활성화 되어있어야 함

• host에서 ADB 실행파일을 실행하여 target 에 연결할 수 있음

Page 4: ADB Backup 관련 연구

ADB Backup 명령과 옵션

• ADB Backup : ADB의 명령 중에 하나. 설치된 각 앱의 내부 저장소 데이터를 백업 가능

• 앱 패키지 파일(.apk)과 /data/data/<package name>/{files, databases, shared_prefs 등}/* 을 백업 가능

• 기본적으로 backup.ab 라는 파일로 출력됨

Page 5: ADB Backup 관련 연구

프로젝트 진행 동기

• “adb shell id” => shell

• “adb shell ps | grep /sbin/adbd” => USER : shell

• shell 권한으로 다른 앱들의 내부 저장소 데이터를 읽을 수 있다?

• (참조) 원래는 어떤 앱이 다른 앱의 내부 저장소에 접근하는 것은 불가능하며, 이는 앱마다 고유한 권한이 있기때문

• android 는 오픈 소스이기 때문에 화이트박스 분석 가능

Page 6: ADB Backup 관련 연구

프로젝트 목표 설정과 접근 방법

• 프로젝트 목표 1

• 내부 저장소 데이터들을 압축해서 해커 측으로 주기적으로 전송

• 프로젝트 목표 2

• allowBackup 속성을 우회하여, backup 을 차단한 앱들에 대한 내부 저장소 데이터들도 강제로 백업

Page 7: ADB Backup 관련 연구

프로젝트 목표 설정과 접근 방법

• 접근 방법론

• host의 adb 실행파일을 분석하여 명령 전달 체계 파악

• target의 /sbin/adbd 를 분석하여 명령 처리 체계 파악

• allowBackup 을 비교하는 루틴 <= break point 1

• allowBackup 비교 이후에 프로그래밍 가능한 부분?

Page 8: ADB Backup 관련 연구

ADB Backup 의 대략적인 매커니즘

• target의 “USB Debugging” 활성화

• /sbin/adbd 대몬 시작

• host의 adb 실행파일을 이용한 target과의 연결

• USB or TCP/IP Socket을 사용하여, 명령 프로토콜에 맞춰 응답 요청. 이에 따른 응답을 host로 반환.

Page 9: ADB Backup 관련 연구

주요 소스코드 설명platform/system/core/adb/Android.mk

Page 10: ADB Backup 관련 연구

주요 소스코드 설명platform/system/core/adb/commandline.c

Page 11: ADB Backup 관련 연구

주요 소스코드 설명platform/system/core/adb/services.c

Page 12: ADB Backup 관련 연구

주요 소스코드 설명(부연)1. 위 코드는 sockets.c 에서 아래와 같이 호출됨. asocket *create_local_service_socket(const char *name)1 fd = service_to_fd(name); 2 if(fd < 0) return 0; 3 4 s = create_local_socket(fd); 5 D("LS(%d): bound to '%s' via %d\n", s->id, name, fd); 2. 위 코드는 adbd 내 패킷 핸들러(handle_packet)의 아래 코드로 호출됨. void handle_packet(apacket *p, atransport *t)1 case A_OPEN: /* OPEN(local-id, 0, "destination") */ 2 if (t->online && p->msg.arg0 != 0 && p->msg.arg1 == 0) { 3 char *name = (char*) p->data; 4 name[p->msg.data_length > 0 ? p->msg.data_length - 1 : 0] = 0; 5 s = create_local_service_socket(name); 6 if(s == 0) { 7 send_close(0, p->msg.arg0, t); 8 } else { 9 s->peer = create_remote_socket(p->msg.arg0, t); 10 s->peer->peer = s; 11 send_ready(s->id, s->peer->id, t); 12 s->ready(s); 13 } 14 } 15 break; 16

3. 쭉 타고 올라가면 결국, main에서 adb_main에 init_transport_registration 함수가 호출되면서 일부로 패킷핸들러로 등록됨.

Page 13: ADB Backup 관련 연구

주요 소스코드 설명

• com.android.commands.bu.Backup 가 main class

• Abstract class, Interface 를 통한 구현이 많아서 GrepCode 사이트를 적극적으로 활용함.

Page 14: ADB Backup 관련 연구

주요 소스코드 설명• Transaction?

A Component

mB.transact(TRANS_ACT);

B Component

onTransact( handle{…} )

Page 15: ADB Backup 관련 연구

주요 소스코드 설명

• allowBackup 속성을 비교하는 부분 발견

• 이 후에 진행될 코드에 대해 재구성을 하여, 어플리케이션화 하면 됨

Page 16: ADB Backup 관련 연구

@hide annotation

@hide 는 매우 중요한 의미를 갖고있다. 이것은 SDK안에서 public API들이 외부로 공개되지 않

게끔 표시하는데 쓰인다. 이것은 안드로이드 개발팀에게 패키지 내에서는 사용가능하게 하고 어플리케이션에는 사용할 수 없게하는 장치이다.@hide로 표시된 API들은 우리에게는 private

으로 여겨진다.

Page 17: ADB Backup 관련 연구

@hide annotation

Page 18: ADB Backup 관련 연구

향후 연구 발전 방향

• allowBackup 속성 비교 후 로직을 재구성하려고 하는데, 구현해야할 양이 불가능할 정도로 많아 보임

• JNI는 모든 어플리케이션이 가져다 쓸 수 있다는 점을 이용. (*.so 공유 라이브러리이기 때문)

• 구현의 안정성과 보안성을 모두 배제하고 재구성하면 구현해야 할 양도 많이 줄 것이라 판단됨

Page 19: ADB Backup 관련 연구

Thank You! (Q&A)