Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

ADB Backup 관련 연구

Nächste SlideShare
Manage book project
Manage book project
Wird geladen in …3
×

Hier ansehen

1 von 19
1 von 19

Weitere Verwandte Inhalte

Ähnliche Bücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Ähnliche Hörbücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

ADB Backup 관련 연구

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

×