보안정보

차세대 통합보안관리 기업
이글루시큐리티 보안정보입니다.

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루시큐리티 보안정보입니다.

블로그 상세
안드로이드 Content Provider 취약성 2018.03.06 2 7823

서비스사업본부 보안분석팀 조혁주

 

 

1. 개요

 

스마트폰이나 타블렛과 같은 모바일 디바이스의 발전은 현재진행형이다. 일본에서는 20대 10명 중 9명이 PC보다 스마트폰 사용을 더 하는 것으로 알려졌다. 한국 또한 다르지 않아서 한국인 10명 중 9명이 스마트폰을 사용하고 있고 이들의 하루 평균 사용시간은 3시간이 넘는다. 현재 모바일 디바이스는 우리의 실생활에서 없어서는 안될 ‘존재‘로 자리매김 하고 있는 것이다.

 

모바일 디바이스의 운영체제 점유율은 아래와 같이 안드로이드 운영체제가 86%, iOS 운영체제가 14%이다. 사실상 두 운영체제가 모바일 운영체제의 모든 비중을 차지하고 있는 셈이다.

 

 


 

[그림 1] 모바일 운영체제 점유율 – 출처 : recode

 

 

안드로이드 운영체제는 iOS와는 다르게 ‘개방적’이라는 특성을 가지고 있다. 이러한 특성은 모바일 운영체제 시장에서 86%라는 높은 점유율의 이유이기도 하지만, iOS보다 보안성이 떨어지는 이유이기도 하다. 따라서 안드로이드 운영체제는 iOS보다 다양한 취약점이 발견되고 있으며 배포의 용이성으로 인하여 악성 앱 배포가 쉽다는 고질적인 문제점을 가지고 있다.

 

또한 최근에는 BYOD 산업이 확산됨에 따라 안드로이드 앱으로 업무를 처리하는 기업이 증가하고 있다. BYOD는 개인 단말기로 업무를 처리하는 것을 의미하는데 직원의 단말기에 대한 보안이 적용되어 있지 않을 경우 기업의 중요 정보가 유출될 수 있다는 위험성을 가지고 있다. 기업의 중요 정보 유출은 일반적으로 앱 위·변조를 통해서 발생할 수 있지만 데이터 공유에 사용되는 Content Provider 설정을 취약하게 할 경우에도 기업 정보가 유출될 수 있다.

 

본 문서에서는 데이터 공유에 사용되는 Content Provider 컴포넌트가 가지는 취약성을 확인해보고 안전한 Content Provider 사용법을 알아보고자 한다.

 

 

2. 관련 내용

 

1) 안드로이드 앱 구성

 

안드로이드 앱(APK)은 컴파일이 완료된 소스코드(classes.dex)와 리소스(res), 안드로이드 디바이스에서 실행되기 위해 필요한 정보 파일(AndroidManifest), 개발자의 코드 서명 파일(META-INF)을 포함하는 압축파일 형태를 가지고 있다. 개발자의 코드 서명은 일반적으로 RSA 암호 알고리즘과 SHA1 해쉬 알고리즘으로 생성되며 개발자의 코드 서명이 존재해야 Google Play에 업로드할 수 있다.

 

 

[그림 2] 안드로이드 앱(APK) 구성 요소

 

 

AndroidManifest 파일은 앱이 실행되기 전에 안드로이드 시스템에게 알려야 할 필수 정보들이 저장되어 있다. 패키지 이름, 컴포넌트 정보(Activity, Services, Content Provider, Reciever), API 접근을 위한 Permission 정보 등이 포함되고 컴파일이 되면 이진코드로 인코딩되어 일반적으로 확인할 수 없다.

 

위에서 설명한 것과 같이 Content Provider 컴포넌트를 사용할때에도 AndroidManifest 파일에 명시되어야 사용이 가능하다.

 

 

2) 안드로이드 앱의 보안 체계

 

안드로이드 앱 보안은 샌드박스(Sandbox)에 의존한다. 안드로이드 샌드박스 개념은 기본적으로 서로 다른 앱의 코드와 데이터를 격리시켜 다른 앱의 데이터나 코드에 영향을 주지 않도록 설계된 것이다. 하지만, 서로 다른 앱의 상호작용을 위해서는 샌드박스 개념을 예외시켜야 한다. 안드로이드 시스템에서 서로 다른 앱끼리 데이터를 공유하는 방법으로 클라우드, sharedUserId, Content Provider 등을 제공하고 있다.

 

 

3) Content Provider

 

서로 다른 앱에서 데이터를 공유하기 위해서 Content Provider 컴포넌트를 이용하는 방법이 있다. Content Provider는 특정 앱에서 사용하는 데이터베이스 데이터를 공유하기 위해 사용하는 컴포넌트로서 서버-클라이언트 구조로 구성되어 있다. 데이터를 제공하는 앱이 서버 앱이 되며 서버에서 Content Provider를 정의한다. 데이터를 공유받는 앱은 클라이언트 앱이 되어 Content Resolver를 통해 서버 앱의 데이터를 사용한다. 특정 Content Provider를 식별하기 위해서는 URI라는 것을 사용한다. URL 뿐만 아니라 Permission을 통해서도 Content Provider에 접근을 제어할 수 있다.

 

 

 

[그림 3] Content Provider(Server) & Content Resolver(Client)

 

 

3. Content Provider 컴포넌트의 취약성

 

Content Provider 컴포넌트를 통해 데이터를 공유하고 있는 서버 앱의 경우 강력한 설정의 Permission으로 Content Provider의 접근을 제어해야 한다. 강력한 Permission 설정이 이루어지지 않을 경우 인가되지 않은 앱에서 서버 앱의 데이터를 조작할 수 있는 취약성을 가지고 있다.

 

1) 디컴파일

 

Content Provider의 취약성은 일반적으로 앱 디컴파일을 하여 Content Provider 정보를 추출할 수 있다는 점에서 유효하다. 앱의 소스코드가 난독화되어 있을 경우에는 Content Provider의 취약성이 제거된다는 의미이다. 다음 그림과 같이 앱 디컴파일을 통하여 Content Provider 정보를 추출하고 추출된 정보를 바탕으로 Content Resolver 앱을 작성하여 데이터를 조작할 수 있다.

 

 

 

 

[그림 4] Content Provider 안드로이드 앱(APK) 디컴파일 및 패키징

 

 

Content Provider 컴포넌트를 통해 데이터 공유를 해야할 때에는 Java 소스코드에 데이터베이스 정보가 명시되어 있어야 한다. 다음과 같이 dex2jar 디컴파일 도구를 통하여 Content Provider의 데이터베이스 정보를 추출할 수 있다. (서버 앱 : CPserver.apk)

 

 

  

[그림 5] dex2jar 디컴파일 도구를 이용한 데이터베이스 정보 추출

 

 

Content Provider 컴포넌트에서 사용되는 Permission 정보와 URI는 apktool 디컴파일 도구를 통해서 디코딩된 AndroidManifest.xml 파일에서 확인할 수 있다.

 

 

  

[그림 6] apktool 디컴파일 도구를 통하여 URI 및 Permission 추출

 

 

2) 데이터를 탈취하는 앱 작성

 

추출한 Content Provider 컴포넌트 정보를 바탕으로 CPserver 앱의 Content Provider가 제공하는 데이터를 무단으로 탈취하는 안드로이드 앱을 작성할 수 있다.

 

 

 

[그림 7] 추출한 Content Provider 정보를 이용하여 데이터를 훔치는 안드로이드 앱 작성

 

 

위와 같은 소스코드로 작성된 앱을 실행하여 CPserver 앱에서 사용하는 Content Provider 데이터 조회가 가능한 것을 확인할 수 있다. Select 이외에 update, delete, insert 기능도 Content Provider에 구현되어 있을 경우 데이터 생성, 수정, 삭제가 가능하다.

 

 

[그림 8] CPserver 앱의 데이터를 탈취하는 앱 실행

 

 

위 내용과 같이 Content Provider의 취약성을 정리하면 다음과 같다.

 

 

[Content Provider] - 서버

-자신을 식별할 수 있는 URI를 사용

-Permission을 사용하여 Content Provider 접근을 제어

 

[Content Resolver] - 공격자

- Content Provider의 URI와 Permission 정보를 추출하여 서버 앱의 데이터에 무단 접근할 수 있음

 

 

4. 대응 방안

 

1) protectionLevel

 

Content Provider의 Permission은 과, 에 설정할 수 있다. Permission이 어디에도 설정되지 않았을 경우에는 URI을 통해서만 Content Provider 컴포넌트를 식별할 수 있고 접근을 제어한다. 위에서 살펴본 취약성과 같이 일반적으로 선언된 Permission을 사용할 경우에는 별도의 접근 제어가 없는 것을 확인하였다.

안드로이드 시스템은 protectionLevel 속성을 통해 강력한 Permission을 선언할 수 있도록 하고 있다. protectionLevel 속성은 선택사항으로서 다음과 같은 값을 부여할 수 있다.

 

 

 

 

 protectionLevel

 Level 

설명 

 1 

 normal 

 protectionLevel의 기본 값으로서 단순히 기능을 사용하기 위한 식별 값으로 사용되는 퍼미션 

 2 

 dangerous 

 사용자 개인 데이터나 시스템 제어 기능을 식별하는 퍼미션 

 3 

 signature

 동일한 서명 값으로 컴파일 된 앱끼리 기능을 허용하고자 할 때 사용하는 퍼미션 

 4 

 system 

 안드로이드 시스템 이미지로 설치되는 앱을 허용 할 때 사용하는 퍼미션 

 

  

 

CPserver 앱에 선언된 Content Provider의 Permission을 강력한 Permission으로 선언할 경우에는 Content Provider의 데이터를 보호할 수 있다는 것이다. Content Provider의 취약성은 강력한 Permission을 강제하지 않고 있기 때문에 발생한다. 안전한 Permission을 살펴보기 위하여 Permission에 4가지 protectionLevel 속성을 적용해본 결과, normal, dangerous Level은 Content Provider의 취약성에서 살펴본 것과 같이 CPserver의 데이터를 보호할 수 없었고 signature, system Level은 데이터를 보호할 수 있었다.

 

 

< Level : signature, system> - 안전하지 않음

 

 

 

[그림 9] CPserver 앱의 Content Provider Permission에 normal, dangerous Level 부여

 

 

< Level : signature, system> - 안전함

- signature, system Level은 Content Provider 접근 정보를 알게되어도 동일한 서명 값으로 컴파일된 앱이 아닐 경우, 데이터 접근이 불가능한 것을 확인하였다. 사실상 해당 protectionLevel을 부여하는 것이 현실적인 대응방안이라 할 수 있다.

 

 

 

[그림 10] CPserver 앱의 Content Provider Permission에 signature, system Level 부여

 

 

Permission의 protectionLevel 속성별 데이터 탈취 여부를 확인하여 다음 표와 같이 정리하였다. Content Provider는 개발자가 정의한 Permission과 안드로이드에서 제공하는 Permission 사용할 수 있는데 안드로이드에서 제공하는 Permission을 부여하였을 때도 Permission이 가지고 있는 protectionLevel에 따라 데이터 보호 여부가 결정된다.

 

 

 

 

 Permission of Content Provider in CPserver App 

구분 

 적용된 Permission 

orotectionLevel 

 데이터 탈취 여부 

 개발자가 생성한 Permission 

 설정 없음 

 설정 없음 

탈취 가능 

 개발자 Permission 적용 

 normal (Default) 

 탈취 가능 

dangerous 

 탈취 가능 

signature 

탈취 불가 

 signature | system 

탈취 불가 

 안드로이드에서

제공하는 Permission 

 WRITE_USER_DICTIONARY 

 normal 

 탈취 가능 

 READ_CONTACTS 

dangrous 

 탈취 가능 

ACCOUNT_MANAGER 

signature 

탈취 불가 

 BIND_DIRECTORY_SEARCH

 signature | system 

 탈취 불가 

 

 

5. 참고 자료

 

[1] recode – Closing the books on Microsoft’s Windows Phone

https://www.recode.net/2017/7/17/15984222/microsoft-windows-phone-mobile-operating-system-android-iphone-ios

 

[2] asiae – 스마트폰 사용률 92%, 20대는 100%

http://www.asiae.co.kr/news/view.htm?idxno=2017102108374538963

 

[3] SQLHelper

https://developer.android.com/training/basics/data-storage/databases.html#ReadDbRow

 

[4] Content Provider

https://developer.android.com/guide/topics/providers/content-providers.html

 

[5] Permission

https://developer.android.com/guide/topics/manifest/permission-element.html

 

 

 


 

이전글, 다음글 목록
다음글 가상화폐를 노리는 공격자의 딜레마, 채굴인가? 악성코드인가?
이전글 Tabnabbing 기법을 통한 계정 탈취

원하시는 계정으로 로그인 후 댓글을 남겨 주세요.

사용자 이미지
0/ 250 byte