1. ADB Backup 관련 연구
2014. 11. 15. 3분기 NewHeart 내부 세미나
speaker. roland
“때론 진지하게..”
2. 목차
• ADB 란?
• ADB Backup 명령과 옵션
• 프로젝트 진행 동기
• 프로젝트 목표 설정과 접근 방법
• ADB Backup 의 대략적인 매커니즘
• 주요 소스코드 설명
• Android Framework 보안 기제 : @hide annotation
• 향후 연구 발전 방향
3. ADB 란?
• Android Debug Bridge : 안드로이드 플랫폼이 설치된
기기(target)과 PC(host)가 target의 디버깅을 위해 PC
와 연결되도록 지원되는 연결 방법.
• target이 “USB Debugging”이 활성화 되어있어야 함
• host에서 ADB 실행파일을 실행하여 target 에 연결할 수
있음
4. ADB Backup 명령과 옵션
• ADB Backup : ADB의 명령 중에 하나. 설치된 각 앱의
내부 저장소 데이터를 백업 가능
• 앱 패키지 파일(.apk)과 /data/data/<package name>/
{files, databases, shared_prefs 등}/* 을 백업 가능
• 기본적으로 backup.ab 라는 파일로 출력됨
5. 프로젝트 진행 동기
• “adb shell id” => shell
• “adb shell ps | grep /sbin/adbd” => USER : shell
• shell 권한으로 다른 앱들의 내부 저장소 데이터를 읽을 수
있다?
• (참조) 원래는 어떤 앱이 다른 앱의 내부 저장소에 접근하
는 것은 불가능하며, 이는 앱마다 고유한 권한이 있기때문
• android 는 오픈 소스이기 때문에 화이트박스 분석 가능
6. 프로젝트 목표 설정과 접근 방법
• 프로젝트 목표 1
• 내부 저장소 데이터들을 압축해서 해커 측으로 주기적
으로 전송
• 프로젝트 목표 2
• allowBackup 속성을 우회하여, backup 을 차단한 앱
들에 대한 내부 저장소 데이터들도 강제로 백업
7. 프로젝트 목표 설정과 접근 방법
• 접근 방법론
• host의 adb 실행파일을 분석하여 명령 전달 체계 파악
• target의 /sbin/adbd 를 분석하여 명령 처리 체계 파악
• allowBackup 을 비교하는 루틴 <= break point 1
• allowBackup 비교 이후에 프로그래밍 가능한 부분?
8. ADB Backup 의 대략적인 매커니즘
• target의 “USB Debugging” 활성화
• /sbin/adbd 대몬 시작
• host의 adb 실행파일을 이용한 target과의 연결
• USB or TCP/IP Socket을 사용하여, 명령 프로토콜에
맞춰 응답 요청. 이에 따른 응답을 host로 반환.
12. 주요 소스코드 설명(부연)
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 %dn", 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 함수가 호출되면서 일부로 패킷핸들러로 등록됨.
13. 주요 소스코드 설명
• com.android.commands.bu.Backup 가 main class
• Abstract class, Interface 를 통한 구현이 많아서
GrepCode 사이트를 적극적으로 활용함.
14. 주요 소스코드 설명
• Transaction?
A Component
mB.transact(TRANS_ACT);
B Component
onTransact( handle{…} )
15. 주요 소스코드 설명
• allowBackup 속성을 비교하는 부분 발견
• 이 후에 진행될 코드에 대해 재구성을 하여, 어플리케이
션화 하면 됨
16. @hide annotation
@hide 는 매우 중요한 의미를 갖고있다.
이것은 SDK안에서 public API들이 외부로 공개되지 않
게끔 표시하는데 쓰인다.
이것은 안드로이드 개발팀에게 패키지 내에서는 사용가
능하게 하고 어플리케이션에는 사용할 수 없게하는 장
치이다.@hide로 표시된 API들은 우리에게는 private
으로 여겨진다.
18. 향후 연구 발전 방향
• allowBackup 속성 비교 후 로직을 재구성하려고 하는데,
구현해야할 양이 불가능할 정도로 많아 보임
• JNI는 모든 어플리케이션이 가져다 쓸 수 있다는 점을
이용. (*.so 공유 라이브러리이기 때문)
• 구현의 안정성과 보안성을 모두 배제하고 재구성하면
구현해야 할 양도 많이 줄 것이라 판단됨