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