페이스북, 안드로이드 앱에서 1만 달러 상당의 취약점이 발견되다.
10월 2일, 해커 Sayed Abdelhafiz(@dPhoeniixx)는 자신이 페이스북 안드로이드 앱에서 발견한 취약점을 블로그에 공개했습니다. [1] 글 공개 전, 그는 취약점을 제보하였고 페이스북은 취약점을 패치한 후 1만 달러(당시 환율 기준 약 1200만 원) 상당의 포상금을 지급했습니다. 그가 작성한 글은 발견한 취약점을 악용하여 임의 코드 실행까지 유도한 공격 과정과 PoC 데모 영상을 포함하고 있습니다.
페이스북 버그 바운티
페이스북은 2011년부터 자체 버그 바운티 프로그램을 운영하고 있습니다. 이 프로그램을 통해 해커는 페이스북에서 발견한 취약점을 제보하고 포상금을 받을 수 있습니다. 취약점의 서비스 범위와 영향도에 따라 포상 금액이 달라집니다.
책임 있는 공개(Responsible Disclosure) 정책에 따르면 해커는 자신이 제보한 취약점을 페이스북이 패치한 후에 타인에게 공개할 수 있습니다. 이에 따라 해커 Sayed Abdelhafiz는 4월에 취약점을 제보하고 6월에 취약점이 패치된 뒤에 블로그에 취약점에 대한 정보를 공개했습니다. 책임 있는 공개 정책을 위반할 경우 기업이 큰 피해를 받을 수 있으므로 제보자는 이를 꼭 따라야 합니다.
또한 페이스북은 얼마 전 해커를 위한 업계 최초의 로열티 프로그램인 Hacker Plus를 발표했습니다. [2] 페이스북은 버그 바운티 프로그램에 참여한 해커들이 제보한 취약점을 정기적으로 평가합니다. 이에 따라 해커들은 브론즈부터 다이아몬드까지 5개의 티어에 배치되고 티어에 따라 정해진 포상금의 5%~20%의 보너스를 추가로 받을 수 있습니다. 상위 티어의 기준을 충족하면 바로 승급할 수 있기 때문에 해커 간의 경쟁 구도가 형성될 것으로 보입니다. 또한 상급 티어는 여행, 숙박 시설을 포함한 이벤트를 초대받을 수도 있습니다.
해커는 어떤 취약점을 발견했을까요?
이 페이스북 앱의 임의 코드 실행 공격은 경로 탐색(Path Traversal) 취약점에서 기인했습니다. 이 취약점을 통해 임의 파일 생성(Arbitrary File Write) 을 유발하여 임의 코드 실행(Arbitrary Code Execution) 을 수행할 수 있었습니다.
경로 탐색 (Path Traversal)
Path Traversal 취약점은 특수한 의미를 지니는 디렉터리 명인 ..
을 사용하여 현재 디렉터리를 기준으로 상위 디렉터리에 접근할 수 있도록 합니다. 이를 악용하면 앱 개발자가 지정한 경로가 아닌 공격자가 조작한 경로에 접근할 수 있습니다. [3] 이 취약점에 대한 자세한 설명은 드림핵 <Web Hacking> 커리큘럼의 <Server-side Advanced - File Vulnerability> 코스에서 확인할 수 있습니다. [4]
해커는 피해자가 페이스북 안드로이드 앱에서 그룹에 업로드된 파일을 다운로드할 때 Path Traversal 취약점이 발생하게 했습니다. 이렇게 다운로드 시에 Path Traversal 취약점이 발생하면 임의의 경로에 파일을 생성할 수 있는 임의 파일 생성(Arbitrary File Write)으로 유도할 수 있습니다.
임의 파일 생성 (Arbitrary File Write)
정상적인 다운로드 디렉터리 경로가 /sdcard/Downloads/
이고 FILE_NAME
이라는 이름을 가진 파일을 다운로드한다면 /sdcard/Downloads/FILE_NAME
에 저장될 것입니다. 하지만 파일이름이 ../FILE_NAME
이라면 다운로드 경로는 /sdcard/Downloads/../FILE_NAME
이 될 것이고 ../
을 통해 상위 디렉터리로 이동하여 다운로드 디렉터리는 /sdcard/
가 됩니다. 따라서 FILE_NAME
을 저장하는 경로는 /sdcard/FILE_NAME
이 됩니다.
더 나아가 ../
이 아니라 ../../
으로 탐색한다면 루트 디렉터리인 /
부터 접근할 수 있게 되므로 기존 /sdcard/Downloads/
가 아닌 권한이 허용되는 임의 경로에 파일을 생성할 수 있습니다.
해커는 어떻게 취약점을 발견했을까요?
해커는 Burp Suite 프록시를 이용하여 페이스북 그룹에 파일을 업로드하는 요청 패킷을 아래와 같이 변조했습니다.
패킷 변조를 통해 filename="../../../sdcard/PoC"
로 파일 이름을 지정하여 Path Traversal 페이로드를 업로드했습니다. 하지만 서버 단에서 ../
페이로드가 삭제되어 아래와 같은 파일 이름으로 업로드되었기 때문에 Path Traversal 취약점을 유발할 수 없었습니다.
해커는 여러 시도 끝에 파일을 모아볼 수 있는 기능인 파일 탭에서 Path Traversal 페이로드가 아래처럼 작동한다는 것을 알아냈습니다.
출처 : 유튜브 Arbitrary code execution on Facebook for Android PoC [5]
게시글이 아닌 파일 탭에서 파일을 다운로드하면 Path Traversal 취약점이 발생할 수 있었습니다. 따라서 2번째 파일을 다운로드하면 /data/data/com.facebook.katana/test
에 파일이 저장됩니다. 이렇게 해커는 임의 경로에 파일을 생성하는 데에 성공했습니다.
해커는 어떻게 공격했을까요?
임의 코드 실행(Arbitrary Code Execution)
Path Traversal 취약점을 통해 임의 경로에 파일을 저장할 수 있으므로 페이스북 앱의 바이너리가 존재하는 데이터 디렉터리에도 바이너리를 생성할 수 있습니다. 해커는 페이스북 앱이 사용하는 네이티브 라이브러리 경로에 해커의 라이브러리를 저장하게 해서 해당 라이브러리가 사용될 때 임의 코드를 실행시켰습니다. 그래서 페이스북 앱의 /data/data/com.facebook.katana/lib-xzs/libbreakpad.so
경로에 라이브러리를 저장하기로 했고 아래 코드를 안드로이드 NDK로 빌드하여 네이티브 라이브러리를 제작했습니다.
#include <jni.h>
#include <string>
#include <stdlib.h>
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
system("id > /data/data/com.facebook.katana/PoC");
return JNI_VERSION_1_6;
}
JNI_OnLoad
함수는 라이브러리가 로딩될 때 실행되는 함수이기 때문에 libbreakpad.so
라이브러리가 로딩되면 system
함수가 실행됩니다.해커는 이 페이로드를 포함하여 제작한 네이티브 라이브러리를 /../../../../../data/data/com.facebook.katana/lib-xzs/libbreakpad.so
이름으로 업로드했습니다.
피해자는 이 파일을 다운로드하면 페이로드가 포함된 라이브러리가 Path Traversal 취약점에 의해 /data/data/com.facebook.katana/lib-xzs/libbreakpad.so
에 저장됩니다. 페이스북을 다시 실행하면 libbreakpad.so
라이브러리가 로딩되어 JNI_OnLoad
함수가 실행되고 id > /data/data/com.facebook.katana/PoC
쉘 명령어가 실행됩니다.
이 공격을 시연한 PoC 영상을 보면 그룹에서 파일을 다운로드하고 페이스북 앱을 다시 실행할 때 id 명령어 결과가 PoC 파일로 저장된 것을 확인할 수 있습니다. [6]
요약
페이스북 안드로이드 앱에서 임의 코드 실행까지 이어질 수 있는 취약점이 발견됨. 페이스북은 취약점 패치 후 제보한 해커에게 1만 달러를 포상함.
- 페이스북 그룹의 파일 탭에서 다운로드할 때 Path Traversal 취약점이 발생하여 임의 경로에 파일을 저장할 수 있음.
- 페이스북이 사용하는 네이티브 라이브러리 경로에 공격 코드가 포함된 라이브러리를 저장함.
- 페이스북을 실행할 때 라이브러리가 사용되면서 공격 코드를 실행시킴.
결론
Path Traversal 취약점은 리얼 월드에서도 자주 발견되는 취약점 중 하나입니다. 이 취약점은 메모리의 영향을 받지 않기 때문에 성공률이 높고 유발하기 쉽습니다. 따라서 Path Traversal 공격을 방어하기 위해 경로와 관련된 입력값은 반드시 검증해야 합니다.
버그 바운티 프로그램은 기업이 잠재적인 취약점을 인지하고 보완하는데 효과적인 제도입니다. 해커 또한 금전적인 보상을 받을 수 있기 때문에 합법적으로 취약점을 발견하고 합리적인 포상을 받을 수도 있습니다. 페이스북 외에도 구글, 삼성, 네이버 등의 기업에서도 자체 버그바운티 프로그램을 운영하고 있습니다. 기업의 자체 버그 바운티 외에도 해커원(hackerone), 버그크라우드(bugcrowd) 등의 버그 바운티 중개 플랫폼을 이용하기도 합니다.
요즘 버그 바운티 프로그램을 운영하거나 참여하는 기업이 증가하는 추세입니다. 드림핵 이용자분들도 버그바운티에 참여하여 자신의 실력을 향상, 검증하고 기업의 취약점을 보완하는데 기여해보시는 것은 어떨까요?
- https://medium.com/@dPhoeniixx/arbitrary-code-execution-on-facebook-for-android-through-download-feature-fb6826e33e0f
- https://www.facebook.com/BugBounty/posts/3964073313606865
- https://dreamhack.io/learn/33#17
- https://dreamhack.io/learn/33#18
- https://www.youtube.com/watch?v=j0darcE5apo
- https://www.youtube.com/watch?v=j0darcE5apo