구글플레이에 국내 군사기밀 노린 악성 앱 유포됐었다

지난해 8월 삭제...해커, 정상적인 앱에 악성코드 심어

컴퓨팅입력 :2019/02/11 17:16    수정: 2019/02/12 08:55

구글 공식 앱 장터에서 국내 지역버스정보 앱으로 둔갑한 안드로이드 악성코드가 배포되다가 지난해 8월 삭제된 일이 최근 뒤늦게 드러났다. 해당 앱은 각각 지난 2013년부터 2017년 사이에 구글플레이에 등록돼 무료 배포된 정상 앱이었다.

이 악성코드는 감염자한테서 주로 군사 외교 관련 파일을 찾아내 어디론가 보내왔다.

해커는 자신의 악성코드를 유포하기 위해 5년간 이 앱을 배포해 온 한국 개발자 A씨의 구글 계정을 탈취해 이용했다. 이를 알아차린 구글은 악성코드 유포수단이 된 버스정보 앱 네 건을 구글플레이 앱 장터에서 삭제하고, A씨의 계정을 정지시켰다.

2018년 8월초 한국 안드로이드 이용자를 노린 악성코드 유포 사건이 발생했다. 미국 보안업체 맥아피가 당시 악성코드를 분석한 결과를 2019년 2월초 공개했다. 군사·정치기밀을 노린 표적공격이었다고 진단했다. 악성코드 유포는 구글 공식 앱 장터 '구글플레이'에 정상 등록돼 있던 국내 버스정보 앱의 개발자 계정을 탈취해 진행됐다. [사진=Pixabay]

11일 현재 A씨의 버스정보 앱은 구글플레이에서 정상적으로 서비스되고 있다. A씨는 탈취당한 기존 계정 대신 새 구글 계정을 통해 앱을 배포 중이다. A씨가 계정을 탈취당한 경위는 확인되지 않았지만, 앞서 그의 앱 개발환경을 장악한 표적공격의 일환일 가능성이 있다.

당시 A씨는 구글 서비스 개인 계정과 앱 개발 계정을 분리하지 않고 함께 사용해 왔고, 로그인시 번거로움때문에 이중요소인증(2FA)과 같은 계정 보안 수단을 추가 적용하지 않았다. 사건 이후 A씨는 개발자 계정을 별도로 관리하고, 개발장비와 계정 보안에 신중을 기하게 됐다.

해커의 신원은 불분명하지만, 그가 유포한 악성코드는 감염 기기에서 이름에 군사·정치 관련 단어를 포함한 파일을 수집해 외부 서버로 전송했다. 악성 행위에 인기 앱을 개발해 온 계정을 이용당한 사례가 소프트웨어(SW) 개발환경 보안의 중요성을 일깨운다.

악성코드가 구글플레이에 정식 등록된 한국 버스정보 앱을 경유해 유포된 사건은 지난 4일 미국 사이버보안업체 맥아피의 분석 보고서 공개로 외부에 드러났다. 당시 국내 수사기관에서도 이 사건을 조사했지만, 이후 수사 결과는 공개되지 않았다.

악성코드 감염에 의한 피해도 구체적으로 확인되지 않았다. 다만 악성코드 감염 기기에 설치되는 트로이목마의 악성 행위 가운데 이름에 특정 단어를 포함한 파일을 외부 서버로 보내는 동작이 맥아피 보안전문가와 수사기관 담당자의 주의를 끌었을 것으로 보인다.

해커가 파일명에서 일치여부를 판정해 외부 서버 업로드 대상으로 삼은 키워드는 42개다. 그중 대부분인 39개가 대북·군사·정부·정치·외교 관련 용어였고, 나머지 일부인 3개가 특정 파일 포맷 확장자였다. 악성코드 유포는 기밀 탈취를 위한 표적공격의 일환으로 추정됐다.

■ 미국 맥아피, 한국 인기 앱 위장 악성코드 유포 사례 분석결과 발표

맥아피 모바일리서치팀은 2019년 2월 4일 안드로이드 악성코드 유포 공격에 동원된 한국 지역 버스정보 앱의 분석 결과를 공개했다. [바로가기 ☞ MalBus: Popular South Korean Bus App Series in Google Play Found Dropping Malware After 5 Years of Development]

분석 결과 구글플레이에 정상 등록돼 일반 이용자들에게 제공되던 한국의 버스정보 앱 네 건이 2018년 8월 조작된 버전을 통해 악성코드 유포 수단으로 동원됐다. 조작된 버전의 앱은 자신이 설치된 모바일 기기를 '플러그인'으로 위장한 트로이목마 악성코드에 감염시켰다.

구글플레이 버스앱으로 위장한 악성코드 유포앱을 내려받은 안드로이드 기기 대상 감염과정을 도식화한 다이어그램. [자료=맥아피]

트로이목마는 감염 기기 이용자의 구글 계정 패스워드 입력을 가로채기 위한 피싱(phishing) 공격을 수행하고, 기기의 제어권을 탈취하도록 만들어졌다. 또 기기에서 특정 단어를 포함한 파일명을 찾아 외부 서버로 전송하는 동작을 실행하도록 제작됐다.

트로이목마 경유 수단으로 전락한 문제의 앱은 '대구버스', '전주버스', '광주버스', '창원버스'라는 이름으로 구글플레이를 통해 배포됐다. 각각 2013~2017년 사이에 최초 등록됐고, 구글플레이 정보 기준으로 적게는 1천대 이상, 많게는 50만대 이상에 누적 배포된 인기 앱이었다.

해커는 구글플레이에 등록된 앱을 유포 수단삼아, 이를 내려받은 이용자들의 기기에 외부 서버에 올려 놓은 트로이목마와 가짜 플러그인 등 악성요소를 설치했다. 악성요소가 설치된 기기에선 기기 권한 탈취와 피싱 기법을 통한 계정 탈취 시도가 이어졌다.

■ 정상적인 버스 앱이 악성코드 유포 수단으로 전락

구글플레이에서 문제가 된 앱의 패키지 이름은 'lmh.android.dgbus', 'lmh.android.jjbus', 'lmh.android.gjbus', 'lmh.android.cwbus', 네 개다. 각각 대구, 전주, 광주, 창원 지역 실시간 버스정보를 제공하는 정상 앱이었다. 그런데 2018년 8월 9일 등록된 버전에 문제가 있었다.

당시 각 패키지 버전별 누적 설치 건수를 보면 lmh.android.dgbus 2.2.6 버전은 5만건 이상이었다. lmh.android.jjbus 3.6.5 버전은 50만건 이상이었다. lmh.android.gjbus 3.3.7 버전은 10만건 이상이었다. lmh.android.cwbus 1.0.3 버전은 1천건 이상이었다.

맥아피 모바일리서치팀 측은 "앱의 정상(clean) 버전과 달리, 악성 버전은 'libAudio3.0.so'라는 이름의 네이티브 라이브러리를 품었다"며 "앱의 'BaseMainActivity' 클래스 안에서 이 악성 라이브러리가 로드되고 'startUpdate()' 및 'updateApplication()'를 호출한다"고 설명했다.

'background.png'라는 이름의 표식 파일이 존재하는지, 가짜 플러그인이 설치돼 있는지 확인한다. 플러그인이 설치되지 않았을 경우, 해킹된 웹서버에서 다운로드된다. 이 때 이용자 기기에 "교통정보 플러그인이 설치되었습니다"라는 알림 문구가 뜬다.

updateApplication()는 앞서 언급한 웹서버에서 악성 라이브러리를 내려받아 로드한다. 처음 다운로드되는 라이브러리 파일명은 'libSound1.1.so'다. 이게 메모리에 로드되면 파일 자체는 삭제되고, 트로이목마 구실을 하는 정보 추출 함수를 실행한다.

구글플레이의 악성 앱이 설치된 후 별도로 해킹된 웹서버를 통해 감염 기기에 추가 다운로드되는 가짜 플러그인이 설치될 때의 알림 메시지. [자료=맥아피]

해킹된 웹서버에서 전달돼 감염 기기에 설치되는 악성요소는 9건이다. 가짜 플러그인이 3건, 트로이목마가 6건이다. 모두 동일한 확장자(.mov)를 사용해 미디어 파일로 위장하고 있다. 이가운데 가짜 플러그인은 'playMovie()'라는 이름의 네이티브 함수를 실행한다.

이 함수는 LibMovie.so라는 파일에 구현돼 있다. 이 파일은 libpng.2.1.so 파일로 위장한 트로이목마 악성코드의 실행 경로에 드롭된다. 이 악성코드는 LibMovie.so 파일 안에 xor 연산으로 부호화돼 있다가 실행될 때 복호화된다.

실행 권한이 주어진 뒤 트로이목마 안에 있는 정보 추출 함수 'Libfunc' 주소는 'dlsym()'를 동적으로 발견된다. 파일시스템에 드롭된 트로이목마 바이너리는 탐지 회피를 위해 삭제되고, 최종적으로 Libfunc 함수를 실행한다.

악성 플러그인은 이와 별도로 분기되는 프로세스에서 기기의 SD카드 저장장치에 설치된 'naver.property' 파일에 접근을 시도한다. 성공할 경우 매니페스트에 '.KakaoTalk' 클래스로 정의된 액티비티가 시작된다. 이는 구글 계정 탈취를 위한 피싱 공격 페이지를 표시한다.

■ 맥아피 "군사·정치 관련 기밀 수집 의도한 표적공격"

맥아피 모바일리서치팀 측은 "KakaoTalk 클래스는 javapage.html이라는 로컬 HTML 파일을 여는데 이는 감염 기기에서 이용자가 자기 계정으로 자동으로 로그인을 하도록 등록된 이메일 주소를 포함하고 있다"고 지적했다.

설명에 따르면 로컬 페이지는 로딩을 마친 뒤 자바스크립트 함수 'setEmailAddress'로 감염 피해자의 이메일 주소를 설정한다. 해커는 이를 통해 구글 서비스에서 구글 계정 탈취, 특정 계정의 패스워드 복구 요청, 새 구글 계정 생성시 복구 이메일 주소 지정 등을 시도했다.

또 Libfunc 함수가 실행되면 구글 계정 탈취를 위한 피싱 웹페이지가 열릴뿐아니라, 감염 기기 제어권이 해커의 손에 넘어간다. 이 시점에 감염 기기는 'doMainProc()' 함수로 구현된 트로이목마에 의해, 악성코드에 하드코딩된 해커의 명령제어서버를 통해 조종된다.

맥아피는 감염 기기를 조종하는 해커의 명령제어서버 11개의 소재지를 제시했다. 한국에 3개, 아제르바이잔에 2개가 있다. 인도네시아, 파푸아뉴기니, 미국, 칠레, 리투아니아, 터키에 나머지 6개가 있다.

이 트로이목마는 ▲감염 기기에 파일을 다운로드, 업로드, 삭제하기 ▲서버측 명령 실행과 결과 전송하기 ▲기기에 설치된 앱 목록 확인하기 ▲기기의 디렉토리 스캔 또는 기기 정보 획득 등 일반적인 트로이목마의 동작을 수행한다.

맥아피 측은 "이 명령 가운데 특정한 디렉토리에서 색인을 만드는 기능이 중요하다"며 "디렉토리 구조는 'kakao.property'라는 파일명에 저장되고 감염 기기에서 주어진 경로를 색인화하는데, 이 때 특정 키워드를 포함한 파일을 확인해 원격 서버에 업로드한다"고 설명했다.

악성앱 설치 기기에 해킹된 웹서버를 통해 추가 설치되는 가짜 플러그인이 기기를 장악하기 위해 진행하는 파일 드롭 또는 로컬 자원 접근 과정 다이어그램. [자료=맥아피]

분석 결과 해커는 트로이목마가 감염 기기에서 파일명에 42개 키워드와 일치하는 파일을 찾아 서버로 업로드하도록 만들었다. 대북·군사·정부·정치·외교 관련 용어가 39개였다.

파일명에 ▲북한 ▲국방 ▲국정원 ▲대북 ▲탈북 ▲청와대 ▲문재인 ▲대통령 ▲총리 ▲작계 ▲작전 ▲장관 ▲대사관 ▲남북 ▲북남 ▲특공 ▲소장 ▲중장 ▲대장 ▲소령 ▲중령 ▲대령 ▲소위 ▲중위 ▲대위 ▲wpt ▲WPT ▲vcf ▲특전 ▲군단 ▲사단 ▲연대 ▲여단 ▲대대 ▲중대 ▲전차 ▲회담 ▲정상 ▲기무사 ▲국회 ▲통일부 ▲외교부 등 단어를 포함하면 원격 서버에 전달되도록 만들어졌다.

맥아피 보안연구원들은 "공격자가 공식 구글플레이 앱 장터에 숨어들어 이용자들이 기기를 보호하기 어렵게 만들려하는 시도는 드물지 않다"면서 "이런 악성 소프트웨어는 평범한 피싱 의도가 아니라 감염 기기에서 군사·정치 관련 파일을 탐색하고 기밀 정보 유출을 시도하고자 진행된 표적 공격 차원으로 제작됐다"고 결론내렸다.

■ 앱 개발자 A씨 "현재 앱 개발·배포 정상화…보안 중요성 깨달아 철저 관리 중"

악성코드 유포는 지난해 8월 발생했고, 문제가 된 앱과 A씨의 계정은 구글플레이에서 사라졌다. 그는 현재 다른 개발용 구글 계정을 만들어 정상적인 버스정보 앱을 개발해 배포하고 있다. 그런데 사고 배경과 관련해 A씨의 불찰을 질타하는 분위기가 형성되고 있다.

사건 발생 6개월만에 맥아피에서 분석 결과를 발표하고 이를 언론이 막 기사화한 결과다. 맥아피 측에서는 자신들이 수집한 악성코드 샘플의 분석 결과만을 설명했고, 사건의 전말에 대해서는 거의 언급하지 않았다. 그래서 악성코드가 현재 유포 중인 걸로 오해하는 이들도 있다.

A씨는 지난해 8월 대검찰청 사이버수사과의 연락을 통해 자신의 개발 계정이 해커에게 도용당했고, 해커에 의해 조작된 버전이 구글플레이에 등록됐음을 알게 됐다. 수사에 협조해 문제가 생긴 앱의 배포를 중지하고, 새 버전으로 업데이트 등 조치를 취했다.

대검찰청 측은 이 사건의 수사를 자체적으로 진행했다. 하지만 수사 내용을 해당 지역 경찰청과 공유하거나, 공동 조사를 진행하진 않았다. 수사 결과를 발표하지도 않았다. 악성코드 유포 배후를 북한 해커 소행으로 의심하는 이들도 있지만, 적어도 공표된 사실은 아니다.

2018년 8월 구글플레이 계정을 탈취당했던 개발자가 최근 온라인커뮤니티 클리앙에 악성코드 유포 사건 발생 당시 상황, 경과, 사후조치 등을 설명하기 위해 남긴 글. [자료=사이트 캡처]

A씨는 "문제 발생 직후 사용자들에게 해킹 사실과 악성코드가 없는 새 버전으로 업데이트하라는 내용을 공지했다"며 "이후 구글에서 직접 계정을 중지하고 앱을 삭제했다"며 "현재는 (정상 앱을) 새 계정으로 이관해 안전하게 배포하고 있고, 관련 수사는 끝났다"고 설명했다.

A씨는 자신이 해킹을 인지한 상황과 사후 대응 과정 등을 지난 9일 인터넷 커뮤니티 '클리앙'에 게재하기도 했다. 자신도 모르게 자신의 구글 계정이 도용당해 조작된 앱이 배포됐고, 수사기관 연락을 통해 이를 알아차렸고, 이후 개발장비 및 계정 변경과 2차인증 적용 등 보안에 신경쓰게 됐다는 설명이다. [바로가기 ☞ 논란의 버스앱 개발자 입니다]

관련기사

이 사건이 최근 알려지면서, 주말부터 새삼 여러 문의와 연락을 받고 있다. 그 내용엔 비난과 욕설도 포함돼 있다. 그는 자신이 보안 관리에 철저하지 못했던 잘못이 있다는 점을 인정했지만, 문제 해결을 위해 노력한 의도를 부정당하는 것 같아 괴롭다는 심경을 토로했다.

A씨는 "보안관리 잘못으로 저를 질타하는 것은 겸허히 수용하도록 하겠다"면서도 "해킹 발생 직후 사용자들에게 모두 공지하고 이 문제를 해결하기 위해 노력했는데, 학생 시절부터 시민 편의를 위해 시작한 앱 개발 의도마저 의심받아 심적으로 힘들다"고 말했다.