[HACKING] DocumentBuilderFactory XXE 취약점 관련 연구(?) 중간 정리(feat apktool)

아주 오랜만에 글을 씁니다. 작년 말부터 좀 정신없는 일이 있었고, 겸사겸사 VAHA 서비스 손보고 있던지라 블로그에 관심을 많이 못뒀었네요. (http://vaha.hahwul.com ) / 필요한 기능 피드백주세요

본론으로 넘어와서 ..

작년 말즘 안드로이드 개발환경에 대한 공격을 타겟으로 올라온 ParseDroid 취약점이 있었습니다. 여러가지 안드로이드 취약점을 묵어서 이야기하는 말이고 관련해서 apktool과 몇가지 취약점에 대해 포스팅도 한차례 했었던 기억이 나네요.

http://www.hahwul.com/2017/12/hacking-documentbuilderfactory-xxe.html

사실 이 취약점 이후에 아는 지인들과 간단한 프로젝트(?)를 진행해보았습니다. 좋은 아웃풋이 나온건 아니지만.. 아직 중간점검으로 생각하고 한번 정리하여 포스팅하려 합니다.

(언젠간.. 취약점이 될거라 믿어요)

ParseDroid > Apktool XXE

ParseDroid 취약점 중 파급력이 있던게.. Apktool에서의 XXE와 Traversal 취약점이라고 생각이 듭니다. 이 중 XXE의 경우에는 개발 환경에서 원격명령까지 떨어질 수 있기 때문에 파급력도 어느정도 있었죠.

원인은 DocumentBuilderFactory Class 내 parse 실행 중 XML 구문에 대한 검증이 제대로 이루어지지 않는다는 것이였죠. 그래서 Manifest 파일을 읽는 도중에 XXE가 가능했구요.

private static Document loadDocument(File file) throws IOException, SAXException, ParserConfigurationException{
  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
  return docbuilder.parse(file); // exploit trigger 포인트입니다.
}

자세한 내용은 작년말에 작성한 포스팅 참고해주세요. http://www.hahwul.com/2017/12/hacking-documentbuilderfactory-xxe.html

무엇을 하는가?

위 취약점을 접하고 많은 생각을 했었습니다.

” 개발 환경에 대한 공격으로 IDE, Apktool 에서 변조된 Manifest 파일을 읽을때 실행된다고 하는데.. 이러면 대다수의 분석 툴 또한 동일하게 영향력이 발생하는게 아닐까? “

컴파일/디버깅 과정이 아닌.. 보안 툴, 분석 툴에서 분석할 떄 XXE가 가능할지 연구해보기로 했습니다.

Task 1 - apktool을 사용하는 프로그램 찾기

사실 github 잘 뒤지면 나올거라 생각했지만 의외로 몇개 없었습니다.

java 코드는 대체로 apktool 자체를 fork 한 경우이기 때문에 제외하고 보면.. 대략 100개 정도 될듯합니다. (shell 44 개입니다)

대다수는 apktool 구버전을 사용하고 있기 때문에 영향력이 존재한다고 봅니다.

Task 2 - 공격코드가 포함된 Apk 파일 생성

처음에 취약점 공개 시 외부 pjt를 git으로 땡겨와서 컴파일한다던가.. 이런 컴파일, 빌드 과정에서 취약점이 트리거되고 공격코드 실행으로 apk 가 생성되지 않았었습니다. 또한 최신 IDE나 개발툴은 이를 감지하고 처리하고 있었죠.

우선 가장 먼저 발생한 문제는.. 변조된 Manifest 파일이 포함된 apk 파일을 어떻게 만드느냐였습니다.

현재까지 나온 생각은 2가지입니다.

  1. Manifest 파일을 직접 인코딩하여 apk 안에 넣어놓는다.
  2. 변조된 Manifest 파일을 빌드해줄 수 있는 툴을 찾는다.

모두 가능성은 존재합니다.

1. Manifest 내 코드 삽입 후 인코딩

여러가지 루트로 찾아봤습니다만.. 인코딩 된다는 이야기만 있고 정확히 어떤 방식인지 알기 힘들었습니다. 그리고 이 방법의 경우에 직접 인코딩 툴을 짜야할 가능성이 높기 때문에 소모되는 리소스가 크다고 판단하여 천천히 보기로 마음먹었죠.

혹시라도.. 2번이 실패한다면 1번으로 노가다를 시작해야합니다.

2. 빌드가 가능한 툴 찾기

여러가지 툴, 버전으로 테스트해봤는데, 최신의 코드들은 대다수가 패치되었습니다. (Major 한 친구들)

그래서 구버전으로 컴파일 하자니.. 에러가 발생합니다. 이는 XXE 구문으로 인한 오류로 생각했지만 apktool에선 구문과 상관없이 에러를 뱉는 것으로 보아 좀 더 테스트가 필요하다고 느낍니다.

아직 해답을 찾은건 아니지만.. 가장 유력한 방법은 오래된 개발툴을 이용해서 apk 를 빌드하는겁니다. 빌드가 성공한다면 최소 github에 있는 100개의 툴에 대해선 테스트 해볼 수 있을 것 같네요.

물론 제가 만든 툴도 포함됩니다 =_=

중간 정리는 이쯤하고.. 글 마무리합니다.

새해 복 많이 받으시고 즐거운 한해되세요 :)