GitHub 시큐리티랩이 오픈소스 AI 에이전트로 안드로이드 애플리케이션 취약점 24건을 찾아 신고했다. 개발자라면 누구나 자기 저장소에 그대로 겨눌 수 있는 도구다. 연구원 케빈 스터빙스는 GitHub 블로그 글에서 작업 과정을 공개하며 이미 공개된 두 건을 짚었다. 내비게이션 앱 OsmAnd의 조용한 위치 유출, 그리고 위키백과 안드로이드 앱의 탭 한 번짜리 계정 탈취다.
핵심 요약
- GitHub 시큐리티랩의 오픈소스 Taskflow Agent 위에 직접 만든 태스크플로로 안드로이드 취약점 24건을 찾아 신고했다.
- 플레이스토어 내려받기 1,000만 건이 넘는 OsmAnd의 익스포트된 액티비티 탓에, 기기에 설치된 다른 앱이 지도 설정을 바꾸고 이용자의 타일 좌표와 경로를 공격자 서버로 흘려보낼 수 있었다.
- 모델은 버그를 찾는 데는 훨씬 뛰어났지만 등급을 매기는 데는 약했다. 낮은 심각도 잡음과 오탐이 끊이지 않아 결국 사람이 걸러내야 했다.
안드로이드용으로 태스크플로를 어떻게 다듬었나
에이전트 자체는 범용이고, 값어치는 프롬프트에 있었다. 스터빙스는 진입점을 모바일과 비모바일로 나누는 gather_mobile_entry_point_info.yaml 태스크플로를 추가했다. 휴대폰 앱과 웹 서버, 데스크톱 클라이언트가 한 저장소에 섞여 있어도 모델이 엉뚱한 공격면을 붙들고 추론하지 않게 하기 위해서다.
이어 classify_application_local.yaml을 손봐 컨퓨즈드 데퓨티 문제, 안전하지 않은 브로드캐스트 같은 취약점 분류를 이름 그대로 지정했다. 모델이 알아서 떠올리기를 기대하지 않은 것이다. 모델 출력이 비결정적이라 엄격한 프롬프트를 폭넓은 프롬프트와 나란히 여러 번 돌렸다. 좁은 쪽이 뻔한 것을 잡고, 넓은 쪽이 뜻밖의 것을 찾아낸다.
OsmAnd 결함으로 무엇이 가능했나
24건 가운데 3건이 OsmAnd에서 나왔고, 가장 심각한 건은 코딩 실수라기보다 구조 설계의 문제로 읽힌다.
- 딥링크와 설정 가져오기를 처리하는 화면인
MapActivity가 익스포트돼 있어, 기기의 다른 앱이 그대로 호출할 수 있다. - 이 화면의 가져오기 경로는
silent_import,replace,export_type_list_key같은 인텐트 엑스트라를 읽는데, 개발진은 이들이 프로세스 내부 AIDL 채널로만 들어온다고 봤다. 안드로이드에는 외부 호출자가 어떤 엑스트라를 붙일지 제한할 방법이 없다. - 따라서 권한이 없는 앱도 알림이나 확인 절차 없이 설정을 쓸 수 있다. OsmAnd가 지도 타일 URL을 만들 때 쓰는 템플릿까지 포함해서다.
- 그 템플릿이 공격자 호스트를 가리키면 불러오는 모든 타일의 좌표와 계획한 모든 경로가 새어 나간다. 그 사이 서버는 진짜 OpenStreetMap 이미지를 대신 받아다 넘겨주므로 지도는 멀쩡해 보인다.
메모리 안전성 오류도, 특이한 기기 설정도 끼어 있지 않다. 정적 분석기가 좀처럼 짚지 못하고, 검토자도 끝까지 따라갈 시간이 없는 종류의 논리 결함이다.
엉뚱한 문자열을 믿은 딥링크 검사
위키백과 건은 링크 한 번 탭으로 계정 탈취까지 이어지는데, 원인은 문자열 비교 한 줄이다. 딥링크 처리기가 URL의 authority를 기준 도메인과 일치시키는 대신 endsWith로 검사했다. 그래서 evil-wikipedia.org 같은 유사 도메인을 겨눈 wikipedia:// URL이 검사를 통과해 앱의 WebView 안에서 열렸고, 공격자의 자바스크립트가 앱이 자기 것으로 취급하는 컨텍스트에서 실행됐다.
쿠키 관리자의 두 번째 검사도 같은 실수를 되풀이해, 그 페이지가 모든 위키미디어 자산에서 유효한 세션 쿠키를 읽을 수 있었다.
모델이 약했던 지점
스터빙스는 약점을 숨기지 않았다. 심각도 추정이다. 하지 말라고 일러둬도 모델은 영향이 미미한 문제를 계속 올렸고, 완화 요인이 공격을 무력화하는 경우에는 실제 파급력을 잘못 짚었다. 외부 저장소로 향하는 경로 조작은 앱이 같은 데이터에 내부 저장소를 우선한다면 아무 쓸모가 없다. 작동하는 개념 증명을 반드시 만들게 하면 그런 사례 일부가 드러나지만, 중요하지 않을 수 있는 버그에 실행 비용을 더 쓰게 된다.
대신 강했던 쪽은 API 지식이다. 모델은 Go의 path.Clean과 filepath.Clean처럼 보안상 의미가 갈리는 함수 동작을 안정적으로 구분했고, 생성한 개념 증명도 대부분 손볼 곳이 거의 없었다. Help Net Security가 정리했듯 모든 결과물에는 여전히 모바일 앱을 아는 검토자가 붙어야 한다.
내 프로젝트에 직접 돌려보기
태스크플로는 seclab-taskflows 저장소에 있고 Codespace에서 바로 띄우도록 구성돼 있다. ./scripts/audit/run_mobile.sh myorg/myrepo를 실행하면 감사가 시작되는데, 중간 규모 코드베이스에서 한두 시간이 걸리고 걸러낸 항목을 SQLite의 has_vulnerability 열에 기록한다. Copilot 라이선스가 필요하고 프리미엄 모델 요청을 소모하며, GitHub은 토큰 비용이 만만치 않다고 미리 경고한다. 본지가 반대편에서 다뤄온 흐름의 건설적인 짝이기도 하다. 공격자들은 스캐너가 못 잡을 때까지 악성코드를 고쳐 쓰는 에이전트를 돌렸다.
FAQ 자주 묻는 질문
GitHub의 AI 보안 에이전트는 공짜로 쓸 수 있나?
Taskflow Agent와 예제 태스크플로는 오픈소스지만, 실제로 돌리는 일은 공짜가 아니다. GitHub Copilot 라이선스가 필요하고 한 번의 감사가 프리미엄 모델 요청을 대량으로 발생시킨다. GitHub은 큰 저장소에서는 이 비용이 무시할 수준이 아니라고 명시한다.
OsmAnd와 위키백과 취약점은 공개됐나?
그렇다. 두 건 모두 정상적인 신고 절차를 거쳤고 공개 이후에야 내용이 서술됐다. GitHub 시큐리티랩은 24건 가운데 나머지도 공개되는 대로 어드바이저리 페이지에 올린다.
AI 에이전트가 사람 보안 검토자를 대체할 수 있나?
이번 사례만 놓고 보면 아니다. 에이전트는 쓸 만한 단서와 작동하는 개념 증명을 만들어냈지만, 심각도가 낮은 문제를 과하게 올렸고 완화 요인이 있는 경우 파급력을 잘못 매겼다. 결국 해당 플랫폼에 익숙한 연구자가 결과를 하나씩 검증해야 한다.






