SlideShare une entreprise Scribd logo
1  sur  109
Télécharger pour lire hors ligne
모바일 보안 이론과 실습
2015.11
박찬진, chanjin.park@gmail.com
2
왜 모바일 공격?
중요한 개인 정보를 저장 (Strong Personalization)
이메일, 일정, 연락처, 사진 등. 최근에 전자 지갑. 회사 정보 저장
쉽게 분실할 수 있음 (Mobility)
다양한 네트워크 연결을 통해 멀웨어 침투 (String Connectivity)
빌링 시스템
신용카드화되어 가고 있음. in-app purchases, etc. 최근에는 NFC 지원
iOS에 비해 안드로이드 멀웨어가 많음
구글은 애플과 달리 안드로이드 소스를 공개하고 제3의 제조업체가 스마트폰을 제작하는 구조
통제가 불가능해 모든 안드로이드 폰에 패치를 적용하기 어려운 한계가 있음
e.g. 2014년 1분기 발견 악성코드 중 99%가 안드로이드 대상 (According to F-Secure & Cisco)
3
INFOGRAPHICS
2014년 주요 지수
10 억 건의 침해 시도
미국에서 5백 2십만개 핸드폰 분실 및 도난
44% 웹 공격이 미국/독일로부터 시도
모바일 기기가 비즈니스 보안 취약 기기 #1
5명 중 1명이 모바일 보안 위협을 경험
사이버범죄에 의한 평균 기업의 오버헤드
소매 유통 $8.6M, 통신 $12.7M, 기술 $ 14.5M, 금융 $20.8M
75% 넘는 모바일 앱이 기본 보안 테스트를 통과 못함 (가트너)
모바일 뱅킹 Trojan 공격이 9배 늘었음
56% 기업이 위협 대비 부족하고, 대비한 기업의 37%도 실시간 탐지
능력 부족
4
http://blogs.air-watch.com/2015/10/infographic-mobile-
security-haunting-reality/#.VkapM9_hDMU
전형적인 공격
5
phishing
앱, 이메일, SMS을 통해 계정 정보, 카드 정보와 같은 사용자 보안 정보를 수집
spyware
불특정 다수의 스마트폰에서의 사용자 활동을 감시. 개인 정보를 수집 혹은 추측
surveillance attacks
감염된 폰을 통해 특정 사용자를 감시
diallerware attacks
SMS 서비스나 Premium 번호로 전화를 걸어 과금 발생
financial malware attacks
금융 앱에 대해 Man-in-the-Middle 공격
worm-based attacks
기기 간 웜 전파 (블루투스, Wi-Fi, SMS 등)
botnets
공격자가 원격 제어할 수 있는 감염된 좀비 기기들의 집합
멀웨어 종류
멀웨어
사용자 동의 없이 기기를 사용하도록 고안된, 악의적
(hostile), 위협적이고 (intrusive), 성가신 (annoying) 소
프트웨어 혹은 프로그램 코드
Troyan, Rootkit, Backdoor
악성 파일 이메일 첨부 혹은 감염 사이트 링크 가진 스팸
virus
스스로 복제 가능한 코드로, 복제된 바이러스는 다른 프로
그램, 부트 섹터, 파일을 감염시킬 수 있음.
성능을 느리게 하거나 데이터를 망가뜨림
worm
사용자 승인없이 스스로 복사본을 만들어 네트워크를 통해
전송하여 다른 컴퓨터를 감염시키는 프로그램
메일, 다운로딩, 브라우징, 블루투스 등
데이터를 빼내거나 네트워크 대역폭을 잡아먹을 수 있음.
6
차이
• 바이러스는 감염된 파일이나 프로그램을 통해 감염. 웜은 네
트워크를 통해 전파
• 바이러스는 파일의 삭제/변조하며, 웜은 CPU 및 메모리 속도
를 늦춤
• 바이러스는 웜 보다 전파속도가 느림
• 웜의 예방은 바이러스보다 쉬움. 이메일이나 링크 클릭을 주
의하면 되지만, 바이러스는 탐지 및 제거를 위해 안티 바이러
스 백신이 필요
• 전파 방식: 어떻게 기기로 전달되는 지
• 원격 제어 방식: 멀웨어가 감염된 기기를 exploit하기 위해 리
모트 서버를 사용하는 방식
• 공격 방식: 멀웨어가 기기를 공격하는 방식 (기기에 저장된 데
이터에 접근, 정상 동작을 방해, 다양한 공격을 위해 권한을 획
득)
멀웨어 종류
Trojan
정상적인 기능을 수행하는 것으로 보이나 악성 프로그램을 가
진 소프트웨어
최근 가장 일반적인 모바일 멀웨어 타입
7MOBILE THREAT REPORT By F-Secure, 2014 Q1
멀웨어 종류
rootkits
OS를 감염
Root 권한 (관리자 권한)을 획득 (OS 취약점 활용, 암호추론/ 소셜공학을 통한 관리자 암호 파악)
탐지 및 제거가 어렵고, 최악의 경우 시스템을 재설치
Rootkit 설치되면 원격서버에서 제어/조작이 가능함
botnet
바이러스에 감염된 기기 집합. 조직적 범죄를 위해 개발
Bot: 사용자 모르게 원격 Command & Control 서버에 접속된 기기
공격자가 원격으로 제어하여, 프로그램 설치, 금품 요구, 스팸을 광범위하게 뿌리거나, DOS 공격, SMS 메시지 등
불법적 정보 수집 목적
모바일 기기가 인터넷에 연결되면서 Botnet 가능성 증대
8
멀웨어 공격 목적
단말 장애 유발
장애를 불러일으키거나 심한 경우 사용자체를 불가능하게
하는 악성코드의 유형. 블루투스로 전파
2004년 해골(Skull)이 대표적인 단말장애 유발형 악성코
드. 모든 메뉴 아이콘을 해골로 변경, 통화 기능만 허용
시스템을 재설치 해야 함 (공장모드 초기화)
배터리 소모
스마트폰의 전력 사용을 지속적으로 유발. 배터리를 고갈
목적을 가지는 악성코드
2004년 블루투스를 통해 전파되었던 최초의 모바일 악성
코드인 Cabir가 대표적인 배터리 소모형 악성코드
지속적으로 근처 기기의 블루투스 장치를 스캐닝하고, 검
색된 블루투스를 통해 악성코드를 전파하는 기능을 가졌
음. 지속적인 스캐닝을 통해 배터리 고갈됨
9
TROJAN:SYMBOS/SKULLS.A
BLUETOOTH-WORM:SYMBOS/CABIR
멀웨어 공격 목적
과금 유발
SMS 서비스나 전화 송신 서비스를 지속적으로 시도 과금을 발생
2010년 4월, 국내 최초 발생한 스마트 폰 악성코드인 WinCE/TerDial은 게임 내에 숨겨진 형태로 존재.
시스템 디렉터리에 복사됨
매 50초 마다 국제전화를 송신
정보 유출
스마트폰 기기 정보나 사용자 개인정보를 외부로 유출
2008년 Infojack. 게임, 지도 등 일반 프로그램으로 위장. 추가 설치 파일을 가짐
기기 보안설정을 변경하여 사용자 고지 없이 추가 설치
웹서버에 접속하여 나머지 부분 다운로드하여 재설치.
AndroidOS.Tapsnake는 사용자의 위치정보를 빼감
10
보안 사고 및 위협
11Infographic: Timeline of Mobile Threats
CABIR, BLUETOOTH-WORM:SYMBOS/CABIR
wireless를 통한 개인 중요 데이터
도청을 통해 사용자이름/암호 등 개인 신원 정보를 수집
추적 및 분류를 위해 하드웨어 ID (e.g. MAC 주소) 사용
전파 속도 향상을 위해 블루투스를 사용
Cabir, 최초 wireless 웜, 2004
심비안 모바일 폰에서 블루투스 활용 (Nokia S60)
당시 Harmful Effects는 없었지만, 악용 가능
caribe.sis라는 앱 파일를 가진 메시지로 구성
폰의 메시지 박스에서 caribe.sis 파일을 클릭한 경우 설치
경고 메시지
사용자가 Yes 해야 설치 (No 하면 계속 메시지를 띄움)
일단 설치되면, 기기의 블루투스 기능을 사용하여 다른 블
루투스 기기를 검색. 감염된 SIS 파일을 검색된 기기로 전송
시도
폰이 켜질 때마다 실행되고,화면에 Caribe라는 문자를 보
여줌
12https://www.f-secure.com/v-descs/cabir.shtml
TROJAN-SMS.ANDROIDOS.FAKEPLAYER.B
FakePlayer, 2011.2
안드로이드 Trojan (FakePlayer.A는 2010.9월 발견)
이전에는 단순 Spyware 였으나, 안드로이드 최초 SMS 멀웨어
사용자 동의없이 정해진 번호로 SMS 메시지를 보냄
러시아 성인물 비디오 웹페이지로부터 미디어 플레이어로 위
장하여 사용자 설치 유도
표준 .APK 설치프로그램으로 다운로드됨
설치 크기는 매우 작고, 설치 동안 앱은 SMS 메시지 보내기에
필요한 사용자 권한을 요청
앱을 실행되면, Troyan이 사용자 동의 없이 SMS 메시지를
Premium Rate Number로 보내기 시작
백그라운드로 실행되며, 실행 시 어떤 메시지도 보여주지 않음
13
Kasperksy Lab, “Popular Porn Sites Distribute a New Trojan
Targeting Android Smartphones,” 2010. [Online]. Available:
http: //www.kaspersky.com/news?id=207576175
LOCATION: ANDROIDOS.TAPSNAKE
위치 정보 활용
GPS, Cell of Origin 및 Signal strength (삼각 측량)
실내에서는 WLAN or Bluetooth
좋은 점이 많이 있지만, 개인 정보 우려가 있음
단골 음식점 할인 및 쿠폰, 광고, 주변 상점 세일 정보 제공 및
관광정보 제공,
생산성 향상 위한 직원, 트럭 등 위치 추적, 경로정보. 하이킹
주변 기기 혹은 사람을 자동 인지.
응급전화 위치 추적
Tap Snake, 2010.10
GPS 위치정보를 빼가는 스파이웨어
‘Tap snake’게임으로 위장해서 설치
백그라운드로 실행. 15분 단위로 위치 정보를 업로드.
게임은 종료되지 않고, 설치되면 부팅 시 자동 수행
유료 애플리케이션‘GPS Spy’를 설치한 사용자는 ‘Tap Snake’
사용자의 이메일 정보로 위치정보를 확인.
소셜 공학으로 Tap Snake 게임 권유 후 위치 추적. 14
'Tap Snake' Android App Hides GPS Spyware
AndroidOS.Tapsnake: Watching Your Every Move
DROIDDREAM
DroidDream.A, 2011.3
TrojanSpy:AndroidOS/DroidDream.A
공식 안드로이드 마켓에서 발견됨 (By Lookout Inc.)
2011년 3월 당시 58개 앱이 감염
4일동안 26만 다운로드
릴리스 후 4일 만에 앱을 제거, 3명의 개발자를 금지.
안드로이드 취약점을 통해 폰 루팅 (Froyo)
Bowling Time 앱 실행 시 DroidDream이 실행되어 중요
개인 정보를 C&C 서버로 전송, www.umeng.com (베이
징 소재)
IMEI (국제단말기식별번호), IMSI (국제단말기가입자ID),
Language, Country, Device Model, SDK Version => 관
리자 계정에서만 알 수 있는 정보
밤 중에 Premium rate SMS 메시지를 보냄
이 후로 멀웨어가 많이 생김
15
ZEUS BANKING TROJAN
ZeuS Trojan, 2010.9
Windows, TROJAN:W32/AGENT.DKJC
스페인의 12개 은행의 온라인 뱅킹 계정 정보 해킹.
Man-in-the-Middle (소셜 공학 + SMS 인증)
소유자가 앱을 설치하면, 공격자는 감염된 스마트폰을 공격하여
모든 SMS 메시지를 읽어들임
사용자가 온라인뱅킹 계좌 로그인 시, 폰 번호 입력 유도
스마트폰 감염, 계정 소유자 대신 온라인 뱅킹 작업 실행
SMS를 전달받아, 공격자는 뱅킹 시 필요한 SMS 인증을 통과
미국에서만 350만 기기를 감염
U.S. 92명 체포 (4년간 70M$), London 19명 체포 (3개월, 9M
$), Ukraine 5명 체포
SpyEye, 2011
키 입력을 캡처해서 서버로 보냄
코드 개발자 패닌은 블랙 마켓에 1000 ~ 8500불에 코드를 판매.
FBI가 은행돈을 훔치기 위해 코드를 사용한 구매자를 조사.
150명이 파악됨, 이 중 한명은 6개월에 320만불을 훔침
16
95% 멀웨어가 뱅킹 Trojan이고, 이 중 98%가 안드로이드를 대상
(2013, KasperSky)
https://www.cybersecurityintelligence.com/blog/uk-
banks-hit-with-new-zeus-banking-trojan-
attacks-707.html
STAGEFRIGHT
Android 취약점, Stagefright
동영상 등 멀티미디어 파일을 실행할 때 사용되는 미디어
플레이어. DRM 등의 기능 사용 위해 Root 권한으로 실행
문자메시지에 영상이 첨부되어 있을 때, Stagefright는 사
용자가 읽지 않아도 미리 로딩.
해커들이 비디오 및 오디오 파일에 악성 코드를 심어 메시
지를 보내면 스테이지프라이트가 이를 먼저 읽고 감염됨
전화번호만으로 스마트폰 해킹 가능
메시지를 스스로 지우는 기능도 있음
원격으로 애플리케이션(앱)이나 소프트웨어를 실행가능
신용카드 정보, 사진 등 개인정보 노출 우려
메시지를 보내는 순간 작동한다는 점에서 매우 위험
자동 수신 기능을 해제해야
17
“메시지를 받았다는 알림 소리가 들리기 전부터 해킹은 시작된
다”며 “게다가 메시지는 해킹 즉시 삭제돼 어떤 흔적도 남기지
않기 때문 에 이용자들은 해킹이 됐다는 사실조차 모를 가능성
이 크다”
“안드로이드폰의 95%가 해킹 공격에 취약하다” (9억5,000만
대)
- 모바일 보안 전문업체 짐페리엄, 2015.7
The Stagefright vulnerabilities affect all Android
devices running Froyo 2.2 to Lollipop 5.1.1, which
covers approximately 95% of all Android devices
today.
18
STAGEFRIGHT
방어
MMS 자동 수신 때문이므로 자동 수신 막고, 최신 업데이트 필수
안드로이드 스마트폰의 메시지나 구글 행아웃과 같은 메시지 앱을 사용할 경
우, 자동 수신 기능을 해제해야
메신저: 설정 - ‘자동 수신(메시지를 자동으로 수신)’ 기능을 해지.
구글 행아웃: 설정-SMS-고급 메뉴로 들어가 ‘MMS 자동 수신’ 부분에 체크를
풀면 된다.
사용자가 문자를 확인해서 악성코드를 실행하지 않아야 함
스마트폰 제조사의 웹사이트를 통해 해당 취약점에 대한 패치 정보 확인
제조사들은 패치 개발, 배포가 느려 위험성이 커질 전망
구글은 48시간만에 내부 코드에 대한 보안 취약점 패치
패치용 소프트웨어가 배포되려면 오랜 시간이 걸릴 것으로 예상됨
삼성전자는 일부 유럽용 제품에서 해당 패치를 시작. 국내 버전의 배포 시기는
검토중. LG전자의 경우 현재 보안 패치에 대해 개발 중
19
약관, SKP
20
http://www.bloter.net/archives/243208 SK플래닛 관계자의 말
“우리가 수집하는 것은 앱 패키지 이름이나 버전, 설치 경로, 이용 횟수, 이용 시간, 이용 환경 등이고, 사
용자의 정치적 사상이나 신념 등을 수집하지는 않습니다. 버전, 설치 경로, 이용 횟수, 환경 등을 고려해
정치적 성향이나 신념 등을 추측할 가능성이 있음을 고지한 것입니다.”
삼성 스마트 매니저
21
배터리를 효율적으로 사용할 수 있도록 하는 ‘앱 절전’ 기능을 제공 피싱 앱 등 악성 소프트웨어, 특정 앱의 과도한 배터리 사용, 비정상적 오류로
성능 저하를 유발하는 앱 등을 자동으로 검출, 해결 방법을 제시
삼성 스마트 매니저
22
2015년 9월 정기 보안업데이트 과정에서 신형 단말기 뿐만 아니라 노트2, S3 등 구형 단말기에도 스마트 매니저를 확대 적용
이용자 모르는 새 알지 못하는 앱이 설치되고 복구 됨. 잦은 오류 현상 및 기존 보안 앱과 충돌현상. 심하면 단말기 먹통 현상
"현재 국내 보안의 가장 큰 문제점은 이용자가 업데이트 안내에 무조건 '예스맨'이 되
기 때문에 악성 업데이트도 의심없이 하는 것"이라면서 "프로그램 오류가 있다면 신속
하게 업데이트를 하는 것이 마땅하지만, 그 과정에서 원하는 이용자에게 충분한 정보
를 제공하고 오류 사실을 알려야 한다"고 지적
http://www.ddanzi.com/free/52692974#11
http://www.clien.net/cs2/bbs/board.php?bo_table=park&wr_id=42395267
• 디바이스 상태 및 ID 읽기 (발신전화 가로채기)
• 내 문자 메시지 읽기
• 사진 및 동영상 촬영, 오디오 녹음
• 대략적인 위치, 정확한 위치 (네트워크기반, GPS)
• 연락처데이터 수정, 캘런더 일정 및 비빌 정보 읽기
• 새 웹 북마크 및 기록 추가
• SD 카드의 컨텐트 수정 및 삭제
• 계정 권한 인증서 사용, 계정 만들기 및 비밀번호 변경
• 블루투스 기기 페이링
• …
안드로이드 설치 및 사용
ANDROID HISTORY
24http://www.phonearena.com/news/From-Cupcake-to-Marshmallow-the-sweet-history-of-Android-infographic_id74337
25
ANDROID SDK
26
http://developer.android.com/index.html
ANDROID STUDIO
27
ANDROID STUDIO
Android Debug Bridge, adb
에물레이터, 연결 기기에 대해 다양한 명령을 실행하기 위한 Unix Shell.
adb devices
adb shell
root@generic_x86:/ # pm list packages
ls -al /system/app
drwxr-xr-x root root 2015-11-06 00:49 BackupTestApp
drwxr-xr-x root root 2015-11-06 00:49 BasicDreams
drwxr-xr-x root root 2015-11-06 00:50 Browser
drwxr-xr-x root root 2015-11-06 00:50 Calculator
drwxr-xr-x root root 2015-11-06 00:50 Calendar
drwxr-xr-x root root 2015-11-06 00:49 CaptivePortalLogin
drwxr-xr-x root root 2015-11-06 00:49 CertInstaller
drwxr-xr-x root root 2015-11-06 00:49 CustomLocale
drwxr-xr-x root root 2015-11-06 00:51 DeskClock
adb pull /system/app/DeskClock
unzip DeskClock.apk
-rw-r--r-- 1 chanjinpark staff 22708 2 29 2008 AndroidManifest.xml
drwxr-xr-x 5 chanjinpark staff 170 11 16 12:33 META-INF
drwxr-xr-x 4 chanjinpark staff 136 11 16 12:33 assets
drwxr-xr-x 58 chanjinpark staff 1972 11 16 12:33 res
-rw-r--r-- 1 chanjinpark staff 1127228 2 29 2008 resources.arsc
28
DROZER
29
https://www.mwrinfosecurity.com/products/drozer/
Mac에서의 설치
- 다운로드: drozer (Python .egg) 21.8 MB
- https://github.com/mwrlabs/drozer/blob/develop/
INSTALLING
- * Python 2.7 with development headers
- * Python Setuptools
- $ easy_install --allow-hosts pypi.python.org protobuf==2.4.1
- $ easy_install twisted==10.2.0
- $ easy_install ./drozer-2.3.0-py2.7.egg
(egg 파일은 python 설치모듈로, zip으로 압축되어 있음, egg 파일 설
치 시 오류가 날 수 있는데, 이는 egg 파일 내에 requires.txt에서
pyopenssl의 버전을 0.15로 올려주면 됨. 압축 풀고, EGG-INFO 아래
requires.txt에서 pyopenssl==0.15로 수정)
DROZER
30
agent.apk를 설치
- Android Studio에서 앱 실행
- adb install agent.apk
DROZER
31
drozer agent에 접속
- adb forward tcp:31415 tcp:31415
- drozer console connect
패키지 정보 열거
- dz> run app.package.list
- dz> run app.pacakge.list -f contacts
dz> run app.package.list
com.android.smoketest (com.android.smoketest)
com.example.android.livecubes (Example Wallpapers)
com.android.providers.telephony (휴대전화/메시지 저장공간)
com.android.providers.calendar (캘린더 저장)
com.android.providers.media (미디어 저장소)
com.android.protips (홈 화면 도움말)
com.android.launcher (Launcher)
com.android.documentsui (문서)
com.android.gallery (카메라)
com.android.externalstorage (외부 저장소)
com.android.htmlviewer (HTML 뷰어)
com.android.quicksearchbox (검색)
com.android.mms.service (MmsService)
com.android.providers.downloads (다운로드 관리자)
com.android.browser (인터넷)
com.android.soundrecorder (Sound Recorder)
DROZER
32
패키지 세부 사항 보기
- dz> run app.package.info -a contacts
권한을 가진 패키지 열거 (Dangerouse Protection Level)
- dz> run app.package.info -p android.permission.CAMERA
dz> run app.package.info -a com.android.contacts
Package: com.android.contacts
Application Label: 주소록
Process Name: com.android.contacts
Version: 5.1-1737576
Data Directory: /data/data/com.android.contacts
APK Path: /system/priv-app/Contacts/Contacts.apk
UID: 10002
GID: [3003, 1028, 1015]
Shared Libraries:
Shared User ID: android.uid.shared
Uses Permissions:
- android.permission.CALL_PHONE
- android.permission.CALL_PRIVILEGED
- android.permission.READ_CONTACTS
- android.permission.WRITE_CONTACTS
- android.permission.MANAGE_ACCOUNTS
- android.permission.GET_ACCOUNTS
- android.permission.ACCESS_FINE_LOCATION
- android.permission.ACCESS_COARSE_LOCATION
- android.permission.READ_PROFILE
- android.permission.WRITE_PROFILE
- android.permission.INTERNET
- android.permission.NFC
- android.permission.READ_PHONE_STATE
- android.permission.WAKE_LOCK
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.WRITE_SETTINGS
- android.permission.USE_CREDENTIALS
- android.permission.VIBRATE
- android.permission.READ_SYNC_SETTINGS
- com.android.launcher.permission.INSTALL_SHORTC
- android.permission.READ_CALL_LOG
- android.permission.READ_SMS
- android.permission.READ_CALENDAR
- android.permission.READ_EXTERNAL_STORAGE
Defines Permissions:
- None
• UID - 앱에 부여된 ID
• GID - 권한 별 ID
• Shared Library - 응용이 사용하는 공유 라이
브러리
• Shared User ID - 패키지명 처럼 식별자로 사
용. 동일 키로 서명된 앱인 경우 공유 User ID
요청 가능
• Uses Permissions: 앱에 허용된 권한 목록
• Defines Permissions: 앱을 사용하기 위해 필
요한 권한
dz> run app.package.info -p android.permission.CAMERA
Package: com.android.gallery
Application Label: 카메라
Process Name: com.android.gallery
Version: 5.1-1737576
Data Directory: /data/data/com.android.gallery
APK Path: /system/app/Gallery/Gallery.apk
UID: 10005
GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007]
Shared Libraries:
Shared User ID: android.media
Uses Permissions:
- android.permission.CAMERA
- android.permission.RECORD_AUDIO
- android.permission.ACCESS_FINE_LOCATION
- android.permission.WAKE_LOCK
- android.permission.SET_WALLPAPER
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.READ_SMS
- android.permission.READ_EXTERNAL_STORAGE
Defines Permissions:
- None
…
Package: com.android.browser
…
Package: com.android.camera
…
DROZER
33
Activity 열거
- dz> run app.activity.info —filter browser
- dz> run app.activity.info -f message
- dz> run app.activity.info -a com.android.browser
dz> run app.activity.info -f message
Package: com.android.contacts
alias.MessageShortcut
Permission:
Target Activity: com.android.contacts.activities.ContactSelectionActivity
Package: com.android.mms
com.android.mms.ui.ComposeMessageActivity
Parent Activity: com.android.mms.ui.ConversationList
Permission:
com.android.mms.ui.ManageSimMessages
Permission:
Package: com.example.android.apis
com.example.android.apis.app.IncomingMessage
Permission:
dz> run app.activity.info -a com.android.browser
Package: com.android.browser
com.android.browser.BrowserActivity
Permission:
com.android.browser.ShortcutActivity
Permission:
com.android.browser.BrowserPreferencesPage
Permission:
com.android.browser.BookmarkSearch
Permission:
com.android.browser.AddBookmarkPage
Permission:
com.android.browser.widget.BookmarkWidgetConfigure
Permission:
안드로이드 보안 구조
ANDROID 아키텍처
리눅스 커널
리눅스 OS
하드웨어 제어, 네트워킹, 파일시스템, 프로세스 관리
일반 리눅스와 다른점
Low Memory Killer, Wakelock, Anonymous shared
memory (ashmem), Paranoid networking, Binder 등
보안 관련해서는 바인더와 네트워킹이 이슈
바인더는 프로세스 간 통신 (like Socket, D-bus, RPC …)
패러노이드 네트워킹은 특정 권한을 가진 앱에게만 네트워
크 소켓 접근을 허용 (호출자 프로세스에 따라 네트워크 접
근 제한)
35
LMK: 메모리 부족 시 앱을 중지시키는 정책 (Linux OOM + 우선순위기반)
wakelock: 백그라운드로 음악을 들을 때. 데이터동기화 중 Sleep 방지
AshMEM: 앱 간 통신을 위한 공유 메모리 (자동 해제)
ANDROID 아키텍처
Native Userspace
Init은 부팅 후 최초 실행 프로세스.
다른 프로세스를 포크 (batch 파일)
SQLite, WebKit, MediaFramework(Stagefright),…
달빅 런타임
자바가상머신 (최근 ART)
자바런타임 라이브러리 jar 파일들
System services
4.4에서는 79개 서비스 (C/C++)
화면 관리, 터치스크린, 전화, 네트워크 연결 등 안드로이
핵심 기능을 구현.
프로세스 간 통신 인터페이스를 제공
Binder를 통해 서비스를 찾고, 연결하고, 호출함
36
ANDROID 아키텍처
IPC
프로세스 간 통신. 프로세스 Isolation
메모리 접근 불가 => 보안과 안정성.
메모리 접근 가능하다면 악성 프로세스가 이메일 클라이언트의
메모리에 접근해서 메일을 유출.
프로세스 간 데이터를 주고 받거나 신호를 보내고 받는 기술
파일, 시그널, 파이프, 세마포어, 공유메모리, 메시지 큐 등은 안
드로이드에서는 거의 지원하지 않음 => 바인더 활용
Binder
COM, CORBA와 유사하나 RPC는 지원하지 않음
/dev/binder
Intent, Messenger, Content Provider가 바인더를 이용해 상
위 수준 프로세스 간 커뮤니케이션을 구현
37
A에서 B 호출: B 프로세스의 메모리에 공간을 할당. A에서 B에 보내
는 데이터를 복사. B 프로세스에게 호출을 알림. B는 자신의 공간에
있는 데이터를 사용. 데이터 사용 완료 알림.
보안) A가 B의 메소드를 호출할 때, A의 PID와 EUID를 커널이 찾아
서 채워 넣음 (허용된 권한 이상의 일을 하지 못함). 권한 상승을 금
지 (sudo).
ANDROID 아키텍처
안드로이드 프레임워크
안드로이드 앱을 만들기위해 필요한 기본 클래스들의 집합
시스템 서비스를 직접 사용하지 않고, 프레임워크를 통해 사
용
e.g. BluetoothManager, ActivityManager,
PacakgeManager, LocationManager, …
앱
시스템 앱
OS 이미지에 포함된 앱. 읽기 전용.
/system 폴더에 있어 제거/변경 안됨. 안전하다고 가정하
며, 사용자 설치 앱보다 더 많은 권한을 가짐.
사용자 설치 앱
/data 폴더에 읽기/쓰기 파티션에 설치됨.
전용 보안 샌드박스에 설치되어 다른 앱에 영향을 주거나 데
이터를 가져올 수 없음.
권한 분리 (Privilege Separation)와 최소 권한 (Principle
of Least Privilege)”의 원칙이 보안 모델의 핵심
38
APP LIFECYCLE
39
foreground & background
=> onPaused, onResume
액티비티가 다른 액티비티를 실행하면, 스택의 맨 위로 올라감
사용자가 뒤로 가기를 누르면, 맨 위의 액티비티가 소멸되고 이전 액티비티 상태로 복귀
ANDROID 아키텍처
앱 컴포넌트
AndroidManifest.xml
컴포넌트 목록, 컴포넌트 진입점 및 메타 데이터 등.
APK 패키지 파일에 포함됨.
패키지명은 com.google.email과 같은 URL.
앱이 설치될 때 파싱되어 패키지와 컴포넌트가 시스템에
등록됨 (개발자 키를 이용해서 앱을 서명하도록 요구됨)
40
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chanjinpark.myapplication" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
apktool: APK는 컴파일된 코드, Decompiler
http://ibotpeaches.github.io/Apktool/install/ 로부터 script와 jar 파일 다운로드
apktool d DeskClock/AndroidManifest.xml
앱은 컴포넌트의 조합으로 개발됨
Activity
화면 윈도우, 앱은 여러 개 Activity를 가질 수 있음
Service
UI 없이 백그라운드 실행 (프로세스 혹은 쓰레드), 파일 다운로드,
음악 재생
AIDL을 사용 다른 서비스 혹은 앱이 호출할 수 있도록 함 (재생 중단)
시스템 서비스는 데몬처럼 항상 실행, 앱 서비스는 요청에 따라 시작
/종료
Broadcast Receiver
시스템 전체에 전달되는 이벤트에 응답하는 컴포넌트로, 앱/서비스
로부터의 브로드캐스트 메시지를 받기위한 Listener 구현
일종의 시스템 수준 intent로, Activity 실행 시킬 수는 없음
배터리 부족, SMS 메시지 도착, 네트워크 연결 상태 변화를 알림 등
Content provider
데이터 제공자. 연락처, 캘린더 등
DB 혹은 파일에 저장된 앱 데이터를 다루는 인터페이스 제공
데이터를 앱과 공유하기 위해 사용.
41
http://designthing.net/the-basic-components-in-an-android-app/
http://developer.android.com/intl/ko/guide/components/index.html
Application
AndroidManifest.xml
Activity
Service
Broadcast Receiver
Content Provider
42
AndroidManifest.xml
Activity
Service
Broadcast Receiver
Content Provider
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.calendar"
android:sharedUserLabel="@string/app_label">
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name=“android.permission.MANAGE_ACCOUNTS"/>
…
<application android:name=“CalendarApplication" …
<activity
android:name=“AllInOneActivity" …
<intent-filter>
<action android:name="android.intent.action.MAIN" /> …
<service android:name=".alerts.AlertService" /> …
<receiver android:name=".alerts.AlertReceiver">
<intent-filter>
<action android:name="android.intent.action.EVENT_REMINDER" /> …
<provider android:name=".CalendarRecentSuggestionsProvider"
android:exported=“false" …
…
</application>
</manifest>
Intent
컴포넌트 간 연동 방식 (인텐트 메시지)
서비스를 실행시켜 일회성 작업을 수행할 때 Intent 사용.
연결되어 작업을 하기 위해서는 해당 서비스에 바인딩
(bindService)
명시적 인텐트는 특정 Activity 혹은 Service를 명시하고 인텐
트를 보냄
암시적 인텐트는 특정 컴포넌트 식별 없이 일반적인 작업을 요
청 (위치 표시 요청 => 맵 기능을 가진 앱이 이를 받아서 처리.
여러 개면 사용자에게 물어봄)
43
1. 인텐트를 만들어 보냄
2. 시스템은 인텐트 필터를 살펴서 액티비티를 실행
3. 액티비티의 onCreate 함수 코드 실행
Google Now의 음성 명령
Alarm Set alarm "set an alarm for 7 am” AlarmClock.ACTION_SET_ALARM
Set timer "set a timer for 5 minutes” AlarmClock.ACTION_SET_TIMER
암시적 인텐트, android.content.Intent.ACTION_SEND, video/*
안드로이드 보안 모델
리눅스 User ID를 앱 식별자로 사용
User ID로 사용자 격리
리눅스 운영체제에서 다른 사용자 파일에 접근 불가
프로세스는 실행한 계정의 UID (GID)에 기반하여 파일에 접근함. 루트 권한 프로세스는 모든 파일에 접근 및 수정 가능
프로세스 간에는 내부 코드 실행 불가 (프로세스 간 통신 메커니즘 사용해서 통신, Binder)
안드로이드는 폰을 위해 설계
단일 사용자를 가정함
리눅스 UID는 앱을 구분하는 용도로 사용함 (앱 격리). 프로세스 수준의 보안 정책 사용 (User ID, Group ID)
44
앱 샌드박스
앱을 설치하면, App ID라는 고유 UID를 자동으로 할당하고
UID로 실행되는 프로세스 내에 앱을 실행시킴.
앱은 자신만이 읽고 쓸 수 있는 전용 디렉터리를 부여 받음
프로세스 수준과 파일 수준에서 샌드 박스 됨.
시스템 데몬과 시스템 앱은 미리 정의됨 고정 UID를 가짐.
극히 일부만 루트 사용자 ID를 가짐 (UID 0)
시스템 UID는 1000번 부터 시작 (AID_SYSTEM)
설치 앱 UID는 10000번 부터 시작 (AID_APP)
시스템 UID는 android_filesystem_config.h에 정의됨
45
Chanjinui-MacBook-Pro:d chanjinpark$ adb shell ps | grep deskclock
u0_a24 2272 968 600720 33980 sys_epoll_ b72e51c5 S com.android.deskclock
Chanjinui-MacBook-Pro:d chanjinpark$ adb shell ls -al /data/data/com.android.deskclock
drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 cache
drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 code_cache
drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 databases
drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 shared_prefs
권한이란?
권한
권한 = 실행 가능한 연산에 대한 문자열
앱 설치 시 권한 지정되고 변경되지 않음
각 앱은 자신의 파일과 공개허용 리소스 만 접근 가능 (my
own & public)
앱 설치 시 기능 사용을 위한 필요한 권한을 요청
하드웨어 장치, 인터넷 연결, 데이터 혹은 OS 서비스
위험한 권한인 경우, 사용자에게 확인 요청함
http://developer.android.com/intl/ko/guide/topics/
security/permissions.html#normal-dangerous
SD 카드 등 물리적 자원, 연락처 등의 공유 데이터에 대한 접
근. 서드 파티 앱에 있는 컴포넌트 실행 및 접근 등
권한 예
패키지명.permission.권한명
REBOOT, BIND_VPN_SERVICE는 내장권한.
GALLERY_PROVIDER,
RECEIVE_LAUNCH_BROADCASTS는 각 앱에 정의된 권한
임
46
root@generic_x86:/data/system # pm list permissions -u
Dangerous and Normal Permissions:
permission:android.permission.ACCESS_WIMAX_STATE
permission:android.permission.RESTART_PACKAGES
permission:android.permission.USE_CREDENTIALS
permission:android.permission.MODIFY_AUDIO_SETTINGS
permission:android.permission.ACCESS_NOTIFICATION_POLICY
permission:android.permission.MANAGE_ACCOUNTS
permission:android.permission.NFC
permission:android.permission.PERSISTENT_ACTIVITY
permission:android.permission.WRITE_SYNC_SETTINGS
permission:android.permission.RECEIVE_BOOT_COMPLETED
permission:android.permission.SUBSCRIBED_FEEDS_READ
permission:android.permission.SET_TIME_ZONE
permission:android.permission.EXPAND_STATUS_BAR
permission:com.android.launcher.permission.UNINSTALL_SHORTCU
T
permission:android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZ
ATIONS
permission:android.permission.READ_PROFILE
permission:android.permission.BLUETOOTH
…
설치 시 필요 권한 요청
권한 요청
앱은 AndroidManifest.xml 파일에 필요한 권한을 지정.
앱은 하나 이상의 <uses-permission> 태그를 추가해서 권한
을 요청
앱 설치 시에 앱 요구 권한을 검사. 사용자가 허용할 지 말 지를
결정
일단 허용되면 취소 불가. 앱은 추가 확인 없이 행사.
하지만, 개인 키 및 사용자 계정에 접근하는 기능을 요청하면
앱에 권한을 주었다고 할 지라도 접근 시 마다 사용자 확인을
거쳐야 함.
47
시스템의 권한 관리 (패키지 매니저)
권한 관리
앱 설치 시 시스템 패키지 매니저 서비스가 권한을 부여함
패키지 매니저
모든 패키지의 설치 경로, 버전, 서명 인증서, 할당된 권한 DB 관리.
/data/system/packages.xml 파일에 저장됨.
앱 설치/갱신/제거 시 마다 업데이트
com.google.android.apps.translate
UID - 앱의 ID, 10204
서명인증서 (certification)
앱의 요청 권한
48
<package name="com.example.chanjinpark.myapplication" codePath="/data/app/
com.example.chanjinpark.myapplication-1" nativeLibraryPath="/data/app/
com.example.chanjinpark.myapplication-1/lib" publicFlags="940097092"
privateFlags="0" ft="1510ed4ecb0" it="1510ed4fea1" ut="1510ed4fea1" version="1"
userId="10062">
<sigs count="1">
<cert index="6" key=“308203773082025fa0…” />
</sigs>
<perms>
<item name="android.permission.INTERNET" granted="true" flags="0" />
<item name="android.permission.CAMERA" granted="true" flags="0" />
</perms>
<proper-signing-keyset identifier="12" />
</package>
권한의 보호 수준, PROTECTION LEVEL
권한 보호 수준
권한에 따른 잠재적 위험을 명백히 나타내고 시스템이 권
한 허용 여부를 판단할 때 따라야하는 절차
4가지 보호 수준
normal: 위험이 적은 권한 요청에 대해. 사용자의 동의없
이 자동으로 권한 부여.
ACCESS_NETWORK_STATE, GET_ACCOUNT (계정 목
록을 읽음)
dangerous: 사용자 데이터 접근 혹은 일부 디바이스 제어
가능 권한 요청
설치 시 요청된 권한에 대해 확인 창으로 사용자 승인 받음
READ_SMS, CAMERA, …
signature: 권한을 선언한 앱과 동일 키로 서명된 앱에만
부여. 가장 강력한 보호 수준.
앱/플랫폼 개발자만 갖고 있는 암호 키 필요.
NET_ADMIN, ACCESS_ALL_EXTERNAL_STORAGE.
signatureOrSystem: 동일 키 signature 체크 없이 시스
템 디렉터리에 설치된 앱은 권한 부여
49
<permission android:name="android.permission.INTERNET"
android:description="@string/permdesc_createNetworkSockets"
android:label="@string/permlab_createNetworkSockets"
android:protectionLevel="normal" />
<permission android:name="android.permission.CAMERA"
android:permissionGroup="android.permission-group.CAMERA"
android:label="@string/permlab_camera"
android:description="@string/permdesc_camera"
android:protectionLevel="dangerous" />
<permission android:name="android.permission.REBOOT"
android:protectionLevel="signature|privileged" />
<permission
android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
android:protectionLevel="signature" />
/system/framework/framework-res.apk 내의
AndroidManifest.xml 파일
권한으로 보호하기
액티비티 및 서비스 권한
액티비티와 서비스는 사용자 권한으로 보호
START_MY_ACTIVITY
USE_MY_SERVICE
다른 앱에서 액티비티 및 서비스 사용 시 권한 요청이 필요
<uses-permission>
브로드캐스트 권한
수신자 및 발신자 모두 권한 지정 가능
발신자는 등록된 모든 앱에게 전송 혹은 수신자 권한으로
필터링 가능
수신자는 발신자가 가져야 하는 권한을 지정하여 브로드캐
스트에 등록
50
패키지 관리
앱 패키지 구성
APK: 앱 코드 및 리소스, 매니페스트 파일을 포함하는 컨
테이너
코드 서명
APK 서명 인증서
서드파티 프로그램을 실행하기 전에 이 프로그램이 개발
자 릴리스 후 변경되지 않았는 지 (무결성), 실제 그 생성
자에 의해 만들어졌는 지 확인이 필요 (Authenticity).
디지털 서명 체계: 서명 키를 소유한 개체만 정당한 코드
서명을 생성할 수 있도록 보장
서명검증절차
코드가 변경되지 않았는지, 서명이 올바른 키로 생성되
었는 지 확인
코드 서명자를 믿을 수 있는 지가 중요. 코드 서명자는 디
지털 서명서를 가지고 있고, 코드에 이를 첨부해야.
51
META-INF
* MANIFEST.MF : 파일 목록
* CERT.RSA : 앱 서명
* CERT.SF : 리소스 목록과 Manifest.MF 파일의 SHA-1 다이제스트
앱 서명
코드 서명과 플랫폼 키
모든 앱이 설치되기 위해서는 디지털 서명이 필요
App Signing
앱 저작자임을 증명하는 인증서가 필요
공증할 수도 있으나, 개발자 서명으로도 가능 (개발자는 인
증서의 Private Key를 관리해야 함)
동일 개발자만 앱을 업데이트할 수 있게 함
현재 설치된 대상 앱의 서명 인증서와 업데이트할 앱의 인
증서를 비교.
동일 개발자가 다른 앱을 작성해서 기존 앱과 연동할 때 앱
간 신뢰 관계를 설정
시스템 앱은 여러 플랫폼 키로 서명됨
동일 키로 서명된 시스템 컴포넌트 끼리는 리소스를 공유하
고 같은 프로세스 안에서 실행됨.
키는 제조사, 통신사, 구글 등 안드로이드 버전을 유지하는
사람이 생성, 관리
52
APK 설치
APK 설치 경로
구글 플레이 스토어에서 앱설치 (혹은 사설 앱 스토어)
폰으로 다운로드한 앱 파일을 열어 디바이스에 직접 설치
USB를 통해 adb install 명령으로 설치
안드로이드 쉘을 이용해 APK 파일을 시스템 앱 디렉터리
에 바로 복사
패키지 설치 관리
APK 파일을 앱 디렉터리에 직접 복사하면 패키지 매니저
가 탐지해서 설치함 (앱 디렉터리의 변경을 알림 받음)
installPackage 메소드를 호출. APK를 앱 디렉터리에 복
사/설치
시스템 앱과 사용자 설치 앱은 위치가 다름. 시스템 앱은
변경/제거 불가
53
실선은 함수호출, 점선은 컴포넌트에서 사용하는 파일/디렉터리 접근
알 수 없는 출처의 앱 설치 (Side Loading)
구글 Play 외 다른 출처로부터 앱 설치
보안 상의 이유로 Disabled (디폴트) - 멀웨어 설치 방지
설정 앱에서 보안/알수없는출처를 Enable
54
Unkown sources
Allow installation of apps from unknown sources
Android 시큐어 코딩
ANDROID SECURE CODING STANDARD & GUIDE
56
일본 스마트폰 보안 포럼,
Japan Smartphone Security Forum
http://www.jssec.org/dl/
android_securecoding_en.pdf
Android-JAVA 시큐어 코딩가이드
http://www.securitya.kr/eduwiz/bb/bbs/
board.php?bo_table=c403&wr_id=12
안드로이드 보안 팁 (구글)
http://developer.android.com/intl/ko/training/
articles/security-tips.html
Android Security and Secure Coding Techniques
(동영상)
https://www.youtube.com/playlist?
list=PLyUlngzGzkzsXHItNSx_KPyC62hsrAgrK
미국, SEI CERT Division
https://www.securecoding.cert.org/
confluence/display/android/Android+Secure
+Coding+Standard
Android Secure Coding (발표자료)
http://www.slideshare.net/jpcert_securecoding/
all-for-attendee
CONTENT PROVIDER
다른 앱과의 데이터 공유 시 사용
내부적으로 사용 가능- 검색, 복사/붙여넣기 등
다른 앱의 데이터를 읽고, 쓰기 위해서는 권한이 필요
예를 들어, 주소록, 일정, 이미지 등
주소록에 대해, URI, 데이터필드 이름 및 타입이 필요
ContactsContract.Contacts.CONTENT_URI
ContactsContract.Contacts.DISPLAY_NAME
String
57
콘텐트 제공자의 권한 설정 - Contacts 예
READ_CONTACTS 권한가진 앱은 query만,
WRITE_CONTACTS을 가지면, insert, update, delete 가능
* 주소록의 모든 사진을 검색하려면 GLOBAL_SEARCH 권한을 가져야함
CONTENT PROVIDER
58
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI; //
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
+ Calendars.ACCOUNT_TYPE + " = ?) AND ("
+ Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"sampleuser@gmail.com", “com.google",
"sampleuser@gmail.com"};
// Submit the query and get a Cursor object back.
Cursor cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);
App BApp A
Content
Provider
Activity
Database (SQLite),
Files, XML, …
Activity
ContentResolver
& Cursor
URIQuery
Insert
Update
Deleate
URI
content://com.android.calendar/calendars
Schema + Authority + Path
Path는 테이블의 이름
SELECT (
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"...>
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
...
캘린더 데이터 접근을 위한 권한 설정
<application android:process="com.android.calendar"
android:label="@string/calendar_storage"
android:icon="@drawable/app_icon">
…
<provider android:name="CalendarProvider" android:authorities="calendar"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="android.permission.READ_CALENDAR"
android:writePermission="android.permission.WRITE_CALENDAR" />
CONTENT PROVIDER
앱의 콘텐트 제공자 접근성을 제한
DRD01-X. Limit the accessibility of an
app's sensitive content provider
콘텐트 제공자는 데이터를 다른 앱과 공유
하기 위한 방법
중요 정보에 대한 접근 권한을 잘 통제해야
콘텐트 제공자 접근 통제: Public, Private,
Restricted access
MovatwiTouch
트위터 클라이언트 앱. 사용자 키, 액세스
토큰을 콘텐트 제공자로 구현. Public으로
구현하여 사용자 정보를 노출시킴
android:exported 속성을 지정하지 않으
면, Android SDK Level 16 (젤리빈 4.1) 까
지 Public으로 간주
59
<provider android:exported="true" android:name="MyContentProvider"
android:authorities="com.example.mycontentprovider" />
<provider android:exported="false" android:name="MyContentProvider"
android:authorities="com.example.mycontentprovider" />
export를 false로 하면 앱 내부에서만 사용. 꼭 필요한 경우에 exported
// extract account data through content provider
Uri uri = Uri.parse("content://jp.co.vulnerable.accountprovider");
Cursor cur = getContentResolver().query(uri, null, null, null, null);
StringBuilder sb = new StringBuilder();
if (cur != null) {
int ri = 0;
while (cur.moveToNext()) {
++ri;
Log.i(TAG, String.format("row[%d]:", ri));
sb.setLength(0);
for (int i = 0; i < cur.getColumnCount(); ++i) {
String column = cur.getColumnName(i);
String value = cur.getString(i);
if (value != null) { value = value.replaceAll("[rn]", "");}
Log.i(TAG, String.format("t%s:t%s", column, value));
}
}
} else {
Log.i(TAG, "Can't get the app information.");
}
<provider android:name=".content.AccountProvider"
android:authorities="jp.co.vulnerable.accountprovider" />
android:exported의 디폴트 값은 true (젤리빈까지, 4.1)
CONTENT PROVIDER
콘텐트 제공자가 받는 URL 경로는 정식
표현인 지 체크
DRD08-J. Always canonicalize a URL
received by a content provider
콘텐트 제공자는 디렉토리 탐색 취약점을
가질 수 있음
파일 경로 체크해서 정해진 디렉터리를 벗
어난 파일 접근을 차단해야 함
GREE (jp.gree.android.app)
Mobile social gaming app
앱 Private 파일 공개 위험
60
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();
public ParcelFileDescriptor openFile(Uri paramUri, String paramString)
throws FileNotFoundException {
File file = new File(IMAGE_DIRECTORY, paramUri.getLastPathSegment());
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}
// getLastPathSegment 구현 로직
while ((current = path.indexOf('/', previous)) > -1) {
if (previous < current) {
String decodedSegment = decode(path.substring(previous, current));
segmentBuilder.add(decodedSegment);
}
previous = current + 1;
}
콘텐트 제공자 구현 상의 문제 (openFile)
../../../data/data/com.example.android.app/shared_prefs/Example.xml
상대경로를 통한 앱 Private 데이터 탐색
경로가 URL 인코딩되어 있으면, %2F가 /를 의미함. getLastPathSegment는 파일 명 파악 불가
..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml
CONTENT PROVIDER
61
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();
public ParcelFileDescriptor openFile(Uri paramUri, String paramString)
throws FileNotFoundException {
File file = new File(IMAGE_DIRECTORY, Uri.parse(paramUri.getLastPathSegment()).getLastPathSegment());
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}
그러면, Uri.parse를 통해 URL 디코딩하고 파일 명 찾으면?
더블 인코딩해서 위 두 번 getLastPathSegment하는 것을 무력화할 수 있음. 두 번 URL decoding해야 원래 문자열을 구함
%252E%252E%252F%252E%252E%252F%252E%252E%252Fdata%252Fdata%252Fcom.example.android.app%252Fshared_prefs%252FExample.xml
..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml
../../../data/data/com.example.android.app/shared_prefs/Example.xml
private static String IMAGE_DIRECTORY = localFile.getAbsolutePath();
public ParcelFileDescriptor openFile(Uri paramUri, String paramString)
throws FileNotFoundException {
String decodedUriString = Uri.decode(paramUri.toString());
File file = new File(IMAGE_DIRECTORY, Uri.parse(decodedUriString).getLastPathSegment());
if (file.getCanonicalPath().indexOf(localFile.getCanonicalPath()) != 0) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}
getCanonicalPath를 사용하여 잘못된 사용을 걸러내야 함 (URL 인코딩된 문자열은 잘못된 인자 예외를 발생 시켜 배제)
Canonical Path는 경로에 대한 정식표현이고, getCanonicalPath 함수는 .. 이나 . 과 같은 상대 경로 표현 제거하고 절대 경로를 표시
디렉터리를 비교해서 IMGAGE_DIRECTORY 외에 다른 디렉터리 참조를 방지
ACTIVITY
중요 액티비티에 대한 접근 제한
DRD09. Restrict access to sensitive
activities
인텐트 필터를 정의하면, 다른 앱에 액티비티
가 노출됨
액티비티의 외부 앱 노출에 대한 디폴트 값은
인텐트 필터를 가지고 있는가에 따라 다름
62
<activity android:configChanges="keyboard|keyboardHidden|orientation"
android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/
Vulnerable.Dialog" android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter android:icon="@drawable/yfrog_icon"
android:label="@string/YFROG">
<action android:name="jp.co.vulnerable.ACTION_UPLOAD" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
</activity>
액티비티에 대한 전체 이름은 jp.co.vulnerable.media.yfrog.YfrogUploadDialog.
인텐트 필터가 정의되었으므로, 이 액티비티는 다른 앱에 노출됨
사진 업로드 액티비티는 원래 앱 내부에서 사용하기 위해 설계 됨
이 액티비티가 외부 앱에 노출됨에 따라, 경로가 파악되거나 만들어진 사진을 악의적
으로 업로드 할 수 있게됨
ACTIVITY
Activity exported를 false로 하거나, 액티
비시 실행 요청자에 대한 동적 체크
Twicca 앱 (0.70 ~ 0.9.30)
액티비티를 실행 시켜, SD 카드나 네트워크
에 접근 권한이 없는 앱이 SD 카드 상의 이
미지나 동영상을 Twicca 사용자의 트윗 계
정으로 소셜 네트워킹 서비스에 올릴 수 있
게 함.
63
<activity android:configChanges="keyboard|keyboardHidden|orientation"
android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/
VulnerableTheme.Dialog" android:windowSoftInputMode="stateAlwaysHidden"
android:exported="false">
</activity>
exported = “false” 로 설정
public void onCreate(Bundle arg5) {
super.onCreate(arg5);
...
ComponentName v0 = this.getCallingActivity();
if(v0 == null) { this.finish(); }
else if(!jp.r246.twicca.equals(v0.getPackageName())) { this.finish();}
else {
this.a = this.getIntent().getData();
if(this.a == null) { this.finish(); }
...
}
}
}
호출 시 동일 패키지 (앱)에서 호출되었는 지를 체크
FILE I/O AND LOGGING
중요 정보를 외부 저장소에 두면 안됨
DRD00. Do not store sensitive
information on external storage (SD
card) unless encrypted first
외부 저장소에 저장된 파일은 World
Readabble (4.1 까지)
친구 정보, IMEI (Int. Mobile Equipment
Id.)를 sdcard에 저장한 사례
64
private String filename = "myfile"
private String string = "sensitive data such as credit card number"
FileOutputStream fos = null;
try {
file file = new File(getExternalFilesDir(TARGET_TYPE), filename);
fos = new FileOutputStream(file, false);
fos.write(string.getBytes());
} catch (FileNotFoundException e) {
// handle FileNotFoundException
} catch (IOException e) {
// handle IOException
} finally {
if (fos != null) {
try { fos.close(); } catch (IOException e) { }
}
}
외부 저장소에 파일을 생성
4.1 버전 이 후부터 다른 앱이 읽고/쓰지 못
하도록 파일 모드 및 UID 적용
하지만, PC에서 읽거나, 빼서 Mount할 수
있음
#1: 파일을 내부 저장소에 저장
Context.MODE_PRIVATE으로 파일 새성
MODE_PRIVATE
MODE_WORLD_READABLE
MODE_WORLD_WRITABLE
#2: 암호화할 것
65
private String filename = "myfile"
private String string = "sensitive data such as credit card number"
FileOutputStream fos = null;
try {
fos = openFileOutput(filename, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
} catch (FileNotFoundException e) {
// handle FileNotFoundException
} catch (IOException e) {
// handle IOException
} finally {
if (fos != null) {
try { fos.close(); } catch (IOException e) { }
}
}
앱 Private 저장소에 파일을 생성
FILE I/O AND LOGGING
중요 정보는 로그로 남기면 안됨
DRD04-J. Do not log sensitive
information
앱에서 로그를 남길 수 있음.
android.util.Log 클래스.
Log.d (Debug)
Log.e (Error)
Log.i (Info)
Log.v (Verbose)
Log.w (Warn)
로그 정보는 공유 자원으로 다른 앱에서 읽
을 수 있음
66
Log.v("method", Login.TAG + ", account=" + str1);
Log.v("method", Login.TAG + ", password=" + str2); • 디버깅 목적으로 로깅 사용 (계정 정보를 로그로 남김)
• 릴리스 (배포)된 앱에서 디버깅 코드를 제거하지 않음
• READ_LOGS 권한을 가진 앱은 로그 결과를 볼 수 있음
<uses-permission android:name="android.permission.READ_LOGS"/>
로그 읽기를 위한 권한 요청 (READ_LOGS)
Process mProc = Runtime.getRuntime().exec(
new String[]{"logcat", "-d", "method:V *:S$Bc`W^(B)"});
BufferedReader mReader = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
앱에서 logcat 실행
어느 앱이라도 권한을 가지면 로그를 읽을 수 있음
중요 정보는 로그로 남기면 안됨
안드로이드 4.0까지 READ_LOGS 권한을
가진 앱은 로그 정보 알수 있었으나, 4.1부
터는 다른 앱의 로그는 볼 수 없게 수정됨
하지만, PC 연결 시 로그 정보 읽기 가능
67
Log.d("Facebook-authorize", "Login Success! access_token="
+ getAccessToken() + " expires="
+ getAccessExpires());
Facebook SDK 액세스 토큰, 2012.4
I/MyWeatherReport( 6483): Re-use MyWeatherReport data
I/ ( 6483): GET JSON: http://example.com/smart/repo_piece.cgi?
arc=0&lat=26.209026&lon=127.650803&rad=50&dir=-999&lim=52&category=1000
위치정보 노출 (Weathernews Touch 앱)
중요 정보 로그 누출 취약점 예
StringBuilder slog = new StringBuilder();
Process mLogcatProc = Runtime.getRuntime().exec(new String[]
{"logcat", "-d", "LoginAsyncTask:I APIClient:I method:V *:S" });
BufferedReader reader = new BufferedReader(new InputStreamReader(
mLogcatProc.getInputStream()));
String line;
String separator = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
slog.append(line);
slog.append(separator);
}
Toast.makeText(this, "Obtained log information", Toast.LENGTH_SHORT).show();
TextView tView = (TextView) findViewById(R.id.logView);
tView.setText(slog);
로그 읽어서 토스트로 보여주는 예
INTENT
암시적 인텐트로 중요정보를 브로드캐스
트하면 안됨
DRD03-J. Do not broadcast sensitive
information using an implicit intent
어떤 앱이라도, 브로드캐스트 정보를 알수
있으므로, 중요 정보인 경우 수신자를 제한
할 필요. NHN Japan Corporation, LINE
68
public class ServerService extends Service {
// ...
private void d() {
// ...
Intent v1 = new Intent();
v1.setAction("com.sample.action.server_running");
v1.putExtra("local_ip", v0.h); v1.putExtra("port", v0.i);
v1.putExtra("code", v0.g); v1.putExtra("connected", v0.s);
v1.putExtra("pwd_predefined", v0.r);
if (!TextUtils.isEmpty(v0.t)) { v1.putExtra("connected_usr", v0.t); }
this.sendBroadcast(v1);
}
}
인텐트를 만들어 브로드캐스트하는 예 (com.sample.action.server_running 작업)
final class MyReceiver extends BroadcastReceiver {
public final void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction() != null) {
String s = intent.getAction();
if (s.equals("com.sample.action.server_running") {
String ip = intent.getStringExtra("local_ip");
String pwd = intent.getStringExtra("code");
String port = intent.getIntExtra("port", 8888);
boolean status = intent.getBooleanExtra("connected", false);
}
}
}
}
브로드캐스트된 인텐트를 받아서 처리 (manifest.xml 파일에 receiver 등록)
INTENT
중요정보가 포함된 인텐트는 암시적 인
텐트를 사용하면 안됨
명시적 인텐트 혹은 권한으로 통제
동일 앱 내에서만 브로드캐스트 할 경우,
LocalBroadcastManager를 사용.
69
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
암시적 인텐트 예 (ACTION_SEND를 receive하는 모든 앱에 전달)
// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
명시적 인텐트 예 (클래스 명 혹은 activity/service 명을 지정)
intent.setComponent(
new ComponentName("packagename","fullyqualifiedactivityname"));
Intent intent = new Intent("my-sensitive-event");
intent.putExtra("event", "this is a test event");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
LocalBroadcastManager를 사용하여 앱 내부에서만 수신하도록 함
WEBVIEW
웹뷰의 로컬 파일 접근을 제한
DRD02-J. Do not allow WebView to access
sensitive local resource through file scheme
웹뷰는 웹페이지를 앱의 액티비티 내에 보여줌
보안 취약점은 setJavaScriptEnabled(),
setPluginState(), and setAllowFileAccess()
메소드와 관련
webview.getWebSettings().setJavaScriptEna
bled(true) - JavaScript 허용
setPluginState(ON) - 플러그인 허용
setAllowFileAccess() - 파일 접근 허용
액티비티가 WebView를 내장하면, 다른 앱이
URI를 가진 Intent를 보내서 웹 페이지를 제어 가
능함.
로컬 파일을 통해 중요 정보가 로드되지 않도록
해야 함
70
webView.loadUrl(turl)을 수행할 때, 다른 앱에서 전달된 turl 문자열을 체크없이 사용하면,
악성 HTML을 로드할 수 있음.
특히, 디바이스 로컬 파일을 웹뷰로 실행시킬 수 있음. HTML은 JavaScript 코드를 포함하여 내부
데이터를 다른 사이트로 전달할 수 있음
https://developer.chrome.com/multidevice/webview/gettingstarted
71
// 악성 웹 페이지를 로컬 스토리지에 준비해두었다가, 다음 코드를 통해
// 인텐트를 보냄. JavaScript가 Enabled되어 있으면, 악성 코드 실행 가능
String pkg = "jp.vulnerable.android.app";
String cls = pkg + ".DummyLauncherActivity";
String uri = "file:///[crafted HTML file]";
Intent intent = new Intent();
intent.setClassName(pkg, cls);
intent.putExtra("URL", uri);
this.startActivity(intent);
public class MyBrowser extends Activity {
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webview);
// turn on javascript
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
String turl = getIntent().getStringExtra("URL");
webView.loadUrl(turl);
}
}
별도 체크 없이 인자 turl을 로드
String intentUrl = getIntent().getStringExtra(“URL");
String localUrl = "about:blank";
if (!intentUrl.startsWith("file:")) {
loadUrl = intentUrl;
}
file:로 시작하는 url은 로드하지 않도록 (http: 등 외부 사이트만 로드)
배포
앱 배포 시 디버그 모드인 지 체크
DRD10-X. Do not release apps that are
debuggable
AndroidManifest.xml 파일 상에
android:debuggable 속성을 true로 해놓
으면, 개발 시 디버깅에 도움이 되지만, 릴
리스 시에는 false로 바꾸어야 함
개발 시 디버깅 모드에서는 true로 자동 설
정. 릴리스 모드로 빌드하면 false가 됨. 외
부 릴리스 시 체크할 필요
72
$ adb shell
shell@android:/ $ run-as com.example.someapp sh
shell@android:/data/data/com.example.someapp $ id
uid=10060(app_60) gid=10060(app_60)
shell@android:/data/data/com.example.someapp $ ls files/
secret_data.txt
shell@android:/data/data/com.example.someapp $ cat files/secret_data.txt
password=GoogolPlex
account_number=31974286
디버그 모드로 배포된 앱은 다른 모든 앱이 중요 데이터에 대한 접근이 가능
.
android:debuggable="false"
LOCATION
위치 추적 정보 공유는 사용자 동의를 받아야 함
DRD15-J. Consider privacy concerns when using
Geolocation API
W3C GeoLocation API는 웹 브라우저가 기기의 지리위
치 정보를 사용할 수 있게함
지리 위치 정보 전송 시 별도의 사용자로부터 권한 동의를
받아야 함
WebView를 사용하는 앱에서 지리 위치 정보 사용을 위
한 필요 권한 및 관련 패키지
permissions
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission.INTERNET
webkit package
WebSettings#setGeolocationEnabled(true)
WebChromeClient#onGeolocationPermissionsShowPrompt()
73
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback){
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
지리 위치 정보를 얻기 위해서는 다음을 구현해야 함 (WebChromeClient 메소드)
사용자 동의 없이 지리 위치 정보를 사용
origin: 허락(동의) 요청자
true: GeoLocation 정보 사용이 허락되었음을 의미
false: 이 허락 (동의)이 다음 요청에도 유효한 지 여부를 의미
<script>
navigator.geolocation.getCurrentPosition(
function(position) {
alert(position.coords.latitude);
alert(position.coords.longitude);
},
function(){
// error handler code
}
);
</script>
웹 뷰에서 폰으로부터 지리위치 정보를 얻는 코드
getCurrentPosition(showLocation, ErrorHandler, options);
LOCATION
WebChromeClient#onGeolocationPer
missionsShowPrompt() 메소드를 구현
할 때 보안 사항
사용자에게 지리 위치 정보를 알리는 메소
드이며, 악의적으로 구현되면, 사용자 동의
없이 서버로 전송될 수 있음
74
public void onGeolocationPermissionsShowPrompt(String origin,
GeolocationPermissions$Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
if(MyPreferences.getBoolean("SECURITY_ENABLE_GEOLOCATION_INFORMATION",
true)) {
WebViewHolder.a(this.a).permissionShowPrompt(origin, callback);
}
else {
callback.invoke(origin, false, false);
}
}
먼저, 지리위치정보 공유 설정을 체크하고, 사용자 동의를 구함
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
// Ask for user's permission
// When the user disallows, do not send the geolocation information
}
사용자 동의를 받는 코드를 구현한 뒤에 지리 위치 정보 공유 허용
webView App
navigator.geolocation
.getCurrentPosition
(showLocation)
Chrome
onGeolocationPermissionsShowPrompt
사용자 동의
showLocation
INPUT VALIDATION AND DATA SANITIZATION
상대 디렉터리 경로 조작
외부에서 입력된 경로에 관련된 문자열을
취급할 때, 예상하지 않은 경로 접근이 되지
않도록 함
name에 ../../../rootFile.txt 와 같은 값이
사용되면 문제를 일으킬 수 있음
물론, 앱 샌드 박스 원칙에 따라 다른 앱의
파일에 영향 주지 않지만, 앱 내 데이터를
잘못 지울 수 있고, 시스템 공유 파일의 경
우에도 영향 받을 수 있음
name이 파일의 이름만 나타낼 수 있도록
/, , &, . 와 같은 경로 문자를 제거
75
......
public void f(Properties request) {
......
String name = request.getProperty("filename");
if(name != null){
File file = new File("/usr/local/tmp/" + name);
file.delete();
}
......
}
filename에 해당하는 문자열을 체크하지 않음
......
public void f(Properties request) {
......
String name = request.getProperty("user");
if ( name != && !"".equals(name) ) {
  name = name.replaceAll("/", "");
  name = name.replaceAll("", "");
  name = name.replaceAll(".", "");
  name = name.replaceAll("&", "");
 name = name + "-report";
 File file = new File("/usr/local/tmp/" + name);
 if (file != ) file.delete();
 }
 ......
}
filename 문자열에 경로 탐색 문자를 지움
INPUT VALIDATION AND DATA SANITIZATION
절대 디렉터리 경로 조작
외부 입력 혹은 파일로부터 경로를 입력 받
을 때, 절대 경로를 사용하면 취약
앱의 내부 구조를 노출 시킬 수 있음
외부 저장소에 저장된 inputFile은 외부에
누출될 수 있음
잘못된 파일을 변경/삭제할 수 있음
76


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(
android.os.Environment.getExternalStorageDirectory(), "inputFile");
try {
InputStream is = new FileInputStream(file);
Properties props = new Properties();
props.load(is);
String name = props.getProperty("filename"); 

file = new File(name); 

file.delete(); 

is.close(); 

} catch (IOException e) { Log.w("Error", "", e); } 

} 

외부 저장소에 있는 “inputFile”로부터 filename에 해당하는 문자열을 읽어 파일을 삭제
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(
android.os.Environment.getExternalStorageDirectory(), "inputFile");
try {
InputStream is = new FileInputStream(file); 

Properties props = new Properties(); 

props.load(is); 

  String name = props.getProperty(“filename");
String tmpdir = … // e.g. ”/usr/local/tmp/“

if (name.indexOf("/") < 0) { 

  file = new File(tmpdir + name);

file.delete(); 

} 

is.close(); 

 } catch (IOException e) { Log.w("Error", "", e); }
}
외부 저장소에 있는 “inputFile” 상의 filename은 경로가 없는 파일 이름만 저장
INPUT VALIDATION AND DATA SANITIZATION
매개변수 미검사
null이 입력으로 오게 되면 Java에서는 예
외 (Exception)를 발생 시킴. 예외 처리를
하지 않으면 앱이 종료됨
앱 실행을 중지시킬 수 있음
공격자는 예외를 발생시켜 보안 로직을 건
너뛰거나 앱이 디버깅 정보를 로그로 남기
기를 기대할 수 있음
77
public void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 

} 

public boolean equals(Object object) { 

return (toString().equals(object.toString())); 

} 

인자로 null이 오게되면, NullPointerException이 발생할 수 있음
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}

public boolean equals(Object object) {
if(object != null )

return (toString().equals(object.toString()));
else
return false;
}
null 체크 필요
INPUT VALIDATION AND DATA SANITIZATION
Input validation
입력 검증의 미비가 안드로이드에서의 가장
일반적인 보안 문제
버퍼 오버플로우, 널 포인터, 코드 인젝션 등
활용 가능한 정규 식 패턴들
DOMAIN_NAME: 도메인 이름을 체크
EMAIL_ADDRESS: 이메일 주소 체크
IP_ADDRESS: IP 주소 체크
PHONE: 폰 번호 체크
78
<EditText
android:id="@+id/EditTextTelephone"
android:hint="@string/telephone"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="phone">
</EditText>
public void isEmail(EditText et) {
if (et.getText()== null) return false;
else return
Patterns.EMAIL_ADDRESS.matcher(et.getText().toString()).matches();
}
SQL INJECTION
SQL injection
가장 위험하고 일반적인 코드 인젝션이 부
적절한 권한을 가진 SQL 질의를 통해 데이
터베이스를 사용하는 것
공격자는 사용자 이름 대신에 다음 문자열
을 입력할 수 있음 (EditText)
'' OR ‘1'='1'
"SELECT * FROM users WHERE
username = 'admin' AND password =
'' OR '1' = ‘1'"
공격에 대한 최상의 방어는 인자화된 질의
를 사용하는 것
query(Uri uri, String[] projection,
String selection, String[]
selectionArgs, String sortOrder)
79
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();
String query =
"SELECT * FROM users WHERE username = '" + username + "' AND
password = '" + password +"'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.rawQuery(query, );
if (c.getCount!=0) return true;
사용자 입력을 그대로 사용하게되면, SQL 쿼리문이 악용될 수 있음
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();
String tableName = "USERS";
String [] projection = {"username", "password"}
String selection = "username=? AND password=?";
String [] selectionArgs = { username, password};
SQLiteDatabase db = this.getWritableDatabase();
Cursor c = db.query(tableName, projection, selection, selectionArgs,
null);
if (c.getCount!=0) return true;
인자화된 쿼리문을 사용
80Bill Karwin, www.slideshare.net/billkarwin
SELECT * FROM Bugs

WHERE bug_id = $_GET[‘bugid’]
SELECT * FROM Bugs

WHERE bug_id = ?
사용자 데이터 및 신용 정보 보호
개인 정보 보호 가이드
사용자 데이터 접근, 저장, 전송은 불가피한 경우여야 한다
데이터를 그대로 쓰지말고 해시를 하거나 원복 불가능한 형태로 사용하라
다른 앱에 노출시키면 안됨. IPC를 최대한 엄격하게 사용.
중요 정보 접근 API 사용을 줄여라
써드 파티 컴포넌트에 주는 데이터가 무엇을 위한 것인 지 명확하게 이해해야 함.
사용자에 신용정보 요구하는 횟수를 제한해야. 피싱 공격에 대해 관대해질 수 있음
로그 데이터는 안드로이드에서 공유 자원이다. 다른 앱이 볼 수 있다. 로그되는 정보를 확인해야
서버로의 불필요한 정보의 전송을 줄여라.
이름/암호 인증을 쓰고자 하면, 폰에 이 정보를 저장하지 않도록 하라. 꼭 필요하다면, 암호화해야 한다
81
실습
apk 가져오기, adb pull
adb pull /system/app/DeskClock
83
$ adb shell ls -al /system/app
drwxr-xr-x root root 2015-02-15 01:51 BasicDreams
drwxr-xr-x root root 2015-02-15 01:53 Browser
drwxr-xr-x root root 2015-02-15 01:52 Calculator
drwxr-xr-x root root 2015-02-15 01:53 Calendar
drwxr-xr-x root root 2015-02-15 01:51 CaptivePortalLogin
drwxr-xr-x root root 2015-02-15 01:51 CertInstaller
drwxr-xr-x root root 2015-02-15 01:51 CustomLocale
…
$ unzip Contacts.apk -d Contacts
Archive: Contacts.apk
extracting: Contacts/res/drawable-hdpi-v4/ab_solid_custom_blue_inverse_holo.9.png
extracting: Contacts/res/drawable-hdpi-v4/ab_stacked_solid_inverse_holo.9.png
extracting: Contacts/res/drawable-hdpi-v4/aggregation_suggestions_bg.9.png
…
$ adb pull /system/priv-app/Contacts
pull: building file list...
pull: /system/priv-app/Contacts/x86/Contacts.odex -> ./x86/Contacts.odex
pull: /system/priv-app/Contacts/Contacts.apk -> ./Contacts.apk
2 files pulled. 0 files skipped.
207 KB/s (6990561 bytes in 32.943s)
$ ls -al Contacts
total 2336
drwxr-xr-x 7 chanjinpark staff 238 11 21 14:28 .
drwxr-xr-x 35 chanjinpark staff 1190 11 21 14:28 ..
-rw-r--r-- 1 chanjinpark staff 29516 7 23 2008 AndroidManifest.xml
drwxr-xr-x 5 chanjinpark staff 170 11 21 14:28 META-INF
drwxr-xr-x 3 chanjinpark staff 102 11 21 14:28 com
drwxr-xr-x 32 chanjinpark staff 1088 11 21 14:28 res
-rw-r--r-- 1 chanjinpark staff 1159740 7 23 2008 resources.arsc
apk 디컴파일, apktool
apktool: APK는 컴파일된 코드,
Decompiler
http://ibotpeaches.github.io/Apktool/
install/ 로부터 script와 jar 파일 다운로드
./apktool.sh d -o Calendar
Calendar.apk
84
Chanjinui-MacBook-Pro:myandroid chanjinpark$ ./apktool.sh d -o Calendar
Calendar.apk
I: Using Apktool 2.0.2 on Calendar.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/chanjinpark/Library/apktool/
framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
Chanjinui-MacBook-Pro:myandroid chanjinpark$
Chanjinui-MacBook-Pro:myandroid chanjinpark$ ls -al Calendar
total 32
drwxr-xr-x 7 chanjinpark staff 238 11 20 16:46 .
drwxr-xr-x 29 chanjinpark staff 986 11 20 16:46 ..
-rw-r--r-- 1 chanjinpark staff 10476 11 20 16:46
AndroidManifest.xml
-rw-r--r-- 1 chanjinpark staff 315 11 20 16:46 apktool.yml
drwxr-xr-x 5 chanjinpark staff 170 11 20 16:46 assets
drwxr-xr-x 4 chanjinpark staff 136 11 20 16:46 original
drwxr-xr-x 91 chanjinpark staff 3094 11 20 16:46 res
AndroidMenifest.xml 파일
85
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.shared" package="com.android.contacts"
platformBuildVersionCode="22" platformBuildVersionName="5.1-1737576">
<original-package android:name="com.android.contacts"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
…
<application android:hardwareAccelerated="true" android:icon="@mipmap/
ic_contacts_clr_48cv_44dp" android:label="@string/applicationLabel"
android:name="com.android.contacts.ContactsApplication" android:supportsRtl="true"
android:taskAffinity="android.task.contacts">
<activity android:clearTaskOnLaunch="true" android:label="@string/
launcherActivityLabel" android:launchMode="singleTop"
android:name=".activities.PeopleActivity" android:theme="@style/PeopleTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.APP_CONTACTS"/>
</intent-filter>
…
<service android:exported="true" android:name=".ViewNotificationService"
android:permission="android.permission.WRITE_CONTACTS">
<intent-filter>
<action android:name="com.android.contacts.VIEW_NOTIFICATION"/>
<data android:mimeType="vnd.android.cursor.item/contact"/>
</intent-filter>
</service>
<receiver android:name=“com.android.contacts.common.location.CountryDetector
$LocationChangedReceiver"/>
<provider android:authorities="com.android.contacts.files" android:exported="false"
android:grantUriPermissions="true" android:name="android.support.v4.content.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<meta-data android:name="android.nfc.disable_beam_default" android:value="true"/>
</application>
</manifest>
패키지 정보 확인
설치된 패키지 열거
run app.package.list
패키지의 정보 확인
run app.package.info --package
com.android.calendar
86
adb forward tcp:31415 tcp:31415
drozer console connect
drozer Console (v2.3.4)
dz> run app.package.list
com.android.smoketest (com.android.smoketest)
com.example.android.livecubes (Example Wallpapers)
com.android.providers.telephony (휴대전화/메시지 저장공간)
com.android.providers.calendar (캘린더 저장)
com.android.providers.media (미디어 저장소)
com.android.protips (홈 화면 도움말)
com.android.launcher (Launcher)
com.android.documentsui (문서)
com.android.gallery (카메라)
…
dz> run app.package.info --package com.android.calendar
Package: com.android.calendar
Application Label: 캘린더
Process Name: com.android.calendar
Version: 5.1-1737576
Data Directory: /data/data/com.android.calendar
APK Path: /system/app/Calendar/Calendar.apk
UID: 10018
GID: [3003]
Shared Libraries:
Shared User ID:
Uses Permissions:
- android.permission.GET_ACCOUNTS
- android.permission.MANAGE_ACCOUNTS
- android.permission.INTERNET
- android.permission.VIBRATE
- android.permission.READ_CONTACTS
- android.permission.READ_CALENDAR
- android.permission.WRITE_CALENDAR
- android.permission.WAKE_LOCK
- android.permission.USE_CREDENTIALS
- android.permission.READ_SYNC_SETTINGS
- android.permission.RECEIVE_BOOT_COMPLETED
- com.google.android.googleapps.permission.GOOGLE_AUTH.mail
Defines Permissions:
- None
권한을 사용하는 패키지 열거
CAMERA 사용 권한을 가진 패키지 목록
run app.package.info -p
android.permission.CAMERA
87
dz> run app.package.info -p android.permission.CAMERA
Package: com.android.gallery
Application Label: 카메라
Process Name: com.android.gallery
Version: 5.1-1737576
Data Directory: /data/data/com.android.gallery
APK Path: /system/app/Gallery/Gallery.apk
UID: 10005
GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007]
Shared Libraries:
Shared User ID: android.media
Uses Permissions:
- android.permission.CAMERA
- android.permission.RECORD_AUDIO
- android.permission.ACCESS_FINE_LOCATION
- android.permission.WAKE_LOCK
- android.permission.SET_WALLPAPER
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.READ_SMS
- android.permission.READ_EXTERNAL_STORAGE
Defines Permissions:
- None
Package: com.android.browser
Application Label: 인터넷
…
Package: com.example.chanjinpark.myapplication
Application Label: My Application
…
…
액티비티 정보 확인
액티비티 열거
run app.activity.info
88
dz> run app.activity.info
Package: com.android.smoketest
Package: com.example.android.livecubes
Package: com.android.providers.calendar
com.android.providers.calendar.CalendarDebug
Permission:
com.android.providers.calendar.CalendarDebugActivity
Permission:
…
Package: com.android.gallery
com.android.camera.GalleryPicker
Permission:
com.android.camera.ImageGallery
Permission:
com.android.camera.CropImage
Permission:
…
Content Provider 정보
CP 열거
run app.provider.info
89
dz> run app.provider.info
Package: com.android.providers.telephony
…
Package: com.android.providers.calendar
Authority: com.android.calendar
Read Permission: android.permission.READ_CALENDAR
Write Permission: android.permission.WRITE_CALENDAR
Content Provider: com.android.providers.calendar.CalendarProvider2
Multiprocess Allowed: False
Grant Uri Permissions: False
…
Package: com.android.providers.contacts
Authority: contacts
Read Permission: android.permission.READ_CONTACTS
Write Permission: android.permission.WRITE_CONTACTS
Content Provider: com.android.providers.contacts.ContactsProvider2
Multiprocess Allowed: False
Grant Uri Permissions: True
Uri Permission Patterns:
Path: .*
Type: PATTERN_SIMPLE_GLOB
Path Permissions:
Path: /search_suggest_query
Type: PATTERN_PREFIX
Read Permission: android.permission.GLOBAL_SEARCH
Write Permission:
서비스 정보 확인
서비스 열거
run app.service.info
90
dz> run app.service.info --package com.android.deskclock
Package: com.android.deskclock
com.android.deskclock.Screensaver
Permission: android.permission.BIND_DREAM_SERVICE
dz> run app.service.info --package com.android.contacts
Package: com.android.contacts
com.android.contacts.ViewNotificationService
Permission: android.permission.WRITE_CONTACTS
브로드캐시트 리시버
91
dz> run app.broadcast.info -i -f contacts
Package: com.android.providers.contacts
com.android.providers.contacts.ContactsUpgradeReceiver
Intent Filter:
Actions:
- android.intent.action.PRE_BOOT_COMPLETED
Permission:
com.android.providers.contacts.PackageIntentReceiver
Intent Filter:
Actions:
- android.intent.action.PACKAGE_REPLACED
Data:
- package://*:** (type: *)
Intent Filter:
Actions:
- android.intent.action.PACKAGE_CHANGED
Data:
- package://*:** (type: *)
Intent Filter:
Actions:
- android.intent.action.PACKAGE_ADDED
Data:
- package://*:** (type: *)
Intent Filter:
Actions:
- android.intent.action.PACKAGE_REMOVED
Data:
- package://*:** (type: *)
Permission:
dz> run app.broadcast.info -a com.android.deskclock
Package: com.android.deskclock
com.android.deskclock.AlarmInitReceiver
Permission:
com.android.alarmclock.AnalogAppWidgetProvider
Permission:
com.android.alarmclock.DigitalAppWidgetProvider
Permission:
앱이 노출하고 있는 컴포넌트 파악
activities
broadcast receivers
content providers
services
shared ID
92
dz> run app.package.attacksurface com.android.contacts
Attack Surface:
15 activities exported
0 broadcast receivers exported
0 content providers exported
1 services exported
Shared UID (android.uid.shared)
dz> run app.package.attacksurface com.android.deskclock
Attack Surface:
6 activities exported
3 broadcast receivers exported
0 content providers exported
1 services exported
액티비티 실행
93
dz> run app.activity.forintent --action android.intent.action.MAIN --category
android.intent.category.LAUNCHER
Package: com.android.contacts
com.android.contacts.activities.PeopleActivity
Package: com.android.dialer
com.android.dialer.DialtactsActivity
Package: com.android.mms
com.android.mms.ui.ConversationList
Package: com.google.android.gms
com.google.android.gms.app.settings.GoogleSettingsActivity
Package: com.android.settings
com.android.settings.Settings
Package: com.android.browser
com.android.browser.BrowserActivity
…
dz> run app.activity.start --action android.intent.action.MAIN --category
android.intent.category.LAUNCHER --component com.android.contacts
com.android.contacts.activities.PeopleActivity
Reversing Application Code
FourGoats APK 파일을 unzip
Dex2Jar
http://sourceforge.net/projects/
dex2jar/
d2j-dex2jar.sh classes.dex
JD-GUI
https://github.com/java-decompiler/
jd-gui/releases
94
Dalvik 설치 이미지로부터 Java 앱 소스코드를 리버스 엔지니어링 후
에 2천만 라인 코드에 대해 정적 분석을 시도 (1100개 무료 앱). 2012
중요 개인 정보를 잘못 사용 폰 식별 ID(IMES, IMSI, ICC-ID)를 평문으
로 전송, 위치 정보와 결합되면 폰의 이동 경로 추적 가능
실습
GoatDroid
OWASP에서 안드로이드 보안 문제점을 보
이기 위해 샘플 앱을 작성
아래 사이트에서 파일 다운로드
https://github.com/jackMannino/
OWASP-GoatDroid-Project/
downloads
goatdroid UI 화면 실행
Start Web Services
95
$ java -jar goatdroid-0.9.jar
$ ls -al
total 13792
drwxr-xr-x@ 12 chanjinpark staff 408 11 22 16:42 .
drwxr-xr-x 42 chanjinpark staff 1428 11 23 10:12 ..
-rw-r--r--@ 1 chanjinpark staff 6148 11 22 16:19 .DS_Store
-rw-r--r--@ 1 chanjinpark staff 213 11 23 10:25 config
drwxr-xr-x@ 4 chanjinpark staff 136 11 22 00:23 dbs
-rw-r--r-- 1 chanjinpark staff 1602 11 23 10:23 derby.log
-rw-r--r--@ 1 chanjinpark staff 7035952 9 25 2012 goatdroid-0.9.jar
drwxr-xr-x@ 4 chanjinpark staff 136 11 22 00:23 goatdroid_apps
-rw-r--r--@ 1 chanjinpark staff 642 9 25 2012 jetty.csr
-rw-r--r--@ 1 chanjinpark staff 1331 9 25 2012 keystore
drwxr-xr-x@ 2 chanjinpark staff 68 9 25 2012 lessons
drwxr-xr-x@ 2 chanjinpark staff 68 9 25 2012 top10
앱 설치
디바이스설정
IP 설정 (ipconfig)
사용자 등록 및 로그인
96
$ adb install OWASP GoatDroid- FourGoats Android App.apk
1704 KB/s (1256313 bytes in 0.719s)
pkg: /data/local/tmp/OWASP GoatDroid- FourGoats Android App.apk
Success
OWASP-GoatDroid-0.9/goatdroid_apps/FourGoats/OWASP GoatDroid- FourGoats Android App.apk
FourGoat에 저장된 정보 읽기
사용자 인증 정보 저장 (SessionToken)
Remember Me
97
$ adb pull /data/data/org.owasp.goatdroid.fourgoats/databases
pull: building file list...
pull: /data/data/org.owasp.goatdroid.fourgoats/databases/userinfo.db-
journal -> ./userinfo.db-journal
pull: /data/data/org.owasp.goatdroid.fourgoats/databases/userinfo.db -
> ./userinfo.db
2 files pulled. 0 files skipped.
541 KB/s (25104 bytes in 0.045s)
$ ls -al
total 56
drwxr-xr-x 4 chanjinpark staff 136 11 23 00:08 .
drwxr-xr-x 43 chanjinpark staff 1462 11 22 17:49 ..
-rw-r--r-- 1 chanjinpark staff 16384 11 23 00:08 userinfo.db
-rw-r--r-- 1 chanjinpark staff 8720 11 23 00:08 userinfo.db-journal
$ cat userinfo.db
??Lite format 3@ -?
?{tableinfoinfoCREATE TABLE info(id INTEGER PRIMARY KEY, sessionToken
TEXT, userName TEXT, isPublic INT, autoCheckin INT, isAdmin INT)W--
ctableandroid_metadataandroid_metadataCREATE TABLE
android_meb03f87f751cd1d0d542e73ef68777b33a18f04580b4cb2135a78d8bf798f4ce
fe4731110f0bbed8c133253a6617fb11a62290a6053f872ef288be99e9fa62ad9hgdtruet
ruefalse
$ sqlite3 userinfo.db
sqlite> .tables
android_metadata info
sqlite> .headers on
sqlite> select * from info;
id|sessionToken|userName|isPublic|autoCheckin|isAdmin
1|
b03f87f751cd1d0d542e73ef68777b33a18f04580b4cb2135a78d8bf798f4cefe4731110f
0bbed8c133253a6617fb11a62290a6053f872ef288be99e9fa62ad9|hgd|true|true|
false
첨부
28 QUESTIONS FOR MOBILE APP VENDORS
앱의 알려진 보안 이슈?
폰, 네트워크 (Wi-Fi, Bluetooth) 기능을 사용하는가?
GPS는?
카메라 및 다른 녹화 하드웨어/소프트웨어는?
사용하는 OS 시스템 리소스, 라이브러리?
외부 호스트로 보내는 데이터는 어떤 것들이 있는가?
PC 동기화 시 주고 받는 데이터는?
위 질문에 대해 보안 이슈가 없음을 명료하게 대답할 수 있나?
앱의 소스 코드를 볼 수 있나?
코드 리뷰나 개발자 참여 사용자 커뮤니티가 있는가?
앱 라이센스가 취약점 및 버그 발견 및 공개를 제한하는 항목을 가지고 있는가?
새로 발견된 결함 정보 공유를 막거나 논의를 막는 “gag rule”이 있는가?
99
Voas, J., "Vetting Mobile App Vendors," in Computer , vol.48, no.6, pp.69-71, June 2015
앱에 대한 평판 정보가 있는가?
보안과 관련되었는가?
찬 반에 대한 리뷰의견이 있는가?
보안 요구사항이 잘 구조화되어 정리되어 있는가?
보안 관련 개선을 일처리에 있어 높은 우선순위를 두는 프로세스를 가지고 있는가?
보안 요구사항이 독립적으로 개발되었는가 혹은 요구공학 절차로 통합되어 다루었는가?
앱 요구사항으로부터 오용/악용 케이스가 도출되어 있는가?
관련 공격 패턴을 통해 잠재 위협을 파악하고 문서화했는가?
앱과 정보 자산을 보호를 위한 설계 시, 위협에 대한 가정은 어떤 것이 있는가?
100
위협 모델링 프로세스는?
앱 보호를 위한 설계 시 Threat Modeling 결과를 반영했는가?
보안 개발 표준 혹은 가이드라인이 개발자에게 제공되었는가?
보안 리스크 관리 활동이 소프트웨어 개발 방법론에 포함되어 있는가?
앱는 신뢰할 수 없는 소스로부터의 입력을 검증하는가?
앱은 제한된 실행 환경 내에서 실행되도록 설계된 적이 있는가?
Virtual Machine 등. 공격 발생 시 secure 환경에서 운영하도록 전환 가능한가?
문서는 설치, 설정, 사용에 대한 방법을 설명하고 있는가?
보안 취약점 발견 시 바로 조치할 수 있는 방법을 가지고 있는가?
앱이 보안 위험 의존성을 가지거나 다른 소프트웨어, 펌웨어, 하드웨어로부터 제어를 필요로 하는가?
만일 그렇다면, 설명해주시오
101
앱은 주 개발사가 아닌 외주를 통해 만들어진 내용물을 포함하는가?
개발 컴포넌트가 아닌 부분의 기능 및 보안을 검증하기 위한 정책이나 절차는?
내부 개발 시 기능 테스트는 어떤 테스팅을 포함하나?
spot checking, component-level testing, and integrated testing?
보안 테스트 얼마나 자주 실행하나?
내부 개발팀이 진행하는 지 외부 제 3자가 실행하는 지?
내부 테스팅이 커버하는 코드 범위는 얼마나 되나?
잠재 오용/남용 시나리오가 테스트에 포함되어 있나?
102
취약점 파악을 위한 정적 혹은 동적 소프트웨어 보안 분석 도구가 사용되나?
이러한 취약점 스캔은 개발 라이프사이클의 어느 시점에 사용되나?
앱은 보증 및 인가 절차를 거치는가?
무엇에 대해, 언제, 누가, 통과 기준 및 체계는?
패치가 배포될 예정인가?
앱과 관련된 결함, 취약점, 보안 사고 리포트는 어떻게 수집, 추적, 우선순위화되나?
앱 컴포넌트가 의도되지 않거나, 실행되지 않거나, 악성 행동을 하는 코드를 포함하지 않음을 검증하기
위한 정책 및 프로세스는 어떤 것이 있나?
얼마나 자주 앱의 Major 버전이 릴리스 되나?
103
MOBILE SECURITY TESTING
모바일 보안 테스팅
모바일 기기 내 앱의 취약점 혹은 악성 앱을 탐지하기 위한 테스팅
모바일 보안 테스팅 분류: mobile forensic, penetration test, static analysis, and dynamic analysis
아직 보안 테스팅 도구가 많지 않고 성숙되지 않음
Mobile Security Solutions
시그내처 기반 멀웨어 탐지 방법
알려진 멀웨어 분석 결과 기반으로 악성 앱 설치 금지. 멀웨어 변형에 대한 대응 필요. 폰에서 지속적 업데이트해야 함
Bouncer
구글 Play Store에 올라오기 전에 서버에서 악성 앱을 탐지하는 방법
모바일 앱을 스캐닝해서 멀웨어를 탐지. e.g. SMS를 외부로 보내는 지 체크.
TaintDroid
중요 데이터의 흐름을 추적. 로그를 통해 중요 정보를 악용하려는 악성 앱을 파악.
104
Yong Wang; Alshboul, Y., "Mobile security testing approaches and challenges," in
Mobile and Secure Services (MOBISECSERV), 2015 First Conference on , Feb. 2015
모바일 보안 위협 모델
105
application layer, communication layer, and resource layer
멀웨어 방지는 탐지하여 격리, 삭제를 통해 공격 루프를 끊는 것.
보안 테스팅 방법
Mobile Forensic
포렌식은 모바일 기기에 대한 보안 점검을 위한 합법적인 보안 취약점 탐지 활동
데이터로는 SMS/MMS messages, emails, call logs, calendar events, web traffic, bookmarks, pictures,
voice mail messages, location information, app data 등이 있음
Penetration Test
모바일 앱에 대한 보안 테스팅을 위해 사용
테스팅 환경의 셋업, 테스트 절차 만들고 기대 결과와 실제 실행 결과를 비교
도구
Wireshark: Wi-Fi 트래픽을 모니터링
nmap, Nessus, Metasploit, etc.
Kali Linux는 테스팅 도구를 탑재한 테스팅 플랫폼
106
보안 테스팅 방법
Static Analysis
앱을 실제 실행하지 않고 코드 수준에서 분석
알려진 취약점 혹은 의심스러운 함수 호출 및 권한 사용에 대한 앱 코드 리뷰
APK 파일에 대한 정적 분석 도구. Android Reverse Tools (ART) and Static Android Analysis Framework
(SAAf).
정적 분석은 주로 디컴파일 도구에 의존
시그내처 기반 멀웨어 탐지 도구 활용
Dynamic Analysis
앱을 제한된 환경에서 실행하여 보안 취약점 분석
의심스런 활동을 탐지하기 위해 네트워크 트래픽 및 통신을 모니터링함
앱이 알려지지 않거나 악성 사이트에 접속한다거나 SMS 메시지를 권한 없이 보내는 등의 활동
프로그램 행위에 기반하고 디컴파일 도구가 불필요. 로그를 남겨야 함. 스스로 코드 상에 보이지 않게하는 멀웨어
를 분석할 수 있음
107
보안 테스팅 네트워크 (테스팅 환경)
108
802.11 Protocol Analyzer
USB Protocol Analyzer
Bluetooth Analyzer
NFC Protocol Analyzer
Kali Linux Test Station
Micro Systemation XRY Complete Mobile Forensic System
보안 테스팅 컴퓨터
• Conduct penetration tests on mobile devices using the Kali
Linux station
• 802.11, Bluetooth, and NFC protocol analyzers provide sniffing
tools to monitor the communication channels on a mobile
device
END

Contenu connexe

Tendances

Tendances (14)

IoT era and convergence security sangsujeon
IoT era and convergence security sangsujeonIoT era and convergence security sangsujeon
IoT era and convergence security sangsujeon
 
IT보안과 사회공학(Social Engineering)
IT보안과 사회공학(Social Engineering)IT보안과 사회공학(Social Engineering)
IT보안과 사회공학(Social Engineering)
 
주간 보안 It뉴스 8월 첫째주 v3
주간 보안 It뉴스 8월 첫째주 v3주간 보안 It뉴스 8월 첫째주 v3
주간 보안 It뉴스 8월 첫째주 v3
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법
 
Apt(advanced persistent threat) 공격의 현재와 대응 방안
Apt(advanced persistent threat) 공격의 현재와 대응 방안Apt(advanced persistent threat) 공격의 현재와 대응 방안
Apt(advanced persistent threat) 공격의 현재와 대응 방안
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법
 
정보보호최근이슈및패러다임의변화 임종인(고려대)
정보보호최근이슈및패러다임의변화 임종인(고려대)정보보호최근이슈및패러다임의변화 임종인(고려대)
정보보호최근이슈및패러다임의변화 임종인(고려대)
 
2015년 3분기 주요 정보보안 소식 차민석 20160117_공개판
2015년 3분기 주요 정보보안 소식 차민석 20160117_공개판2015년 3분기 주요 정보보안 소식 차민석 20160117_공개판
2015년 3분기 주요 정보보안 소식 차민석 20160117_공개판
 
2017년 1분기 정보보안 소식 20170528 차민석_공개판
2017년 1분기 정보보안 소식 20170528 차민석_공개판2017년 1분기 정보보안 소식 20170528 차민석_공개판
2017년 1분기 정보보안 소식 20170528 차민석_공개판
 
APT Case Study
APT Case StudyAPT Case Study
APT Case Study
 
1. 보안 위협 동향과 주요 보안 위협 특징
1. 보안 위협 동향과 주요 보안 위협 특징1. 보안 위협 동향과 주요 보안 위협 특징
1. 보안 위협 동향과 주요 보안 위협 특징
 
스마트폰보안과 W ifi의 안전한 사용(공개용)
스마트폰보안과 W ifi의 안전한 사용(공개용)스마트폰보안과 W ifi의 안전한 사용(공개용)
스마트폰보안과 W ifi의 안전한 사용(공개용)
 
보안 위협 동향과 대응 방안
보안 위협 동향과 대응 방안보안 위협 동향과 대응 방안
보안 위협 동향과 대응 방안
 
Internet of thing with your future(공개용)
Internet of thing with your future(공개용)Internet of thing with your future(공개용)
Internet of thing with your future(공개용)
 

En vedette

07 모바일 보안 대응전략 및 구축 사례
07 모바일 보안 대응전략 및 구축 사례07 모바일 보안 대응전략 및 구축 사례
07 모바일 보안 대응전략 및 구축 사례
cheolhwa
 

En vedette (11)

조재완
조재완조재완
조재완
 
Mobile app기반 인증-2014.7
Mobile app기반 인증-2014.7Mobile app기반 인증-2014.7
Mobile app기반 인증-2014.7
 
07 모바일 보안 대응전략 및 구축 사례
07 모바일 보안 대응전략 및 구축 사례07 모바일 보안 대응전략 및 구축 사례
07 모바일 보안 대응전략 및 구축 사례
 
[Seoultech] Mobile Security &amp; Security Testing(Eng)
[Seoultech] Mobile Security &amp; Security Testing(Eng)[Seoultech] Mobile Security &amp; Security Testing(Eng)
[Seoultech] Mobile Security &amp; Security Testing(Eng)
 
모바일 게임 보안
모바일 게임 보안모바일 게임 보안
모바일 게임 보안
 
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupBig query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
 
안드로이드 플랫폼기반의 푸시서버 아키텍처
안드로이드 플랫폼기반의 푸시서버 아키텍처안드로이드 플랫폼기반의 푸시서버 아키텍처
안드로이드 플랫폼기반의 푸시서버 아키텍처
 
Querydsl
QuerydslQuerydsl
Querydsl
 
[Dmc] 모바일 앱 및 광고 시장의 현황과 전망
[Dmc] 모바일 앱 및 광고 시장의 현황과 전망[Dmc] 모바일 앱 및 광고 시장의 현황과 전망
[Dmc] 모바일 앱 및 광고 시장의 현황과 전망
 
sungmin slide
sungmin slidesungmin slide
sungmin slide
 
About Init In Android By Andstudy
About Init In Android By AndstudyAbout Init In Android By Andstudy
About Init In Android By Andstudy
 

Similaire à Mobile app security nov 2015

CYREN 2013년 인터넷 위협 보고서_국문
CYREN 2013년 인터넷 위협 보고서_국문CYREN 2013년 인터넷 위협 보고서_국문
CYREN 2013년 인터넷 위협 보고서_국문
Jiransoft Korea
 
모바일 프라이버시
모바일 프라이버시모바일 프라이버시
모바일 프라이버시
David Lee
 
안드로이드 악성코드의 철학적_연구_padocon_조효제
안드로이드 악성코드의 철학적_연구_padocon_조효제안드로이드 악성코드의 철학적_연구_padocon_조효제
안드로이드 악성코드의 철학적_연구_padocon_조효제
Hyoje Jo
 

Similaire à Mobile app security nov 2015 (20)

모바일 보안 침해 사례
모바일 보안 침해 사례모바일 보안 침해 사례
모바일 보안 침해 사례
 
Mobile security & security testing - Speaker at CSS Serminar
Mobile security & security testing - Speaker at CSS SerminarMobile security & security testing - Speaker at CSS Serminar
Mobile security & security testing - Speaker at CSS Serminar
 
모바일침해사례 Kinfosec 강장묵교수님140729 [호환 모드]
모바일침해사례 Kinfosec 강장묵교수님140729 [호환 모드]모바일침해사례 Kinfosec 강장묵교수님140729 [호환 모드]
모바일침해사례 Kinfosec 강장묵교수님140729 [호환 모드]
 
사물인터넷 시대의 보안 이슈와 대책
사물인터넷 시대의 보안 이슈와 대책사물인터넷 시대의 보안 이슈와 대책
사물인터넷 시대의 보안 이슈와 대책
 
All In One MDM솔루션_Mobile watcher 제안서_korean_20140408
All In One MDM솔루션_Mobile watcher 제안서_korean_20140408All In One MDM솔루션_Mobile watcher 제안서_korean_20140408
All In One MDM솔루션_Mobile watcher 제안서_korean_20140408
 
CYREN 2013년 인터넷 위협 보고서_국문
CYREN 2013년 인터넷 위협 보고서_국문CYREN 2013년 인터넷 위협 보고서_국문
CYREN 2013년 인터넷 위협 보고서_국문
 
Andoid ux, secure
Andoid ux, secureAndoid ux, secure
Andoid ux, secure
 
전자
전자전자
전자
 
[KCC poster]정준영
[KCC poster]정준영[KCC poster]정준영
[KCC poster]정준영
 
사물인터넷 보안 사례 및 대응 방안 2016.11.09
사물인터넷 보안 사례 및 대응 방안   2016.11.09사물인터넷 보안 사례 및 대응 방안   2016.11.09
사물인터넷 보안 사례 및 대응 방안 2016.11.09
 
(Ficon2015) #2 어떻게 조사할 것인가
(Ficon2015) #2 어떻게 조사할 것인가(Ficon2015) #2 어떻게 조사할 것인가
(Ficon2015) #2 어떻게 조사할 것인가
 
(FICON2015) #2 어떻게 조사할 것인가?
(FICON2015) #2 어떻게 조사할 것인가?(FICON2015) #2 어떻게 조사할 것인가?
(FICON2015) #2 어떻게 조사할 것인가?
 
Drive-By Download & JavaScript Obfuscation
Drive-By Download & JavaScript ObfuscationDrive-By Download & JavaScript Obfuscation
Drive-By Download & JavaScript Obfuscation
 
Korean information security practices 보안 인식교육
Korean information security practices 보안 인식교육Korean information security practices 보안 인식교육
Korean information security practices 보안 인식교육
 
모바일 프라이버시
모바일 프라이버시모바일 프라이버시
모바일 프라이버시
 
[14.05.28 ㅡMPIS 발표 의료기관 네트워크접근제어 (NAC)구축사례
[14.05.28 ㅡMPIS 발표 의료기관 네트워크접근제어 (NAC)구축사례[14.05.28 ㅡMPIS 발표 의료기관 네트워크접근제어 (NAC)구축사례
[14.05.28 ㅡMPIS 발표 의료기관 네트워크접근제어 (NAC)구축사례
 
안드로이드 악성코드의 철학적_연구_padocon_조효제
안드로이드 악성코드의 철학적_연구_padocon_조효제안드로이드 악성코드의 철학적_연구_padocon_조효제
안드로이드 악성코드의 철학적_연구_padocon_조효제
 
net helper7 통합 제안서_시온
net helper7 통합 제안서_시온net helper7 통합 제안서_시온
net helper7 통합 제안서_시온
 
201111_스마트폰 애플리케이션 블랙마켓_KISA
201111_스마트폰 애플리케이션 블랙마켓_KISA201111_스마트폰 애플리케이션 블랙마켓_KISA
201111_스마트폰 애플리케이션 블랙마켓_KISA
 
모바일 악성코드, 그것이 알고싶다
모바일 악성코드, 그것이 알고싶다모바일 악성코드, 그것이 알고싶다
모바일 악성코드, 그것이 알고싶다
 

Mobile app security nov 2015

  • 1. 모바일 보안 이론과 실습 2015.11 박찬진, chanjin.park@gmail.com
  • 2. 2
  • 3. 왜 모바일 공격? 중요한 개인 정보를 저장 (Strong Personalization) 이메일, 일정, 연락처, 사진 등. 최근에 전자 지갑. 회사 정보 저장 쉽게 분실할 수 있음 (Mobility) 다양한 네트워크 연결을 통해 멀웨어 침투 (String Connectivity) 빌링 시스템 신용카드화되어 가고 있음. in-app purchases, etc. 최근에는 NFC 지원 iOS에 비해 안드로이드 멀웨어가 많음 구글은 애플과 달리 안드로이드 소스를 공개하고 제3의 제조업체가 스마트폰을 제작하는 구조 통제가 불가능해 모든 안드로이드 폰에 패치를 적용하기 어려운 한계가 있음 e.g. 2014년 1분기 발견 악성코드 중 99%가 안드로이드 대상 (According to F-Secure & Cisco) 3
  • 4. INFOGRAPHICS 2014년 주요 지수 10 억 건의 침해 시도 미국에서 5백 2십만개 핸드폰 분실 및 도난 44% 웹 공격이 미국/독일로부터 시도 모바일 기기가 비즈니스 보안 취약 기기 #1 5명 중 1명이 모바일 보안 위협을 경험 사이버범죄에 의한 평균 기업의 오버헤드 소매 유통 $8.6M, 통신 $12.7M, 기술 $ 14.5M, 금융 $20.8M 75% 넘는 모바일 앱이 기본 보안 테스트를 통과 못함 (가트너) 모바일 뱅킹 Trojan 공격이 9배 늘었음 56% 기업이 위협 대비 부족하고, 대비한 기업의 37%도 실시간 탐지 능력 부족 4 http://blogs.air-watch.com/2015/10/infographic-mobile- security-haunting-reality/#.VkapM9_hDMU
  • 5. 전형적인 공격 5 phishing 앱, 이메일, SMS을 통해 계정 정보, 카드 정보와 같은 사용자 보안 정보를 수집 spyware 불특정 다수의 스마트폰에서의 사용자 활동을 감시. 개인 정보를 수집 혹은 추측 surveillance attacks 감염된 폰을 통해 특정 사용자를 감시 diallerware attacks SMS 서비스나 Premium 번호로 전화를 걸어 과금 발생 financial malware attacks 금융 앱에 대해 Man-in-the-Middle 공격 worm-based attacks 기기 간 웜 전파 (블루투스, Wi-Fi, SMS 등) botnets 공격자가 원격 제어할 수 있는 감염된 좀비 기기들의 집합
  • 6. 멀웨어 종류 멀웨어 사용자 동의 없이 기기를 사용하도록 고안된, 악의적 (hostile), 위협적이고 (intrusive), 성가신 (annoying) 소 프트웨어 혹은 프로그램 코드 Troyan, Rootkit, Backdoor 악성 파일 이메일 첨부 혹은 감염 사이트 링크 가진 스팸 virus 스스로 복제 가능한 코드로, 복제된 바이러스는 다른 프로 그램, 부트 섹터, 파일을 감염시킬 수 있음. 성능을 느리게 하거나 데이터를 망가뜨림 worm 사용자 승인없이 스스로 복사본을 만들어 네트워크를 통해 전송하여 다른 컴퓨터를 감염시키는 프로그램 메일, 다운로딩, 브라우징, 블루투스 등 데이터를 빼내거나 네트워크 대역폭을 잡아먹을 수 있음. 6 차이 • 바이러스는 감염된 파일이나 프로그램을 통해 감염. 웜은 네 트워크를 통해 전파 • 바이러스는 파일의 삭제/변조하며, 웜은 CPU 및 메모리 속도 를 늦춤 • 바이러스는 웜 보다 전파속도가 느림 • 웜의 예방은 바이러스보다 쉬움. 이메일이나 링크 클릭을 주 의하면 되지만, 바이러스는 탐지 및 제거를 위해 안티 바이러 스 백신이 필요 • 전파 방식: 어떻게 기기로 전달되는 지 • 원격 제어 방식: 멀웨어가 감염된 기기를 exploit하기 위해 리 모트 서버를 사용하는 방식 • 공격 방식: 멀웨어가 기기를 공격하는 방식 (기기에 저장된 데 이터에 접근, 정상 동작을 방해, 다양한 공격을 위해 권한을 획 득)
  • 7. 멀웨어 종류 Trojan 정상적인 기능을 수행하는 것으로 보이나 악성 프로그램을 가 진 소프트웨어 최근 가장 일반적인 모바일 멀웨어 타입 7MOBILE THREAT REPORT By F-Secure, 2014 Q1
  • 8. 멀웨어 종류 rootkits OS를 감염 Root 권한 (관리자 권한)을 획득 (OS 취약점 활용, 암호추론/ 소셜공학을 통한 관리자 암호 파악) 탐지 및 제거가 어렵고, 최악의 경우 시스템을 재설치 Rootkit 설치되면 원격서버에서 제어/조작이 가능함 botnet 바이러스에 감염된 기기 집합. 조직적 범죄를 위해 개발 Bot: 사용자 모르게 원격 Command & Control 서버에 접속된 기기 공격자가 원격으로 제어하여, 프로그램 설치, 금품 요구, 스팸을 광범위하게 뿌리거나, DOS 공격, SMS 메시지 등 불법적 정보 수집 목적 모바일 기기가 인터넷에 연결되면서 Botnet 가능성 증대 8
  • 9. 멀웨어 공격 목적 단말 장애 유발 장애를 불러일으키거나 심한 경우 사용자체를 불가능하게 하는 악성코드의 유형. 블루투스로 전파 2004년 해골(Skull)이 대표적인 단말장애 유발형 악성코 드. 모든 메뉴 아이콘을 해골로 변경, 통화 기능만 허용 시스템을 재설치 해야 함 (공장모드 초기화) 배터리 소모 스마트폰의 전력 사용을 지속적으로 유발. 배터리를 고갈 목적을 가지는 악성코드 2004년 블루투스를 통해 전파되었던 최초의 모바일 악성 코드인 Cabir가 대표적인 배터리 소모형 악성코드 지속적으로 근처 기기의 블루투스 장치를 스캐닝하고, 검 색된 블루투스를 통해 악성코드를 전파하는 기능을 가졌 음. 지속적인 스캐닝을 통해 배터리 고갈됨 9 TROJAN:SYMBOS/SKULLS.A BLUETOOTH-WORM:SYMBOS/CABIR
  • 10. 멀웨어 공격 목적 과금 유발 SMS 서비스나 전화 송신 서비스를 지속적으로 시도 과금을 발생 2010년 4월, 국내 최초 발생한 스마트 폰 악성코드인 WinCE/TerDial은 게임 내에 숨겨진 형태로 존재. 시스템 디렉터리에 복사됨 매 50초 마다 국제전화를 송신 정보 유출 스마트폰 기기 정보나 사용자 개인정보를 외부로 유출 2008년 Infojack. 게임, 지도 등 일반 프로그램으로 위장. 추가 설치 파일을 가짐 기기 보안설정을 변경하여 사용자 고지 없이 추가 설치 웹서버에 접속하여 나머지 부분 다운로드하여 재설치. AndroidOS.Tapsnake는 사용자의 위치정보를 빼감 10
  • 11. 보안 사고 및 위협 11Infographic: Timeline of Mobile Threats
  • 12. CABIR, BLUETOOTH-WORM:SYMBOS/CABIR wireless를 통한 개인 중요 데이터 도청을 통해 사용자이름/암호 등 개인 신원 정보를 수집 추적 및 분류를 위해 하드웨어 ID (e.g. MAC 주소) 사용 전파 속도 향상을 위해 블루투스를 사용 Cabir, 최초 wireless 웜, 2004 심비안 모바일 폰에서 블루투스 활용 (Nokia S60) 당시 Harmful Effects는 없었지만, 악용 가능 caribe.sis라는 앱 파일를 가진 메시지로 구성 폰의 메시지 박스에서 caribe.sis 파일을 클릭한 경우 설치 경고 메시지 사용자가 Yes 해야 설치 (No 하면 계속 메시지를 띄움) 일단 설치되면, 기기의 블루투스 기능을 사용하여 다른 블 루투스 기기를 검색. 감염된 SIS 파일을 검색된 기기로 전송 시도 폰이 켜질 때마다 실행되고,화면에 Caribe라는 문자를 보 여줌 12https://www.f-secure.com/v-descs/cabir.shtml
  • 13. TROJAN-SMS.ANDROIDOS.FAKEPLAYER.B FakePlayer, 2011.2 안드로이드 Trojan (FakePlayer.A는 2010.9월 발견) 이전에는 단순 Spyware 였으나, 안드로이드 최초 SMS 멀웨어 사용자 동의없이 정해진 번호로 SMS 메시지를 보냄 러시아 성인물 비디오 웹페이지로부터 미디어 플레이어로 위 장하여 사용자 설치 유도 표준 .APK 설치프로그램으로 다운로드됨 설치 크기는 매우 작고, 설치 동안 앱은 SMS 메시지 보내기에 필요한 사용자 권한을 요청 앱을 실행되면, Troyan이 사용자 동의 없이 SMS 메시지를 Premium Rate Number로 보내기 시작 백그라운드로 실행되며, 실행 시 어떤 메시지도 보여주지 않음 13 Kasperksy Lab, “Popular Porn Sites Distribute a New Trojan Targeting Android Smartphones,” 2010. [Online]. Available: http: //www.kaspersky.com/news?id=207576175
  • 14. LOCATION: ANDROIDOS.TAPSNAKE 위치 정보 활용 GPS, Cell of Origin 및 Signal strength (삼각 측량) 실내에서는 WLAN or Bluetooth 좋은 점이 많이 있지만, 개인 정보 우려가 있음 단골 음식점 할인 및 쿠폰, 광고, 주변 상점 세일 정보 제공 및 관광정보 제공, 생산성 향상 위한 직원, 트럭 등 위치 추적, 경로정보. 하이킹 주변 기기 혹은 사람을 자동 인지. 응급전화 위치 추적 Tap Snake, 2010.10 GPS 위치정보를 빼가는 스파이웨어 ‘Tap snake’게임으로 위장해서 설치 백그라운드로 실행. 15분 단위로 위치 정보를 업로드. 게임은 종료되지 않고, 설치되면 부팅 시 자동 수행 유료 애플리케이션‘GPS Spy’를 설치한 사용자는 ‘Tap Snake’ 사용자의 이메일 정보로 위치정보를 확인. 소셜 공학으로 Tap Snake 게임 권유 후 위치 추적. 14 'Tap Snake' Android App Hides GPS Spyware AndroidOS.Tapsnake: Watching Your Every Move
  • 15. DROIDDREAM DroidDream.A, 2011.3 TrojanSpy:AndroidOS/DroidDream.A 공식 안드로이드 마켓에서 발견됨 (By Lookout Inc.) 2011년 3월 당시 58개 앱이 감염 4일동안 26만 다운로드 릴리스 후 4일 만에 앱을 제거, 3명의 개발자를 금지. 안드로이드 취약점을 통해 폰 루팅 (Froyo) Bowling Time 앱 실행 시 DroidDream이 실행되어 중요 개인 정보를 C&C 서버로 전송, www.umeng.com (베이 징 소재) IMEI (국제단말기식별번호), IMSI (국제단말기가입자ID), Language, Country, Device Model, SDK Version => 관 리자 계정에서만 알 수 있는 정보 밤 중에 Premium rate SMS 메시지를 보냄 이 후로 멀웨어가 많이 생김 15
  • 16. ZEUS BANKING TROJAN ZeuS Trojan, 2010.9 Windows, TROJAN:W32/AGENT.DKJC 스페인의 12개 은행의 온라인 뱅킹 계정 정보 해킹. Man-in-the-Middle (소셜 공학 + SMS 인증) 소유자가 앱을 설치하면, 공격자는 감염된 스마트폰을 공격하여 모든 SMS 메시지를 읽어들임 사용자가 온라인뱅킹 계좌 로그인 시, 폰 번호 입력 유도 스마트폰 감염, 계정 소유자 대신 온라인 뱅킹 작업 실행 SMS를 전달받아, 공격자는 뱅킹 시 필요한 SMS 인증을 통과 미국에서만 350만 기기를 감염 U.S. 92명 체포 (4년간 70M$), London 19명 체포 (3개월, 9M $), Ukraine 5명 체포 SpyEye, 2011 키 입력을 캡처해서 서버로 보냄 코드 개발자 패닌은 블랙 마켓에 1000 ~ 8500불에 코드를 판매. FBI가 은행돈을 훔치기 위해 코드를 사용한 구매자를 조사. 150명이 파악됨, 이 중 한명은 6개월에 320만불을 훔침 16 95% 멀웨어가 뱅킹 Trojan이고, 이 중 98%가 안드로이드를 대상 (2013, KasperSky) https://www.cybersecurityintelligence.com/blog/uk- banks-hit-with-new-zeus-banking-trojan- attacks-707.html
  • 17. STAGEFRIGHT Android 취약점, Stagefright 동영상 등 멀티미디어 파일을 실행할 때 사용되는 미디어 플레이어. DRM 등의 기능 사용 위해 Root 권한으로 실행 문자메시지에 영상이 첨부되어 있을 때, Stagefright는 사 용자가 읽지 않아도 미리 로딩. 해커들이 비디오 및 오디오 파일에 악성 코드를 심어 메시 지를 보내면 스테이지프라이트가 이를 먼저 읽고 감염됨 전화번호만으로 스마트폰 해킹 가능 메시지를 스스로 지우는 기능도 있음 원격으로 애플리케이션(앱)이나 소프트웨어를 실행가능 신용카드 정보, 사진 등 개인정보 노출 우려 메시지를 보내는 순간 작동한다는 점에서 매우 위험 자동 수신 기능을 해제해야 17 “메시지를 받았다는 알림 소리가 들리기 전부터 해킹은 시작된 다”며 “게다가 메시지는 해킹 즉시 삭제돼 어떤 흔적도 남기지 않기 때문 에 이용자들은 해킹이 됐다는 사실조차 모를 가능성 이 크다” “안드로이드폰의 95%가 해킹 공격에 취약하다” (9억5,000만 대) - 모바일 보안 전문업체 짐페리엄, 2015.7 The Stagefright vulnerabilities affect all Android devices running Froyo 2.2 to Lollipop 5.1.1, which covers approximately 95% of all Android devices today.
  • 18. 18
  • 19. STAGEFRIGHT 방어 MMS 자동 수신 때문이므로 자동 수신 막고, 최신 업데이트 필수 안드로이드 스마트폰의 메시지나 구글 행아웃과 같은 메시지 앱을 사용할 경 우, 자동 수신 기능을 해제해야 메신저: 설정 - ‘자동 수신(메시지를 자동으로 수신)’ 기능을 해지. 구글 행아웃: 설정-SMS-고급 메뉴로 들어가 ‘MMS 자동 수신’ 부분에 체크를 풀면 된다. 사용자가 문자를 확인해서 악성코드를 실행하지 않아야 함 스마트폰 제조사의 웹사이트를 통해 해당 취약점에 대한 패치 정보 확인 제조사들은 패치 개발, 배포가 느려 위험성이 커질 전망 구글은 48시간만에 내부 코드에 대한 보안 취약점 패치 패치용 소프트웨어가 배포되려면 오랜 시간이 걸릴 것으로 예상됨 삼성전자는 일부 유럽용 제품에서 해당 패치를 시작. 국내 버전의 배포 시기는 검토중. LG전자의 경우 현재 보안 패치에 대해 개발 중 19
  • 20. 약관, SKP 20 http://www.bloter.net/archives/243208 SK플래닛 관계자의 말 “우리가 수집하는 것은 앱 패키지 이름이나 버전, 설치 경로, 이용 횟수, 이용 시간, 이용 환경 등이고, 사 용자의 정치적 사상이나 신념 등을 수집하지는 않습니다. 버전, 설치 경로, 이용 횟수, 환경 등을 고려해 정치적 성향이나 신념 등을 추측할 가능성이 있음을 고지한 것입니다.”
  • 21. 삼성 스마트 매니저 21 배터리를 효율적으로 사용할 수 있도록 하는 ‘앱 절전’ 기능을 제공 피싱 앱 등 악성 소프트웨어, 특정 앱의 과도한 배터리 사용, 비정상적 오류로 성능 저하를 유발하는 앱 등을 자동으로 검출, 해결 방법을 제시
  • 22. 삼성 스마트 매니저 22 2015년 9월 정기 보안업데이트 과정에서 신형 단말기 뿐만 아니라 노트2, S3 등 구형 단말기에도 스마트 매니저를 확대 적용 이용자 모르는 새 알지 못하는 앱이 설치되고 복구 됨. 잦은 오류 현상 및 기존 보안 앱과 충돌현상. 심하면 단말기 먹통 현상 "현재 국내 보안의 가장 큰 문제점은 이용자가 업데이트 안내에 무조건 '예스맨'이 되 기 때문에 악성 업데이트도 의심없이 하는 것"이라면서 "프로그램 오류가 있다면 신속 하게 업데이트를 하는 것이 마땅하지만, 그 과정에서 원하는 이용자에게 충분한 정보 를 제공하고 오류 사실을 알려야 한다"고 지적 http://www.ddanzi.com/free/52692974#11 http://www.clien.net/cs2/bbs/board.php?bo_table=park&wr_id=42395267 • 디바이스 상태 및 ID 읽기 (발신전화 가로채기) • 내 문자 메시지 읽기 • 사진 및 동영상 촬영, 오디오 녹음 • 대략적인 위치, 정확한 위치 (네트워크기반, GPS) • 연락처데이터 수정, 캘런더 일정 및 비빌 정보 읽기 • 새 웹 북마크 및 기록 추가 • SD 카드의 컨텐트 수정 및 삭제 • 계정 권한 인증서 사용, 계정 만들기 및 비밀번호 변경 • 블루투스 기기 페이링 • …
  • 25. 25
  • 28. ANDROID STUDIO Android Debug Bridge, adb 에물레이터, 연결 기기에 대해 다양한 명령을 실행하기 위한 Unix Shell. adb devices adb shell root@generic_x86:/ # pm list packages ls -al /system/app drwxr-xr-x root root 2015-11-06 00:49 BackupTestApp drwxr-xr-x root root 2015-11-06 00:49 BasicDreams drwxr-xr-x root root 2015-11-06 00:50 Browser drwxr-xr-x root root 2015-11-06 00:50 Calculator drwxr-xr-x root root 2015-11-06 00:50 Calendar drwxr-xr-x root root 2015-11-06 00:49 CaptivePortalLogin drwxr-xr-x root root 2015-11-06 00:49 CertInstaller drwxr-xr-x root root 2015-11-06 00:49 CustomLocale drwxr-xr-x root root 2015-11-06 00:51 DeskClock adb pull /system/app/DeskClock unzip DeskClock.apk -rw-r--r-- 1 chanjinpark staff 22708 2 29 2008 AndroidManifest.xml drwxr-xr-x 5 chanjinpark staff 170 11 16 12:33 META-INF drwxr-xr-x 4 chanjinpark staff 136 11 16 12:33 assets drwxr-xr-x 58 chanjinpark staff 1972 11 16 12:33 res -rw-r--r-- 1 chanjinpark staff 1127228 2 29 2008 resources.arsc 28
  • 29. DROZER 29 https://www.mwrinfosecurity.com/products/drozer/ Mac에서의 설치 - 다운로드: drozer (Python .egg) 21.8 MB - https://github.com/mwrlabs/drozer/blob/develop/ INSTALLING - * Python 2.7 with development headers - * Python Setuptools - $ easy_install --allow-hosts pypi.python.org protobuf==2.4.1 - $ easy_install twisted==10.2.0 - $ easy_install ./drozer-2.3.0-py2.7.egg (egg 파일은 python 설치모듈로, zip으로 압축되어 있음, egg 파일 설 치 시 오류가 날 수 있는데, 이는 egg 파일 내에 requires.txt에서 pyopenssl의 버전을 0.15로 올려주면 됨. 압축 풀고, EGG-INFO 아래 requires.txt에서 pyopenssl==0.15로 수정)
  • 30. DROZER 30 agent.apk를 설치 - Android Studio에서 앱 실행 - adb install agent.apk
  • 31. DROZER 31 drozer agent에 접속 - adb forward tcp:31415 tcp:31415 - drozer console connect 패키지 정보 열거 - dz> run app.package.list - dz> run app.pacakge.list -f contacts dz> run app.package.list com.android.smoketest (com.android.smoketest) com.example.android.livecubes (Example Wallpapers) com.android.providers.telephony (휴대전화/메시지 저장공간) com.android.providers.calendar (캘린더 저장) com.android.providers.media (미디어 저장소) com.android.protips (홈 화면 도움말) com.android.launcher (Launcher) com.android.documentsui (문서) com.android.gallery (카메라) com.android.externalstorage (외부 저장소) com.android.htmlviewer (HTML 뷰어) com.android.quicksearchbox (검색) com.android.mms.service (MmsService) com.android.providers.downloads (다운로드 관리자) com.android.browser (인터넷) com.android.soundrecorder (Sound Recorder)
  • 32. DROZER 32 패키지 세부 사항 보기 - dz> run app.package.info -a contacts 권한을 가진 패키지 열거 (Dangerouse Protection Level) - dz> run app.package.info -p android.permission.CAMERA dz> run app.package.info -a com.android.contacts Package: com.android.contacts Application Label: 주소록 Process Name: com.android.contacts Version: 5.1-1737576 Data Directory: /data/data/com.android.contacts APK Path: /system/priv-app/Contacts/Contacts.apk UID: 10002 GID: [3003, 1028, 1015] Shared Libraries: Shared User ID: android.uid.shared Uses Permissions: - android.permission.CALL_PHONE - android.permission.CALL_PRIVILEGED - android.permission.READ_CONTACTS - android.permission.WRITE_CONTACTS - android.permission.MANAGE_ACCOUNTS - android.permission.GET_ACCOUNTS - android.permission.ACCESS_FINE_LOCATION - android.permission.ACCESS_COARSE_LOCATION - android.permission.READ_PROFILE - android.permission.WRITE_PROFILE - android.permission.INTERNET - android.permission.NFC - android.permission.READ_PHONE_STATE - android.permission.WAKE_LOCK - android.permission.WRITE_EXTERNAL_STORAGE - android.permission.WRITE_SETTINGS - android.permission.USE_CREDENTIALS - android.permission.VIBRATE - android.permission.READ_SYNC_SETTINGS - com.android.launcher.permission.INSTALL_SHORTC - android.permission.READ_CALL_LOG - android.permission.READ_SMS - android.permission.READ_CALENDAR - android.permission.READ_EXTERNAL_STORAGE Defines Permissions: - None • UID - 앱에 부여된 ID • GID - 권한 별 ID • Shared Library - 응용이 사용하는 공유 라이 브러리 • Shared User ID - 패키지명 처럼 식별자로 사 용. 동일 키로 서명된 앱인 경우 공유 User ID 요청 가능 • Uses Permissions: 앱에 허용된 권한 목록 • Defines Permissions: 앱을 사용하기 위해 필 요한 권한 dz> run app.package.info -p android.permission.CAMERA Package: com.android.gallery Application Label: 카메라 Process Name: com.android.gallery Version: 5.1-1737576 Data Directory: /data/data/com.android.gallery APK Path: /system/app/Gallery/Gallery.apk UID: 10005 GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007] Shared Libraries: Shared User ID: android.media Uses Permissions: - android.permission.CAMERA - android.permission.RECORD_AUDIO - android.permission.ACCESS_FINE_LOCATION - android.permission.WAKE_LOCK - android.permission.SET_WALLPAPER - android.permission.WRITE_EXTERNAL_STORAGE - android.permission.READ_SMS - android.permission.READ_EXTERNAL_STORAGE Defines Permissions: - None … Package: com.android.browser … Package: com.android.camera …
  • 33. DROZER 33 Activity 열거 - dz> run app.activity.info —filter browser - dz> run app.activity.info -f message - dz> run app.activity.info -a com.android.browser dz> run app.activity.info -f message Package: com.android.contacts alias.MessageShortcut Permission: Target Activity: com.android.contacts.activities.ContactSelectionActivity Package: com.android.mms com.android.mms.ui.ComposeMessageActivity Parent Activity: com.android.mms.ui.ConversationList Permission: com.android.mms.ui.ManageSimMessages Permission: Package: com.example.android.apis com.example.android.apis.app.IncomingMessage Permission: dz> run app.activity.info -a com.android.browser Package: com.android.browser com.android.browser.BrowserActivity Permission: com.android.browser.ShortcutActivity Permission: com.android.browser.BrowserPreferencesPage Permission: com.android.browser.BookmarkSearch Permission: com.android.browser.AddBookmarkPage Permission: com.android.browser.widget.BookmarkWidgetConfigure Permission:
  • 35. ANDROID 아키텍처 리눅스 커널 리눅스 OS 하드웨어 제어, 네트워킹, 파일시스템, 프로세스 관리 일반 리눅스와 다른점 Low Memory Killer, Wakelock, Anonymous shared memory (ashmem), Paranoid networking, Binder 등 보안 관련해서는 바인더와 네트워킹이 이슈 바인더는 프로세스 간 통신 (like Socket, D-bus, RPC …) 패러노이드 네트워킹은 특정 권한을 가진 앱에게만 네트워 크 소켓 접근을 허용 (호출자 프로세스에 따라 네트워크 접 근 제한) 35 LMK: 메모리 부족 시 앱을 중지시키는 정책 (Linux OOM + 우선순위기반) wakelock: 백그라운드로 음악을 들을 때. 데이터동기화 중 Sleep 방지 AshMEM: 앱 간 통신을 위한 공유 메모리 (자동 해제)
  • 36. ANDROID 아키텍처 Native Userspace Init은 부팅 후 최초 실행 프로세스. 다른 프로세스를 포크 (batch 파일) SQLite, WebKit, MediaFramework(Stagefright),… 달빅 런타임 자바가상머신 (최근 ART) 자바런타임 라이브러리 jar 파일들 System services 4.4에서는 79개 서비스 (C/C++) 화면 관리, 터치스크린, 전화, 네트워크 연결 등 안드로이 핵심 기능을 구현. 프로세스 간 통신 인터페이스를 제공 Binder를 통해 서비스를 찾고, 연결하고, 호출함 36
  • 37. ANDROID 아키텍처 IPC 프로세스 간 통신. 프로세스 Isolation 메모리 접근 불가 => 보안과 안정성. 메모리 접근 가능하다면 악성 프로세스가 이메일 클라이언트의 메모리에 접근해서 메일을 유출. 프로세스 간 데이터를 주고 받거나 신호를 보내고 받는 기술 파일, 시그널, 파이프, 세마포어, 공유메모리, 메시지 큐 등은 안 드로이드에서는 거의 지원하지 않음 => 바인더 활용 Binder COM, CORBA와 유사하나 RPC는 지원하지 않음 /dev/binder Intent, Messenger, Content Provider가 바인더를 이용해 상 위 수준 프로세스 간 커뮤니케이션을 구현 37 A에서 B 호출: B 프로세스의 메모리에 공간을 할당. A에서 B에 보내 는 데이터를 복사. B 프로세스에게 호출을 알림. B는 자신의 공간에 있는 데이터를 사용. 데이터 사용 완료 알림. 보안) A가 B의 메소드를 호출할 때, A의 PID와 EUID를 커널이 찾아 서 채워 넣음 (허용된 권한 이상의 일을 하지 못함). 권한 상승을 금 지 (sudo).
  • 38. ANDROID 아키텍처 안드로이드 프레임워크 안드로이드 앱을 만들기위해 필요한 기본 클래스들의 집합 시스템 서비스를 직접 사용하지 않고, 프레임워크를 통해 사 용 e.g. BluetoothManager, ActivityManager, PacakgeManager, LocationManager, … 앱 시스템 앱 OS 이미지에 포함된 앱. 읽기 전용. /system 폴더에 있어 제거/변경 안됨. 안전하다고 가정하 며, 사용자 설치 앱보다 더 많은 권한을 가짐. 사용자 설치 앱 /data 폴더에 읽기/쓰기 파티션에 설치됨. 전용 보안 샌드박스에 설치되어 다른 앱에 영향을 주거나 데 이터를 가져올 수 없음. 권한 분리 (Privilege Separation)와 최소 권한 (Principle of Least Privilege)”의 원칙이 보안 모델의 핵심 38
  • 39. APP LIFECYCLE 39 foreground & background => onPaused, onResume 액티비티가 다른 액티비티를 실행하면, 스택의 맨 위로 올라감 사용자가 뒤로 가기를 누르면, 맨 위의 액티비티가 소멸되고 이전 액티비티 상태로 복귀
  • 40. ANDROID 아키텍처 앱 컴포넌트 AndroidManifest.xml 컴포넌트 목록, 컴포넌트 진입점 및 메타 데이터 등. APK 패키지 파일에 포함됨. 패키지명은 com.google.email과 같은 URL. 앱이 설치될 때 파싱되어 패키지와 컴포넌트가 시스템에 등록됨 (개발자 키를 이용해서 앱을 서명하도록 요구됨) 40 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.chanjinpark.myapplication" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> apktool: APK는 컴파일된 코드, Decompiler http://ibotpeaches.github.io/Apktool/install/ 로부터 script와 jar 파일 다운로드 apktool d DeskClock/AndroidManifest.xml
  • 41. 앱은 컴포넌트의 조합으로 개발됨 Activity 화면 윈도우, 앱은 여러 개 Activity를 가질 수 있음 Service UI 없이 백그라운드 실행 (프로세스 혹은 쓰레드), 파일 다운로드, 음악 재생 AIDL을 사용 다른 서비스 혹은 앱이 호출할 수 있도록 함 (재생 중단) 시스템 서비스는 데몬처럼 항상 실행, 앱 서비스는 요청에 따라 시작 /종료 Broadcast Receiver 시스템 전체에 전달되는 이벤트에 응답하는 컴포넌트로, 앱/서비스 로부터의 브로드캐스트 메시지를 받기위한 Listener 구현 일종의 시스템 수준 intent로, Activity 실행 시킬 수는 없음 배터리 부족, SMS 메시지 도착, 네트워크 연결 상태 변화를 알림 등 Content provider 데이터 제공자. 연락처, 캘린더 등 DB 혹은 파일에 저장된 앱 데이터를 다루는 인터페이스 제공 데이터를 앱과 공유하기 위해 사용. 41 http://designthing.net/the-basic-components-in-an-android-app/ http://developer.android.com/intl/ko/guide/components/index.html Application AndroidManifest.xml Activity Service Broadcast Receiver Content Provider
  • 42. 42 AndroidManifest.xml Activity Service Broadcast Receiver Content Provider <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.calendar" android:sharedUserLabel="@string/app_label"> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name=“android.permission.MANAGE_ACCOUNTS"/> … <application android:name=“CalendarApplication" … <activity android:name=“AllInOneActivity" … <intent-filter> <action android:name="android.intent.action.MAIN" /> … <service android:name=".alerts.AlertService" /> … <receiver android:name=".alerts.AlertReceiver"> <intent-filter> <action android:name="android.intent.action.EVENT_REMINDER" /> … <provider android:name=".CalendarRecentSuggestionsProvider" android:exported=“false" … … </application> </manifest>
  • 43. Intent 컴포넌트 간 연동 방식 (인텐트 메시지) 서비스를 실행시켜 일회성 작업을 수행할 때 Intent 사용. 연결되어 작업을 하기 위해서는 해당 서비스에 바인딩 (bindService) 명시적 인텐트는 특정 Activity 혹은 Service를 명시하고 인텐 트를 보냄 암시적 인텐트는 특정 컴포넌트 식별 없이 일반적인 작업을 요 청 (위치 표시 요청 => 맵 기능을 가진 앱이 이를 받아서 처리. 여러 개면 사용자에게 물어봄) 43 1. 인텐트를 만들어 보냄 2. 시스템은 인텐트 필터를 살펴서 액티비티를 실행 3. 액티비티의 onCreate 함수 코드 실행 Google Now의 음성 명령 Alarm Set alarm "set an alarm for 7 am” AlarmClock.ACTION_SET_ALARM Set timer "set a timer for 5 minutes” AlarmClock.ACTION_SET_TIMER 암시적 인텐트, android.content.Intent.ACTION_SEND, video/*
  • 44. 안드로이드 보안 모델 리눅스 User ID를 앱 식별자로 사용 User ID로 사용자 격리 리눅스 운영체제에서 다른 사용자 파일에 접근 불가 프로세스는 실행한 계정의 UID (GID)에 기반하여 파일에 접근함. 루트 권한 프로세스는 모든 파일에 접근 및 수정 가능 프로세스 간에는 내부 코드 실행 불가 (프로세스 간 통신 메커니즘 사용해서 통신, Binder) 안드로이드는 폰을 위해 설계 단일 사용자를 가정함 리눅스 UID는 앱을 구분하는 용도로 사용함 (앱 격리). 프로세스 수준의 보안 정책 사용 (User ID, Group ID) 44
  • 45. 앱 샌드박스 앱을 설치하면, App ID라는 고유 UID를 자동으로 할당하고 UID로 실행되는 프로세스 내에 앱을 실행시킴. 앱은 자신만이 읽고 쓸 수 있는 전용 디렉터리를 부여 받음 프로세스 수준과 파일 수준에서 샌드 박스 됨. 시스템 데몬과 시스템 앱은 미리 정의됨 고정 UID를 가짐. 극히 일부만 루트 사용자 ID를 가짐 (UID 0) 시스템 UID는 1000번 부터 시작 (AID_SYSTEM) 설치 앱 UID는 10000번 부터 시작 (AID_APP) 시스템 UID는 android_filesystem_config.h에 정의됨 45 Chanjinui-MacBook-Pro:d chanjinpark$ adb shell ps | grep deskclock u0_a24 2272 968 600720 33980 sys_epoll_ b72e51c5 S com.android.deskclock Chanjinui-MacBook-Pro:d chanjinpark$ adb shell ls -al /data/data/com.android.deskclock drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 cache drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 code_cache drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 databases drwxrwx--x u0_a24 u0_a24 2015-11-16 10:51 shared_prefs
  • 46. 권한이란? 권한 권한 = 실행 가능한 연산에 대한 문자열 앱 설치 시 권한 지정되고 변경되지 않음 각 앱은 자신의 파일과 공개허용 리소스 만 접근 가능 (my own & public) 앱 설치 시 기능 사용을 위한 필요한 권한을 요청 하드웨어 장치, 인터넷 연결, 데이터 혹은 OS 서비스 위험한 권한인 경우, 사용자에게 확인 요청함 http://developer.android.com/intl/ko/guide/topics/ security/permissions.html#normal-dangerous SD 카드 등 물리적 자원, 연락처 등의 공유 데이터에 대한 접 근. 서드 파티 앱에 있는 컴포넌트 실행 및 접근 등 권한 예 패키지명.permission.권한명 REBOOT, BIND_VPN_SERVICE는 내장권한. GALLERY_PROVIDER, RECEIVE_LAUNCH_BROADCASTS는 각 앱에 정의된 권한 임 46 root@generic_x86:/data/system # pm list permissions -u Dangerous and Normal Permissions: permission:android.permission.ACCESS_WIMAX_STATE permission:android.permission.RESTART_PACKAGES permission:android.permission.USE_CREDENTIALS permission:android.permission.MODIFY_AUDIO_SETTINGS permission:android.permission.ACCESS_NOTIFICATION_POLICY permission:android.permission.MANAGE_ACCOUNTS permission:android.permission.NFC permission:android.permission.PERSISTENT_ACTIVITY permission:android.permission.WRITE_SYNC_SETTINGS permission:android.permission.RECEIVE_BOOT_COMPLETED permission:android.permission.SUBSCRIBED_FEEDS_READ permission:android.permission.SET_TIME_ZONE permission:android.permission.EXPAND_STATUS_BAR permission:com.android.launcher.permission.UNINSTALL_SHORTCU T permission:android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZ ATIONS permission:android.permission.READ_PROFILE permission:android.permission.BLUETOOTH …
  • 47. 설치 시 필요 권한 요청 권한 요청 앱은 AndroidManifest.xml 파일에 필요한 권한을 지정. 앱은 하나 이상의 <uses-permission> 태그를 추가해서 권한 을 요청 앱 설치 시에 앱 요구 권한을 검사. 사용자가 허용할 지 말 지를 결정 일단 허용되면 취소 불가. 앱은 추가 확인 없이 행사. 하지만, 개인 키 및 사용자 계정에 접근하는 기능을 요청하면 앱에 권한을 주었다고 할 지라도 접근 시 마다 사용자 확인을 거쳐야 함. 47
  • 48. 시스템의 권한 관리 (패키지 매니저) 권한 관리 앱 설치 시 시스템 패키지 매니저 서비스가 권한을 부여함 패키지 매니저 모든 패키지의 설치 경로, 버전, 서명 인증서, 할당된 권한 DB 관리. /data/system/packages.xml 파일에 저장됨. 앱 설치/갱신/제거 시 마다 업데이트 com.google.android.apps.translate UID - 앱의 ID, 10204 서명인증서 (certification) 앱의 요청 권한 48 <package name="com.example.chanjinpark.myapplication" codePath="/data/app/ com.example.chanjinpark.myapplication-1" nativeLibraryPath="/data/app/ com.example.chanjinpark.myapplication-1/lib" publicFlags="940097092" privateFlags="0" ft="1510ed4ecb0" it="1510ed4fea1" ut="1510ed4fea1" version="1" userId="10062"> <sigs count="1"> <cert index="6" key=“308203773082025fa0…” /> </sigs> <perms> <item name="android.permission.INTERNET" granted="true" flags="0" /> <item name="android.permission.CAMERA" granted="true" flags="0" /> </perms> <proper-signing-keyset identifier="12" /> </package>
  • 49. 권한의 보호 수준, PROTECTION LEVEL 권한 보호 수준 권한에 따른 잠재적 위험을 명백히 나타내고 시스템이 권 한 허용 여부를 판단할 때 따라야하는 절차 4가지 보호 수준 normal: 위험이 적은 권한 요청에 대해. 사용자의 동의없 이 자동으로 권한 부여. ACCESS_NETWORK_STATE, GET_ACCOUNT (계정 목 록을 읽음) dangerous: 사용자 데이터 접근 혹은 일부 디바이스 제어 가능 권한 요청 설치 시 요청된 권한에 대해 확인 창으로 사용자 승인 받음 READ_SMS, CAMERA, … signature: 권한을 선언한 앱과 동일 키로 서명된 앱에만 부여. 가장 강력한 보호 수준. 앱/플랫폼 개발자만 갖고 있는 암호 키 필요. NET_ADMIN, ACCESS_ALL_EXTERNAL_STORAGE. signatureOrSystem: 동일 키 signature 체크 없이 시스 템 디렉터리에 설치된 앱은 권한 부여 49 <permission android:name="android.permission.INTERNET" android:description="@string/permdesc_createNetworkSockets" android:label="@string/permlab_createNetworkSockets" android:protectionLevel="normal" /> <permission android:name="android.permission.CAMERA" android:permissionGroup="android.permission-group.CAMERA" android:label="@string/permlab_camera" android:description="@string/permdesc_camera" android:protectionLevel="dangerous" /> <permission android:name="android.permission.REBOOT" android:protectionLevel="signature|privileged" /> <permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT" android:protectionLevel="signature" /> /system/framework/framework-res.apk 내의 AndroidManifest.xml 파일
  • 50. 권한으로 보호하기 액티비티 및 서비스 권한 액티비티와 서비스는 사용자 권한으로 보호 START_MY_ACTIVITY USE_MY_SERVICE 다른 앱에서 액티비티 및 서비스 사용 시 권한 요청이 필요 <uses-permission> 브로드캐스트 권한 수신자 및 발신자 모두 권한 지정 가능 발신자는 등록된 모든 앱에게 전송 혹은 수신자 권한으로 필터링 가능 수신자는 발신자가 가져야 하는 권한을 지정하여 브로드캐 스트에 등록 50
  • 51. 패키지 관리 앱 패키지 구성 APK: 앱 코드 및 리소스, 매니페스트 파일을 포함하는 컨 테이너 코드 서명 APK 서명 인증서 서드파티 프로그램을 실행하기 전에 이 프로그램이 개발 자 릴리스 후 변경되지 않았는 지 (무결성), 실제 그 생성 자에 의해 만들어졌는 지 확인이 필요 (Authenticity). 디지털 서명 체계: 서명 키를 소유한 개체만 정당한 코드 서명을 생성할 수 있도록 보장 서명검증절차 코드가 변경되지 않았는지, 서명이 올바른 키로 생성되 었는 지 확인 코드 서명자를 믿을 수 있는 지가 중요. 코드 서명자는 디 지털 서명서를 가지고 있고, 코드에 이를 첨부해야. 51 META-INF * MANIFEST.MF : 파일 목록 * CERT.RSA : 앱 서명 * CERT.SF : 리소스 목록과 Manifest.MF 파일의 SHA-1 다이제스트
  • 52. 앱 서명 코드 서명과 플랫폼 키 모든 앱이 설치되기 위해서는 디지털 서명이 필요 App Signing 앱 저작자임을 증명하는 인증서가 필요 공증할 수도 있으나, 개발자 서명으로도 가능 (개발자는 인 증서의 Private Key를 관리해야 함) 동일 개발자만 앱을 업데이트할 수 있게 함 현재 설치된 대상 앱의 서명 인증서와 업데이트할 앱의 인 증서를 비교. 동일 개발자가 다른 앱을 작성해서 기존 앱과 연동할 때 앱 간 신뢰 관계를 설정 시스템 앱은 여러 플랫폼 키로 서명됨 동일 키로 서명된 시스템 컴포넌트 끼리는 리소스를 공유하 고 같은 프로세스 안에서 실행됨. 키는 제조사, 통신사, 구글 등 안드로이드 버전을 유지하는 사람이 생성, 관리 52
  • 53. APK 설치 APK 설치 경로 구글 플레이 스토어에서 앱설치 (혹은 사설 앱 스토어) 폰으로 다운로드한 앱 파일을 열어 디바이스에 직접 설치 USB를 통해 adb install 명령으로 설치 안드로이드 쉘을 이용해 APK 파일을 시스템 앱 디렉터리 에 바로 복사 패키지 설치 관리 APK 파일을 앱 디렉터리에 직접 복사하면 패키지 매니저 가 탐지해서 설치함 (앱 디렉터리의 변경을 알림 받음) installPackage 메소드를 호출. APK를 앱 디렉터리에 복 사/설치 시스템 앱과 사용자 설치 앱은 위치가 다름. 시스템 앱은 변경/제거 불가 53 실선은 함수호출, 점선은 컴포넌트에서 사용하는 파일/디렉터리 접근
  • 54. 알 수 없는 출처의 앱 설치 (Side Loading) 구글 Play 외 다른 출처로부터 앱 설치 보안 상의 이유로 Disabled (디폴트) - 멀웨어 설치 방지 설정 앱에서 보안/알수없는출처를 Enable 54 Unkown sources Allow installation of apps from unknown sources
  • 56. ANDROID SECURE CODING STANDARD & GUIDE 56 일본 스마트폰 보안 포럼, Japan Smartphone Security Forum http://www.jssec.org/dl/ android_securecoding_en.pdf Android-JAVA 시큐어 코딩가이드 http://www.securitya.kr/eduwiz/bb/bbs/ board.php?bo_table=c403&wr_id=12 안드로이드 보안 팁 (구글) http://developer.android.com/intl/ko/training/ articles/security-tips.html Android Security and Secure Coding Techniques (동영상) https://www.youtube.com/playlist? list=PLyUlngzGzkzsXHItNSx_KPyC62hsrAgrK 미국, SEI CERT Division https://www.securecoding.cert.org/ confluence/display/android/Android+Secure +Coding+Standard Android Secure Coding (발표자료) http://www.slideshare.net/jpcert_securecoding/ all-for-attendee
  • 57. CONTENT PROVIDER 다른 앱과의 데이터 공유 시 사용 내부적으로 사용 가능- 검색, 복사/붙여넣기 등 다른 앱의 데이터를 읽고, 쓰기 위해서는 권한이 필요 예를 들어, 주소록, 일정, 이미지 등 주소록에 대해, URI, 데이터필드 이름 및 타입이 필요 ContactsContract.Contacts.CONTENT_URI ContactsContract.Contacts.DISPLAY_NAME String 57 콘텐트 제공자의 권한 설정 - Contacts 예 READ_CONTACTS 권한가진 앱은 query만, WRITE_CONTACTS을 가지면, insert, update, delete 가능 * 주소록의 모든 사진을 검색하려면 GLOBAL_SEARCH 권한을 가져야함
  • 58. CONTENT PROVIDER 58 ContentResolver cr = getContentResolver(); Uri uri = Calendars.CONTENT_URI; // String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND (" + Calendars.ACCOUNT_TYPE + " = ?) AND (" + Calendars.OWNER_ACCOUNT + " = ?))"; String[] selectionArgs = new String[] {"sampleuser@gmail.com", “com.google", "sampleuser@gmail.com"}; // Submit the query and get a Cursor object back. Cursor cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null); App BApp A Content Provider Activity Database (SQLite), Files, XML, … Activity ContentResolver & Cursor URIQuery Insert Update Deleate URI content://com.android.calendar/calendars Schema + Authority + Path Path는 테이블의 이름 SELECT ( <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"...> <uses-sdk android:minSdkVersion="14" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> ... 캘린더 데이터 접근을 위한 권한 설정 <application android:process="com.android.calendar" android:label="@string/calendar_storage" android:icon="@drawable/app_icon"> … <provider android:name="CalendarProvider" android:authorities="calendar" android:label="@string/provider_label" android:multiprocess="false" android:readPermission="android.permission.READ_CALENDAR" android:writePermission="android.permission.WRITE_CALENDAR" />
  • 59. CONTENT PROVIDER 앱의 콘텐트 제공자 접근성을 제한 DRD01-X. Limit the accessibility of an app's sensitive content provider 콘텐트 제공자는 데이터를 다른 앱과 공유 하기 위한 방법 중요 정보에 대한 접근 권한을 잘 통제해야 콘텐트 제공자 접근 통제: Public, Private, Restricted access MovatwiTouch 트위터 클라이언트 앱. 사용자 키, 액세스 토큰을 콘텐트 제공자로 구현. Public으로 구현하여 사용자 정보를 노출시킴 android:exported 속성을 지정하지 않으 면, Android SDK Level 16 (젤리빈 4.1) 까 지 Public으로 간주 59 <provider android:exported="true" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" /> <provider android:exported="false" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" /> export를 false로 하면 앱 내부에서만 사용. 꼭 필요한 경우에 exported // extract account data through content provider Uri uri = Uri.parse("content://jp.co.vulnerable.accountprovider"); Cursor cur = getContentResolver().query(uri, null, null, null, null); StringBuilder sb = new StringBuilder(); if (cur != null) { int ri = 0; while (cur.moveToNext()) { ++ri; Log.i(TAG, String.format("row[%d]:", ri)); sb.setLength(0); for (int i = 0; i < cur.getColumnCount(); ++i) { String column = cur.getColumnName(i); String value = cur.getString(i); if (value != null) { value = value.replaceAll("[rn]", "");} Log.i(TAG, String.format("t%s:t%s", column, value)); } } } else { Log.i(TAG, "Can't get the app information."); } <provider android:name=".content.AccountProvider" android:authorities="jp.co.vulnerable.accountprovider" /> android:exported의 디폴트 값은 true (젤리빈까지, 4.1)
  • 60. CONTENT PROVIDER 콘텐트 제공자가 받는 URL 경로는 정식 표현인 지 체크 DRD08-J. Always canonicalize a URL received by a content provider 콘텐트 제공자는 디렉토리 탐색 취약점을 가질 수 있음 파일 경로 체크해서 정해진 디렉터리를 벗 어난 파일 접근을 차단해야 함 GREE (jp.gree.android.app) Mobile social gaming app 앱 Private 파일 공개 위험 60 private static String IMAGE_DIRECTORY = localFile.getAbsolutePath(); public ParcelFileDescriptor openFile(Uri paramUri, String paramString) throws FileNotFoundException { File file = new File(IMAGE_DIRECTORY, paramUri.getLastPathSegment()); return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); } // getLastPathSegment 구현 로직 while ((current = path.indexOf('/', previous)) > -1) { if (previous < current) { String decodedSegment = decode(path.substring(previous, current)); segmentBuilder.add(decodedSegment); } previous = current + 1; } 콘텐트 제공자 구현 상의 문제 (openFile) ../../../data/data/com.example.android.app/shared_prefs/Example.xml 상대경로를 통한 앱 Private 데이터 탐색 경로가 URL 인코딩되어 있으면, %2F가 /를 의미함. getLastPathSegment는 파일 명 파악 불가 ..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml
  • 61. CONTENT PROVIDER 61 private static String IMAGE_DIRECTORY = localFile.getAbsolutePath(); public ParcelFileDescriptor openFile(Uri paramUri, String paramString) throws FileNotFoundException { File file = new File(IMAGE_DIRECTORY, Uri.parse(paramUri.getLastPathSegment()).getLastPathSegment()); return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); } 그러면, Uri.parse를 통해 URL 디코딩하고 파일 명 찾으면? 더블 인코딩해서 위 두 번 getLastPathSegment하는 것을 무력화할 수 있음. 두 번 URL decoding해야 원래 문자열을 구함 %252E%252E%252F%252E%252E%252F%252E%252E%252Fdata%252Fdata%252Fcom.example.android.app%252Fshared_prefs%252FExample.xml ..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app%2Fshared_prefs%2FExample.xml ../../../data/data/com.example.android.app/shared_prefs/Example.xml private static String IMAGE_DIRECTORY = localFile.getAbsolutePath(); public ParcelFileDescriptor openFile(Uri paramUri, String paramString) throws FileNotFoundException { String decodedUriString = Uri.decode(paramUri.toString()); File file = new File(IMAGE_DIRECTORY, Uri.parse(decodedUriString).getLastPathSegment()); if (file.getCanonicalPath().indexOf(localFile.getCanonicalPath()) != 0) { throw new IllegalArgumentException(); } return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); } getCanonicalPath를 사용하여 잘못된 사용을 걸러내야 함 (URL 인코딩된 문자열은 잘못된 인자 예외를 발생 시켜 배제) Canonical Path는 경로에 대한 정식표현이고, getCanonicalPath 함수는 .. 이나 . 과 같은 상대 경로 표현 제거하고 절대 경로를 표시 디렉터리를 비교해서 IMGAGE_DIRECTORY 외에 다른 디렉터리 참조를 방지
  • 62. ACTIVITY 중요 액티비티에 대한 접근 제한 DRD09. Restrict access to sensitive activities 인텐트 필터를 정의하면, 다른 앱에 액티비티 가 노출됨 액티비티의 외부 앱 노출에 대한 디폴트 값은 인텐트 필터를 가지고 있는가에 따라 다름 62 <activity android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/ Vulnerable.Dialog" android:windowSoftInputMode="stateAlwaysHidden"> <intent-filter android:icon="@drawable/yfrog_icon" android:label="@string/YFROG"> <action android:name="jp.co.vulnerable.ACTION_UPLOAD" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> </intent-filter> </activity> 액티비티에 대한 전체 이름은 jp.co.vulnerable.media.yfrog.YfrogUploadDialog. 인텐트 필터가 정의되었으므로, 이 액티비티는 다른 앱에 노출됨 사진 업로드 액티비티는 원래 앱 내부에서 사용하기 위해 설계 됨 이 액티비티가 외부 앱에 노출됨에 따라, 경로가 파악되거나 만들어진 사진을 악의적 으로 업로드 할 수 있게됨
  • 63. ACTIVITY Activity exported를 false로 하거나, 액티 비시 실행 요청자에 대한 동적 체크 Twicca 앱 (0.70 ~ 0.9.30) 액티비티를 실행 시켜, SD 카드나 네트워크 에 접근 권한이 없는 앱이 SD 카드 상의 이 미지나 동영상을 Twicca 사용자의 트윗 계 정으로 소셜 네트워킹 서비스에 올릴 수 있 게 함. 63 <activity android:configChanges="keyboard|keyboardHidden|orientation" android:name=".media.yfrog.YfrogUploadDialog" android:theme="@style/ VulnerableTheme.Dialog" android:windowSoftInputMode="stateAlwaysHidden" android:exported="false"> </activity> exported = “false” 로 설정 public void onCreate(Bundle arg5) { super.onCreate(arg5); ... ComponentName v0 = this.getCallingActivity(); if(v0 == null) { this.finish(); } else if(!jp.r246.twicca.equals(v0.getPackageName())) { this.finish();} else { this.a = this.getIntent().getData(); if(this.a == null) { this.finish(); } ... } } } 호출 시 동일 패키지 (앱)에서 호출되었는 지를 체크
  • 64. FILE I/O AND LOGGING 중요 정보를 외부 저장소에 두면 안됨 DRD00. Do not store sensitive information on external storage (SD card) unless encrypted first 외부 저장소에 저장된 파일은 World Readabble (4.1 까지) 친구 정보, IMEI (Int. Mobile Equipment Id.)를 sdcard에 저장한 사례 64 private String filename = "myfile" private String string = "sensitive data such as credit card number" FileOutputStream fos = null; try { file file = new File(getExternalFilesDir(TARGET_TYPE), filename); fos = new FileOutputStream(file, false); fos.write(string.getBytes()); } catch (FileNotFoundException e) { // handle FileNotFoundException } catch (IOException e) { // handle IOException } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { } } } 외부 저장소에 파일을 생성
  • 65. 4.1 버전 이 후부터 다른 앱이 읽고/쓰지 못 하도록 파일 모드 및 UID 적용 하지만, PC에서 읽거나, 빼서 Mount할 수 있음 #1: 파일을 내부 저장소에 저장 Context.MODE_PRIVATE으로 파일 새성 MODE_PRIVATE MODE_WORLD_READABLE MODE_WORLD_WRITABLE #2: 암호화할 것 65 private String filename = "myfile" private String string = "sensitive data such as credit card number" FileOutputStream fos = null; try { fos = openFileOutput(filename, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); } catch (FileNotFoundException e) { // handle FileNotFoundException } catch (IOException e) { // handle IOException } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { } } } 앱 Private 저장소에 파일을 생성
  • 66. FILE I/O AND LOGGING 중요 정보는 로그로 남기면 안됨 DRD04-J. Do not log sensitive information 앱에서 로그를 남길 수 있음. android.util.Log 클래스. Log.d (Debug) Log.e (Error) Log.i (Info) Log.v (Verbose) Log.w (Warn) 로그 정보는 공유 자원으로 다른 앱에서 읽 을 수 있음 66 Log.v("method", Login.TAG + ", account=" + str1); Log.v("method", Login.TAG + ", password=" + str2); • 디버깅 목적으로 로깅 사용 (계정 정보를 로그로 남김) • 릴리스 (배포)된 앱에서 디버깅 코드를 제거하지 않음 • READ_LOGS 권한을 가진 앱은 로그 결과를 볼 수 있음 <uses-permission android:name="android.permission.READ_LOGS"/> 로그 읽기를 위한 권한 요청 (READ_LOGS) Process mProc = Runtime.getRuntime().exec( new String[]{"logcat", "-d", "method:V *:S$Bc`W^(B)"}); BufferedReader mReader = new BufferedReader( new InputStreamReader(proc.getInputStream())); 앱에서 logcat 실행 어느 앱이라도 권한을 가지면 로그를 읽을 수 있음
  • 67. 중요 정보는 로그로 남기면 안됨 안드로이드 4.0까지 READ_LOGS 권한을 가진 앱은 로그 정보 알수 있었으나, 4.1부 터는 다른 앱의 로그는 볼 수 없게 수정됨 하지만, PC 연결 시 로그 정보 읽기 가능 67 Log.d("Facebook-authorize", "Login Success! access_token=" + getAccessToken() + " expires=" + getAccessExpires()); Facebook SDK 액세스 토큰, 2012.4 I/MyWeatherReport( 6483): Re-use MyWeatherReport data I/ ( 6483): GET JSON: http://example.com/smart/repo_piece.cgi? arc=0&lat=26.209026&lon=127.650803&rad=50&dir=-999&lim=52&category=1000 위치정보 노출 (Weathernews Touch 앱) 중요 정보 로그 누출 취약점 예 StringBuilder slog = new StringBuilder(); Process mLogcatProc = Runtime.getRuntime().exec(new String[] {"logcat", "-d", "LoginAsyncTask:I APIClient:I method:V *:S" }); BufferedReader reader = new BufferedReader(new InputStreamReader( mLogcatProc.getInputStream())); String line; String separator = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { slog.append(line); slog.append(separator); } Toast.makeText(this, "Obtained log information", Toast.LENGTH_SHORT).show(); TextView tView = (TextView) findViewById(R.id.logView); tView.setText(slog); 로그 읽어서 토스트로 보여주는 예
  • 68. INTENT 암시적 인텐트로 중요정보를 브로드캐스 트하면 안됨 DRD03-J. Do not broadcast sensitive information using an implicit intent 어떤 앱이라도, 브로드캐스트 정보를 알수 있으므로, 중요 정보인 경우 수신자를 제한 할 필요. NHN Japan Corporation, LINE 68 public class ServerService extends Service { // ... private void d() { // ... Intent v1 = new Intent(); v1.setAction("com.sample.action.server_running"); v1.putExtra("local_ip", v0.h); v1.putExtra("port", v0.i); v1.putExtra("code", v0.g); v1.putExtra("connected", v0.s); v1.putExtra("pwd_predefined", v0.r); if (!TextUtils.isEmpty(v0.t)) { v1.putExtra("connected_usr", v0.t); } this.sendBroadcast(v1); } } 인텐트를 만들어 브로드캐스트하는 예 (com.sample.action.server_running 작업) final class MyReceiver extends BroadcastReceiver { public final void onReceive(Context context, Intent intent) { if (intent != null && intent.getAction() != null) { String s = intent.getAction(); if (s.equals("com.sample.action.server_running") { String ip = intent.getStringExtra("local_ip"); String pwd = intent.getStringExtra("code"); String port = intent.getIntExtra("port", 8888); boolean status = intent.getBooleanExtra("connected", false); } } } } 브로드캐스트된 인텐트를 받아서 처리 (manifest.xml 파일에 receiver 등록)
  • 69. INTENT 중요정보가 포함된 인텐트는 암시적 인 텐트를 사용하면 안됨 명시적 인텐트 혹은 권한으로 통제 동일 앱 내에서만 브로드캐스트 할 경우, LocalBroadcastManager를 사용. 69 // Create the text message with a string Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Verify that the intent will resolve to an activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent); } 암시적 인텐트 예 (ACTION_SEND를 receive하는 모든 앱에 전달) // Executed in an Activity, so 'this' is the Context // The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse(fileUrl)); startService(downloadIntent); 명시적 인텐트 예 (클래스 명 혹은 activity/service 명을 지정) intent.setComponent( new ComponentName("packagename","fullyqualifiedactivityname")); Intent intent = new Intent("my-sensitive-event"); intent.putExtra("event", "this is a test event"); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); LocalBroadcastManager를 사용하여 앱 내부에서만 수신하도록 함
  • 70. WEBVIEW 웹뷰의 로컬 파일 접근을 제한 DRD02-J. Do not allow WebView to access sensitive local resource through file scheme 웹뷰는 웹페이지를 앱의 액티비티 내에 보여줌 보안 취약점은 setJavaScriptEnabled(), setPluginState(), and setAllowFileAccess() 메소드와 관련 webview.getWebSettings().setJavaScriptEna bled(true) - JavaScript 허용 setPluginState(ON) - 플러그인 허용 setAllowFileAccess() - 파일 접근 허용 액티비티가 WebView를 내장하면, 다른 앱이 URI를 가진 Intent를 보내서 웹 페이지를 제어 가 능함. 로컬 파일을 통해 중요 정보가 로드되지 않도록 해야 함 70 webView.loadUrl(turl)을 수행할 때, 다른 앱에서 전달된 turl 문자열을 체크없이 사용하면, 악성 HTML을 로드할 수 있음. 특히, 디바이스 로컬 파일을 웹뷰로 실행시킬 수 있음. HTML은 JavaScript 코드를 포함하여 내부 데이터를 다른 사이트로 전달할 수 있음 https://developer.chrome.com/multidevice/webview/gettingstarted
  • 71. 71 // 악성 웹 페이지를 로컬 스토리지에 준비해두었다가, 다음 코드를 통해 // 인텐트를 보냄. JavaScript가 Enabled되어 있으면, 악성 코드 실행 가능 String pkg = "jp.vulnerable.android.app"; String cls = pkg + ".DummyLauncherActivity"; String uri = "file:///[crafted HTML file]"; Intent intent = new Intent(); intent.setClassName(pkg, cls); intent.putExtra("URL", uri); this.startActivity(intent); public class MyBrowser extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView webView = (WebView) findViewById(R.id.webview); // turn on javascript WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); String turl = getIntent().getStringExtra("URL"); webView.loadUrl(turl); } } 별도 체크 없이 인자 turl을 로드 String intentUrl = getIntent().getStringExtra(“URL"); String localUrl = "about:blank"; if (!intentUrl.startsWith("file:")) { loadUrl = intentUrl; } file:로 시작하는 url은 로드하지 않도록 (http: 등 외부 사이트만 로드)
  • 72. 배포 앱 배포 시 디버그 모드인 지 체크 DRD10-X. Do not release apps that are debuggable AndroidManifest.xml 파일 상에 android:debuggable 속성을 true로 해놓 으면, 개발 시 디버깅에 도움이 되지만, 릴 리스 시에는 false로 바꾸어야 함 개발 시 디버깅 모드에서는 true로 자동 설 정. 릴리스 모드로 빌드하면 false가 됨. 외 부 릴리스 시 체크할 필요 72 $ adb shell shell@android:/ $ run-as com.example.someapp sh shell@android:/data/data/com.example.someapp $ id uid=10060(app_60) gid=10060(app_60) shell@android:/data/data/com.example.someapp $ ls files/ secret_data.txt shell@android:/data/data/com.example.someapp $ cat files/secret_data.txt password=GoogolPlex account_number=31974286 디버그 모드로 배포된 앱은 다른 모든 앱이 중요 데이터에 대한 접근이 가능 . android:debuggable="false"
  • 73. LOCATION 위치 추적 정보 공유는 사용자 동의를 받아야 함 DRD15-J. Consider privacy concerns when using Geolocation API W3C GeoLocation API는 웹 브라우저가 기기의 지리위 치 정보를 사용할 수 있게함 지리 위치 정보 전송 시 별도의 사용자로부터 권한 동의를 받아야 함 WebView를 사용하는 앱에서 지리 위치 정보 사용을 위 한 필요 권한 및 관련 패키지 permissions android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION android.permission.INTERNET webkit package WebSettings#setGeolocationEnabled(true) WebChromeClient#onGeolocationPermissionsShowPrompt() 73 public void onGeolocationPermissionsShowPrompt(String origin, Callback callback){ super.onGeolocationPermissionsShowPrompt(origin, callback); callback.invoke(origin, true, false); } 지리 위치 정보를 얻기 위해서는 다음을 구현해야 함 (WebChromeClient 메소드) 사용자 동의 없이 지리 위치 정보를 사용 origin: 허락(동의) 요청자 true: GeoLocation 정보 사용이 허락되었음을 의미 false: 이 허락 (동의)이 다음 요청에도 유효한 지 여부를 의미 <script> navigator.geolocation.getCurrentPosition( function(position) { alert(position.coords.latitude); alert(position.coords.longitude); }, function(){ // error handler code } ); </script> 웹 뷰에서 폰으로부터 지리위치 정보를 얻는 코드 getCurrentPosition(showLocation, ErrorHandler, options);
  • 74. LOCATION WebChromeClient#onGeolocationPer missionsShowPrompt() 메소드를 구현 할 때 보안 사항 사용자에게 지리 위치 정보를 알리는 메소 드이며, 악의적으로 구현되면, 사용자 동의 없이 서버로 전송될 수 있음 74 public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions$Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); if(MyPreferences.getBoolean("SECURITY_ENABLE_GEOLOCATION_INFORMATION", true)) { WebViewHolder.a(this.a).permissionShowPrompt(origin, callback); } else { callback.invoke(origin, false, false); } } 먼저, 지리위치정보 공유 설정을 체크하고, 사용자 동의를 구함 public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); // Ask for user's permission // When the user disallows, do not send the geolocation information } 사용자 동의를 받는 코드를 구현한 뒤에 지리 위치 정보 공유 허용 webView App navigator.geolocation .getCurrentPosition (showLocation) Chrome onGeolocationPermissionsShowPrompt 사용자 동의 showLocation
  • 75. INPUT VALIDATION AND DATA SANITIZATION 상대 디렉터리 경로 조작 외부에서 입력된 경로에 관련된 문자열을 취급할 때, 예상하지 않은 경로 접근이 되지 않도록 함 name에 ../../../rootFile.txt 와 같은 값이 사용되면 문제를 일으킬 수 있음 물론, 앱 샌드 박스 원칙에 따라 다른 앱의 파일에 영향 주지 않지만, 앱 내 데이터를 잘못 지울 수 있고, 시스템 공유 파일의 경 우에도 영향 받을 수 있음 name이 파일의 이름만 나타낼 수 있도록 /, , &, . 와 같은 경로 문자를 제거 75 ...... public void f(Properties request) { ...... String name = request.getProperty("filename"); if(name != null){ File file = new File("/usr/local/tmp/" + name); file.delete(); } ...... } filename에 해당하는 문자열을 체크하지 않음 ...... public void f(Properties request) { ...... String name = request.getProperty("user"); if ( name != && !"".equals(name) ) {   name = name.replaceAll("/", "");   name = name.replaceAll("", "");   name = name.replaceAll(".", "");   name = name.replaceAll("&", "");  name = name + "-report";  File file = new File("/usr/local/tmp/" + name);  if (file != ) file.delete();  }  ...... } filename 문자열에 경로 탐색 문자를 지움
  • 76. INPUT VALIDATION AND DATA SANITIZATION 절대 디렉터리 경로 조작 외부 입력 혹은 파일로부터 경로를 입력 받 을 때, 절대 경로를 사용하면 취약 앱의 내부 구조를 노출 시킬 수 있음 외부 저장소에 저장된 inputFile은 외부에 누출될 수 있음 잘못된 파일을 변경/삭제할 수 있음 76 
 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File file = new File( android.os.Environment.getExternalStorageDirectory(), "inputFile"); try { InputStream is = new FileInputStream(file); Properties props = new Properties(); props.load(is); String name = props.getProperty("filename"); 
 file = new File(name); 
 file.delete(); 
 is.close(); 
 } catch (IOException e) { Log.w("Error", "", e); } 
 } 
 외부 저장소에 있는 “inputFile”로부터 filename에 해당하는 문자열을 읽어 파일을 삭제 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File file = new File( android.os.Environment.getExternalStorageDirectory(), "inputFile"); try { InputStream is = new FileInputStream(file); 
 Properties props = new Properties(); 
 props.load(is); 
   String name = props.getProperty(“filename"); String tmpdir = … // e.g. ”/usr/local/tmp/“
 if (name.indexOf("/") < 0) { 
   file = new File(tmpdir + name);
 file.delete(); 
 } 
 is.close(); 
  } catch (IOException e) { Log.w("Error", "", e); } } 외부 저장소에 있는 “inputFile” 상의 filename은 경로가 없는 파일 이름만 저장
  • 77. INPUT VALIDATION AND DATA SANITIZATION 매개변수 미검사 null이 입력으로 오게 되면 Java에서는 예 외 (Exception)를 발생 시킴. 예외 처리를 하지 않으면 앱이 종료됨 앱 실행을 중지시킬 수 있음 공격자는 예외를 발생시켜 보안 로직을 건 너뛰거나 앱이 디버깅 정보를 로그로 남기 기를 기대할 수 있음 77 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 } 
 public boolean equals(Object object) { 
 return (toString().equals(object.toString())); 
 } 
 인자로 null이 오게되면, NullPointerException이 발생할 수 있음 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
 }
 public boolean equals(Object object) { if(object != null )
 return (toString().equals(object.toString())); else return false; } null 체크 필요
  • 78. INPUT VALIDATION AND DATA SANITIZATION Input validation 입력 검증의 미비가 안드로이드에서의 가장 일반적인 보안 문제 버퍼 오버플로우, 널 포인터, 코드 인젝션 등 활용 가능한 정규 식 패턴들 DOMAIN_NAME: 도메인 이름을 체크 EMAIL_ADDRESS: 이메일 주소 체크 IP_ADDRESS: IP 주소 체크 PHONE: 폰 번호 체크 78 <EditText android:id="@+id/EditTextTelephone" android:hint="@string/telephone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="phone"> </EditText> public void isEmail(EditText et) { if (et.getText()== null) return false; else return Patterns.EMAIL_ADDRESS.matcher(et.getText().toString()).matches(); }
  • 79. SQL INJECTION SQL injection 가장 위험하고 일반적인 코드 인젝션이 부 적절한 권한을 가진 SQL 질의를 통해 데이 터베이스를 사용하는 것 공격자는 사용자 이름 대신에 다음 문자열 을 입력할 수 있음 (EditText) '' OR ‘1'='1' "SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1' = ‘1'" 공격에 대한 최상의 방어는 인자화된 질의 를 사용하는 것 query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 79 String username = usernameEditText.getText().toString(); String password = passwordEditText.getText().toString(); String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password +"'"; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.rawQuery(query, ); if (c.getCount!=0) return true; 사용자 입력을 그대로 사용하게되면, SQL 쿼리문이 악용될 수 있음 String username = usernameEditText.getText().toString(); String password = passwordEditText.getText().toString(); String tableName = "USERS"; String [] projection = {"username", "password"} String selection = "username=? AND password=?"; String [] selectionArgs = { username, password}; SQLiteDatabase db = this.getWritableDatabase(); Cursor c = db.query(tableName, projection, selection, selectionArgs, null); if (c.getCount!=0) return true; 인자화된 쿼리문을 사용
  • 80. 80Bill Karwin, www.slideshare.net/billkarwin SELECT * FROM Bugs
 WHERE bug_id = $_GET[‘bugid’] SELECT * FROM Bugs
 WHERE bug_id = ?
  • 81. 사용자 데이터 및 신용 정보 보호 개인 정보 보호 가이드 사용자 데이터 접근, 저장, 전송은 불가피한 경우여야 한다 데이터를 그대로 쓰지말고 해시를 하거나 원복 불가능한 형태로 사용하라 다른 앱에 노출시키면 안됨. IPC를 최대한 엄격하게 사용. 중요 정보 접근 API 사용을 줄여라 써드 파티 컴포넌트에 주는 데이터가 무엇을 위한 것인 지 명확하게 이해해야 함. 사용자에 신용정보 요구하는 횟수를 제한해야. 피싱 공격에 대해 관대해질 수 있음 로그 데이터는 안드로이드에서 공유 자원이다. 다른 앱이 볼 수 있다. 로그되는 정보를 확인해야 서버로의 불필요한 정보의 전송을 줄여라. 이름/암호 인증을 쓰고자 하면, 폰에 이 정보를 저장하지 않도록 하라. 꼭 필요하다면, 암호화해야 한다 81
  • 83. apk 가져오기, adb pull adb pull /system/app/DeskClock 83 $ adb shell ls -al /system/app drwxr-xr-x root root 2015-02-15 01:51 BasicDreams drwxr-xr-x root root 2015-02-15 01:53 Browser drwxr-xr-x root root 2015-02-15 01:52 Calculator drwxr-xr-x root root 2015-02-15 01:53 Calendar drwxr-xr-x root root 2015-02-15 01:51 CaptivePortalLogin drwxr-xr-x root root 2015-02-15 01:51 CertInstaller drwxr-xr-x root root 2015-02-15 01:51 CustomLocale … $ unzip Contacts.apk -d Contacts Archive: Contacts.apk extracting: Contacts/res/drawable-hdpi-v4/ab_solid_custom_blue_inverse_holo.9.png extracting: Contacts/res/drawable-hdpi-v4/ab_stacked_solid_inverse_holo.9.png extracting: Contacts/res/drawable-hdpi-v4/aggregation_suggestions_bg.9.png … $ adb pull /system/priv-app/Contacts pull: building file list... pull: /system/priv-app/Contacts/x86/Contacts.odex -> ./x86/Contacts.odex pull: /system/priv-app/Contacts/Contacts.apk -> ./Contacts.apk 2 files pulled. 0 files skipped. 207 KB/s (6990561 bytes in 32.943s) $ ls -al Contacts total 2336 drwxr-xr-x 7 chanjinpark staff 238 11 21 14:28 . drwxr-xr-x 35 chanjinpark staff 1190 11 21 14:28 .. -rw-r--r-- 1 chanjinpark staff 29516 7 23 2008 AndroidManifest.xml drwxr-xr-x 5 chanjinpark staff 170 11 21 14:28 META-INF drwxr-xr-x 3 chanjinpark staff 102 11 21 14:28 com drwxr-xr-x 32 chanjinpark staff 1088 11 21 14:28 res -rw-r--r-- 1 chanjinpark staff 1159740 7 23 2008 resources.arsc
  • 84. apk 디컴파일, apktool apktool: APK는 컴파일된 코드, Decompiler http://ibotpeaches.github.io/Apktool/ install/ 로부터 script와 jar 파일 다운로드 ./apktool.sh d -o Calendar Calendar.apk 84 Chanjinui-MacBook-Pro:myandroid chanjinpark$ ./apktool.sh d -o Calendar Calendar.apk I: Using Apktool 2.0.2 on Calendar.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: /Users/chanjinpark/Library/apktool/ framework/1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Copying assets and libs... I: Copying unknown files... I: Copying original files... Chanjinui-MacBook-Pro:myandroid chanjinpark$ Chanjinui-MacBook-Pro:myandroid chanjinpark$ ls -al Calendar total 32 drwxr-xr-x 7 chanjinpark staff 238 11 20 16:46 . drwxr-xr-x 29 chanjinpark staff 986 11 20 16:46 .. -rw-r--r-- 1 chanjinpark staff 10476 11 20 16:46 AndroidManifest.xml -rw-r--r-- 1 chanjinpark staff 315 11 20 16:46 apktool.yml drwxr-xr-x 5 chanjinpark staff 170 11 20 16:46 assets drwxr-xr-x 4 chanjinpark staff 136 11 20 16:46 original drwxr-xr-x 91 chanjinpark staff 3094 11 20 16:46 res
  • 85. AndroidMenifest.xml 파일 85 <?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="android.uid.shared" package="com.android.contacts" platformBuildVersionCode="22" platformBuildVersionName="5.1-1737576"> <original-package android:name="com.android.contacts"/> <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.CALL_PRIVILEGED"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> … <application android:hardwareAccelerated="true" android:icon="@mipmap/ ic_contacts_clr_48cv_44dp" android:label="@string/applicationLabel" android:name="com.android.contacts.ContactsApplication" android:supportsRtl="true" android:taskAffinity="android.task.contacts"> <activity android:clearTaskOnLaunch="true" android:label="@string/ launcherActivityLabel" android:launchMode="singleTop" android:name=".activities.PeopleActivity" android:theme="@style/PeopleTheme"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.APP_CONTACTS"/> </intent-filter> … <service android:exported="true" android:name=".ViewNotificationService" android:permission="android.permission.WRITE_CONTACTS"> <intent-filter> <action android:name="com.android.contacts.VIEW_NOTIFICATION"/> <data android:mimeType="vnd.android.cursor.item/contact"/> </intent-filter> </service> <receiver android:name=“com.android.contacts.common.location.CountryDetector $LocationChangedReceiver"/> <provider android:authorities="com.android.contacts.files" android:exported="false" android:grantUriPermissions="true" android:name="android.support.v4.content.FileProvider"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> <meta-data android:name="android.nfc.disable_beam_default" android:value="true"/> </application> </manifest>
  • 86. 패키지 정보 확인 설치된 패키지 열거 run app.package.list 패키지의 정보 확인 run app.package.info --package com.android.calendar 86 adb forward tcp:31415 tcp:31415 drozer console connect drozer Console (v2.3.4) dz> run app.package.list com.android.smoketest (com.android.smoketest) com.example.android.livecubes (Example Wallpapers) com.android.providers.telephony (휴대전화/메시지 저장공간) com.android.providers.calendar (캘린더 저장) com.android.providers.media (미디어 저장소) com.android.protips (홈 화면 도움말) com.android.launcher (Launcher) com.android.documentsui (문서) com.android.gallery (카메라) … dz> run app.package.info --package com.android.calendar Package: com.android.calendar Application Label: 캘린더 Process Name: com.android.calendar Version: 5.1-1737576 Data Directory: /data/data/com.android.calendar APK Path: /system/app/Calendar/Calendar.apk UID: 10018 GID: [3003] Shared Libraries: Shared User ID: Uses Permissions: - android.permission.GET_ACCOUNTS - android.permission.MANAGE_ACCOUNTS - android.permission.INTERNET - android.permission.VIBRATE - android.permission.READ_CONTACTS - android.permission.READ_CALENDAR - android.permission.WRITE_CALENDAR - android.permission.WAKE_LOCK - android.permission.USE_CREDENTIALS - android.permission.READ_SYNC_SETTINGS - android.permission.RECEIVE_BOOT_COMPLETED - com.google.android.googleapps.permission.GOOGLE_AUTH.mail Defines Permissions: - None
  • 87. 권한을 사용하는 패키지 열거 CAMERA 사용 권한을 가진 패키지 목록 run app.package.info -p android.permission.CAMERA 87 dz> run app.package.info -p android.permission.CAMERA Package: com.android.gallery Application Label: 카메라 Process Name: com.android.gallery Version: 5.1-1737576 Data Directory: /data/data/com.android.gallery APK Path: /system/app/Gallery/Gallery.apk UID: 10005 GID: [1028, 1015, 1023, 1024, 2001, 3003, 3007] Shared Libraries: Shared User ID: android.media Uses Permissions: - android.permission.CAMERA - android.permission.RECORD_AUDIO - android.permission.ACCESS_FINE_LOCATION - android.permission.WAKE_LOCK - android.permission.SET_WALLPAPER - android.permission.WRITE_EXTERNAL_STORAGE - android.permission.READ_SMS - android.permission.READ_EXTERNAL_STORAGE Defines Permissions: - None Package: com.android.browser Application Label: 인터넷 … Package: com.example.chanjinpark.myapplication Application Label: My Application … …
  • 88. 액티비티 정보 확인 액티비티 열거 run app.activity.info 88 dz> run app.activity.info Package: com.android.smoketest Package: com.example.android.livecubes Package: com.android.providers.calendar com.android.providers.calendar.CalendarDebug Permission: com.android.providers.calendar.CalendarDebugActivity Permission: … Package: com.android.gallery com.android.camera.GalleryPicker Permission: com.android.camera.ImageGallery Permission: com.android.camera.CropImage Permission: …
  • 89. Content Provider 정보 CP 열거 run app.provider.info 89 dz> run app.provider.info Package: com.android.providers.telephony … Package: com.android.providers.calendar Authority: com.android.calendar Read Permission: android.permission.READ_CALENDAR Write Permission: android.permission.WRITE_CALENDAR Content Provider: com.android.providers.calendar.CalendarProvider2 Multiprocess Allowed: False Grant Uri Permissions: False … Package: com.android.providers.contacts Authority: contacts Read Permission: android.permission.READ_CONTACTS Write Permission: android.permission.WRITE_CONTACTS Content Provider: com.android.providers.contacts.ContactsProvider2 Multiprocess Allowed: False Grant Uri Permissions: True Uri Permission Patterns: Path: .* Type: PATTERN_SIMPLE_GLOB Path Permissions: Path: /search_suggest_query Type: PATTERN_PREFIX Read Permission: android.permission.GLOBAL_SEARCH Write Permission:
  • 90. 서비스 정보 확인 서비스 열거 run app.service.info 90 dz> run app.service.info --package com.android.deskclock Package: com.android.deskclock com.android.deskclock.Screensaver Permission: android.permission.BIND_DREAM_SERVICE dz> run app.service.info --package com.android.contacts Package: com.android.contacts com.android.contacts.ViewNotificationService Permission: android.permission.WRITE_CONTACTS
  • 91. 브로드캐시트 리시버 91 dz> run app.broadcast.info -i -f contacts Package: com.android.providers.contacts com.android.providers.contacts.ContactsUpgradeReceiver Intent Filter: Actions: - android.intent.action.PRE_BOOT_COMPLETED Permission: com.android.providers.contacts.PackageIntentReceiver Intent Filter: Actions: - android.intent.action.PACKAGE_REPLACED Data: - package://*:** (type: *) Intent Filter: Actions: - android.intent.action.PACKAGE_CHANGED Data: - package://*:** (type: *) Intent Filter: Actions: - android.intent.action.PACKAGE_ADDED Data: - package://*:** (type: *) Intent Filter: Actions: - android.intent.action.PACKAGE_REMOVED Data: - package://*:** (type: *) Permission: dz> run app.broadcast.info -a com.android.deskclock Package: com.android.deskclock com.android.deskclock.AlarmInitReceiver Permission: com.android.alarmclock.AnalogAppWidgetProvider Permission: com.android.alarmclock.DigitalAppWidgetProvider Permission:
  • 92. 앱이 노출하고 있는 컴포넌트 파악 activities broadcast receivers content providers services shared ID 92 dz> run app.package.attacksurface com.android.contacts Attack Surface: 15 activities exported 0 broadcast receivers exported 0 content providers exported 1 services exported Shared UID (android.uid.shared) dz> run app.package.attacksurface com.android.deskclock Attack Surface: 6 activities exported 3 broadcast receivers exported 0 content providers exported 1 services exported
  • 93. 액티비티 실행 93 dz> run app.activity.forintent --action android.intent.action.MAIN --category android.intent.category.LAUNCHER Package: com.android.contacts com.android.contacts.activities.PeopleActivity Package: com.android.dialer com.android.dialer.DialtactsActivity Package: com.android.mms com.android.mms.ui.ConversationList Package: com.google.android.gms com.google.android.gms.app.settings.GoogleSettingsActivity Package: com.android.settings com.android.settings.Settings Package: com.android.browser com.android.browser.BrowserActivity … dz> run app.activity.start --action android.intent.action.MAIN --category android.intent.category.LAUNCHER --component com.android.contacts com.android.contacts.activities.PeopleActivity
  • 94. Reversing Application Code FourGoats APK 파일을 unzip Dex2Jar http://sourceforge.net/projects/ dex2jar/ d2j-dex2jar.sh classes.dex JD-GUI https://github.com/java-decompiler/ jd-gui/releases 94 Dalvik 설치 이미지로부터 Java 앱 소스코드를 리버스 엔지니어링 후 에 2천만 라인 코드에 대해 정적 분석을 시도 (1100개 무료 앱). 2012 중요 개인 정보를 잘못 사용 폰 식별 ID(IMES, IMSI, ICC-ID)를 평문으 로 전송, 위치 정보와 결합되면 폰의 이동 경로 추적 가능
  • 95. 실습 GoatDroid OWASP에서 안드로이드 보안 문제점을 보 이기 위해 샘플 앱을 작성 아래 사이트에서 파일 다운로드 https://github.com/jackMannino/ OWASP-GoatDroid-Project/ downloads goatdroid UI 화면 실행 Start Web Services 95 $ java -jar goatdroid-0.9.jar $ ls -al total 13792 drwxr-xr-x@ 12 chanjinpark staff 408 11 22 16:42 . drwxr-xr-x 42 chanjinpark staff 1428 11 23 10:12 .. -rw-r--r--@ 1 chanjinpark staff 6148 11 22 16:19 .DS_Store -rw-r--r--@ 1 chanjinpark staff 213 11 23 10:25 config drwxr-xr-x@ 4 chanjinpark staff 136 11 22 00:23 dbs -rw-r--r-- 1 chanjinpark staff 1602 11 23 10:23 derby.log -rw-r--r--@ 1 chanjinpark staff 7035952 9 25 2012 goatdroid-0.9.jar drwxr-xr-x@ 4 chanjinpark staff 136 11 22 00:23 goatdroid_apps -rw-r--r--@ 1 chanjinpark staff 642 9 25 2012 jetty.csr -rw-r--r--@ 1 chanjinpark staff 1331 9 25 2012 keystore drwxr-xr-x@ 2 chanjinpark staff 68 9 25 2012 lessons drwxr-xr-x@ 2 chanjinpark staff 68 9 25 2012 top10
  • 96. 앱 설치 디바이스설정 IP 설정 (ipconfig) 사용자 등록 및 로그인 96 $ adb install OWASP GoatDroid- FourGoats Android App.apk 1704 KB/s (1256313 bytes in 0.719s) pkg: /data/local/tmp/OWASP GoatDroid- FourGoats Android App.apk Success OWASP-GoatDroid-0.9/goatdroid_apps/FourGoats/OWASP GoatDroid- FourGoats Android App.apk
  • 97. FourGoat에 저장된 정보 읽기 사용자 인증 정보 저장 (SessionToken) Remember Me 97 $ adb pull /data/data/org.owasp.goatdroid.fourgoats/databases pull: building file list... pull: /data/data/org.owasp.goatdroid.fourgoats/databases/userinfo.db- journal -> ./userinfo.db-journal pull: /data/data/org.owasp.goatdroid.fourgoats/databases/userinfo.db - > ./userinfo.db 2 files pulled. 0 files skipped. 541 KB/s (25104 bytes in 0.045s) $ ls -al total 56 drwxr-xr-x 4 chanjinpark staff 136 11 23 00:08 . drwxr-xr-x 43 chanjinpark staff 1462 11 22 17:49 .. -rw-r--r-- 1 chanjinpark staff 16384 11 23 00:08 userinfo.db -rw-r--r-- 1 chanjinpark staff 8720 11 23 00:08 userinfo.db-journal $ cat userinfo.db ??Lite format 3@ -? ?{tableinfoinfoCREATE TABLE info(id INTEGER PRIMARY KEY, sessionToken TEXT, userName TEXT, isPublic INT, autoCheckin INT, isAdmin INT)W-- ctableandroid_metadataandroid_metadataCREATE TABLE android_meb03f87f751cd1d0d542e73ef68777b33a18f04580b4cb2135a78d8bf798f4ce fe4731110f0bbed8c133253a6617fb11a62290a6053f872ef288be99e9fa62ad9hgdtruet ruefalse $ sqlite3 userinfo.db sqlite> .tables android_metadata info sqlite> .headers on sqlite> select * from info; id|sessionToken|userName|isPublic|autoCheckin|isAdmin 1| b03f87f751cd1d0d542e73ef68777b33a18f04580b4cb2135a78d8bf798f4cefe4731110f 0bbed8c133253a6617fb11a62290a6053f872ef288be99e9fa62ad9|hgd|true|true| false
  • 99. 28 QUESTIONS FOR MOBILE APP VENDORS 앱의 알려진 보안 이슈? 폰, 네트워크 (Wi-Fi, Bluetooth) 기능을 사용하는가? GPS는? 카메라 및 다른 녹화 하드웨어/소프트웨어는? 사용하는 OS 시스템 리소스, 라이브러리? 외부 호스트로 보내는 데이터는 어떤 것들이 있는가? PC 동기화 시 주고 받는 데이터는? 위 질문에 대해 보안 이슈가 없음을 명료하게 대답할 수 있나? 앱의 소스 코드를 볼 수 있나? 코드 리뷰나 개발자 참여 사용자 커뮤니티가 있는가? 앱 라이센스가 취약점 및 버그 발견 및 공개를 제한하는 항목을 가지고 있는가? 새로 발견된 결함 정보 공유를 막거나 논의를 막는 “gag rule”이 있는가? 99 Voas, J., "Vetting Mobile App Vendors," in Computer , vol.48, no.6, pp.69-71, June 2015
  • 100. 앱에 대한 평판 정보가 있는가? 보안과 관련되었는가? 찬 반에 대한 리뷰의견이 있는가? 보안 요구사항이 잘 구조화되어 정리되어 있는가? 보안 관련 개선을 일처리에 있어 높은 우선순위를 두는 프로세스를 가지고 있는가? 보안 요구사항이 독립적으로 개발되었는가 혹은 요구공학 절차로 통합되어 다루었는가? 앱 요구사항으로부터 오용/악용 케이스가 도출되어 있는가? 관련 공격 패턴을 통해 잠재 위협을 파악하고 문서화했는가? 앱과 정보 자산을 보호를 위한 설계 시, 위협에 대한 가정은 어떤 것이 있는가? 100
  • 101. 위협 모델링 프로세스는? 앱 보호를 위한 설계 시 Threat Modeling 결과를 반영했는가? 보안 개발 표준 혹은 가이드라인이 개발자에게 제공되었는가? 보안 리스크 관리 활동이 소프트웨어 개발 방법론에 포함되어 있는가? 앱는 신뢰할 수 없는 소스로부터의 입력을 검증하는가? 앱은 제한된 실행 환경 내에서 실행되도록 설계된 적이 있는가? Virtual Machine 등. 공격 발생 시 secure 환경에서 운영하도록 전환 가능한가? 문서는 설치, 설정, 사용에 대한 방법을 설명하고 있는가? 보안 취약점 발견 시 바로 조치할 수 있는 방법을 가지고 있는가? 앱이 보안 위험 의존성을 가지거나 다른 소프트웨어, 펌웨어, 하드웨어로부터 제어를 필요로 하는가? 만일 그렇다면, 설명해주시오 101
  • 102. 앱은 주 개발사가 아닌 외주를 통해 만들어진 내용물을 포함하는가? 개발 컴포넌트가 아닌 부분의 기능 및 보안을 검증하기 위한 정책이나 절차는? 내부 개발 시 기능 테스트는 어떤 테스팅을 포함하나? spot checking, component-level testing, and integrated testing? 보안 테스트 얼마나 자주 실행하나? 내부 개발팀이 진행하는 지 외부 제 3자가 실행하는 지? 내부 테스팅이 커버하는 코드 범위는 얼마나 되나? 잠재 오용/남용 시나리오가 테스트에 포함되어 있나? 102
  • 103. 취약점 파악을 위한 정적 혹은 동적 소프트웨어 보안 분석 도구가 사용되나? 이러한 취약점 스캔은 개발 라이프사이클의 어느 시점에 사용되나? 앱은 보증 및 인가 절차를 거치는가? 무엇에 대해, 언제, 누가, 통과 기준 및 체계는? 패치가 배포될 예정인가? 앱과 관련된 결함, 취약점, 보안 사고 리포트는 어떻게 수집, 추적, 우선순위화되나? 앱 컴포넌트가 의도되지 않거나, 실행되지 않거나, 악성 행동을 하는 코드를 포함하지 않음을 검증하기 위한 정책 및 프로세스는 어떤 것이 있나? 얼마나 자주 앱의 Major 버전이 릴리스 되나? 103
  • 104. MOBILE SECURITY TESTING 모바일 보안 테스팅 모바일 기기 내 앱의 취약점 혹은 악성 앱을 탐지하기 위한 테스팅 모바일 보안 테스팅 분류: mobile forensic, penetration test, static analysis, and dynamic analysis 아직 보안 테스팅 도구가 많지 않고 성숙되지 않음 Mobile Security Solutions 시그내처 기반 멀웨어 탐지 방법 알려진 멀웨어 분석 결과 기반으로 악성 앱 설치 금지. 멀웨어 변형에 대한 대응 필요. 폰에서 지속적 업데이트해야 함 Bouncer 구글 Play Store에 올라오기 전에 서버에서 악성 앱을 탐지하는 방법 모바일 앱을 스캐닝해서 멀웨어를 탐지. e.g. SMS를 외부로 보내는 지 체크. TaintDroid 중요 데이터의 흐름을 추적. 로그를 통해 중요 정보를 악용하려는 악성 앱을 파악. 104 Yong Wang; Alshboul, Y., "Mobile security testing approaches and challenges," in Mobile and Secure Services (MOBISECSERV), 2015 First Conference on , Feb. 2015
  • 105. 모바일 보안 위협 모델 105 application layer, communication layer, and resource layer 멀웨어 방지는 탐지하여 격리, 삭제를 통해 공격 루프를 끊는 것.
  • 106. 보안 테스팅 방법 Mobile Forensic 포렌식은 모바일 기기에 대한 보안 점검을 위한 합법적인 보안 취약점 탐지 활동 데이터로는 SMS/MMS messages, emails, call logs, calendar events, web traffic, bookmarks, pictures, voice mail messages, location information, app data 등이 있음 Penetration Test 모바일 앱에 대한 보안 테스팅을 위해 사용 테스팅 환경의 셋업, 테스트 절차 만들고 기대 결과와 실제 실행 결과를 비교 도구 Wireshark: Wi-Fi 트래픽을 모니터링 nmap, Nessus, Metasploit, etc. Kali Linux는 테스팅 도구를 탑재한 테스팅 플랫폼 106
  • 107. 보안 테스팅 방법 Static Analysis 앱을 실제 실행하지 않고 코드 수준에서 분석 알려진 취약점 혹은 의심스러운 함수 호출 및 권한 사용에 대한 앱 코드 리뷰 APK 파일에 대한 정적 분석 도구. Android Reverse Tools (ART) and Static Android Analysis Framework (SAAf). 정적 분석은 주로 디컴파일 도구에 의존 시그내처 기반 멀웨어 탐지 도구 활용 Dynamic Analysis 앱을 제한된 환경에서 실행하여 보안 취약점 분석 의심스런 활동을 탐지하기 위해 네트워크 트래픽 및 통신을 모니터링함 앱이 알려지지 않거나 악성 사이트에 접속한다거나 SMS 메시지를 권한 없이 보내는 등의 활동 프로그램 행위에 기반하고 디컴파일 도구가 불필요. 로그를 남겨야 함. 스스로 코드 상에 보이지 않게하는 멀웨어 를 분석할 수 있음 107
  • 108. 보안 테스팅 네트워크 (테스팅 환경) 108 802.11 Protocol Analyzer USB Protocol Analyzer Bluetooth Analyzer NFC Protocol Analyzer Kali Linux Test Station Micro Systemation XRY Complete Mobile Forensic System 보안 테스팅 컴퓨터 • Conduct penetration tests on mobile devices using the Kali Linux station • 802.11, Bluetooth, and NFC protocol analyzers provide sniffing tools to monitor the communication channels on a mobile device
  • 109. END