GitHub의 오픈소스 AI 감사 에이전트, 안드로이드 취약점 24건을 찾았다 — 심각도 판단은 계속 틀렸다

OsmAnd의 조용한 위치 유출과 탭 한 번으로 끝나는 위키백과 계정 탈취가, 누구나 자기 저장소에 돌려볼 수 있는 태스크플로에서 나왔다

|5분 읽기0
Source code on a developer's screen, the material GitHub Security Lab's open-source taskflow agent audits to surface Android vulnerabilities
Source code on a developer's screen, the material GitHub Security Lab's open-source taskflow agent audits to surface Android vulnerabilities

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에서 나왔고, 가장 심각한 건은 코딩 실수라기보다 구조 설계의 문제로 읽힌다.

  1. 딥링크와 설정 가져오기를 처리하는 화면인 MapActivity가 익스포트돼 있어, 기기의 다른 앱이 그대로 호출할 수 있다.
  2. 이 화면의 가져오기 경로는 silent_import, replace, export_type_list_key 같은 인텐트 엑스트라를 읽는데, 개발진은 이들이 프로세스 내부 AIDL 채널로만 들어온다고 봤다. 안드로이드에는 외부 호출자가 어떤 엑스트라를 붙일지 제한할 방법이 없다.
  3. 따라서 권한이 없는 앱도 알림이나 확인 절차 없이 설정을 쓸 수 있다. OsmAnd가 지도 타일 URL을 만들 때 쓰는 템플릿까지 포함해서다.
  4. 그 템플릿이 공격자 호스트를 가리키면 불러오는 모든 타일의 좌표와 계획한 모든 경로가 새어 나간다. 그 사이 서버는 진짜 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 에이전트가 사람 보안 검토자를 대체할 수 있나?

이번 사례만 놓고 보면 아니다. 에이전트는 쓸 만한 단서와 작동하는 개념 증명을 만들어냈지만, 심각도가 낮은 문제를 과하게 올렸고 완화 요인이 있는 경우 파급력을 잘못 매겼다. 결국 해당 플랫폼에 익숙한 연구자가 결과를 하나씩 검증해야 한다.

이 기사에 대한 반응을 남겨주세요!

SJ
로딩 중...

관련 기사

Vercel, 1년 전 고쳐진 버그 때문에 플랫폼 전역에서 AVIF를 껐다
Developer Tools

Vercel, 1년 전 고쳐진 버그 때문에 플랫폼 전역에서 AVIF를 껐다

Vercel은 신고된 Next.js RCE의 원인을 libheif에서 찾아 8월 13일 플랫폼 전역에서 AVIF를 껐고, 8월 25일까지 sharp·libvips·libheif 수정을 조율했다.

Seung Jung11일 전
ZCode, 스냅샷 한 번에 파일 42,411개 묶어 전송... 복호화 키는 Z.ai 서버에만
Developer Tools

ZCode, 스냅샷 한 번에 파일 42,411개 묶어 전송... 복호화 키는 Z.ai 서버에만

역공학 보고서에 따르면 Z.ai의 ZCode 앱이 Git 히스토리 전체를 알리바바 클라우드로 전송했고, 복호화는 회사 서버에서만 가능했다.

Seung Jung10일 전
Meta, 에이전트가 직접 질의하는 React 디자인 시스템 Astryx 오픈소스 공개
Developer Tools

Meta, 에이전트가 직접 질의하는 React 디자인 시스템 Astryx 오픈소스 공개

Meta가 사내 모노레포에서 8년간 다듬어온 React 디자인 시스템 Astryx를 6월 MIT 라이선스 퍼블릭 베타로 공개했다.

Seung Jung16일 전
포럼 이미지 버그로 OpenAI 내부 저장소가 뚫렸다
Developer Tools

포럼 이미지 버그로 OpenAI 내부 저장소가 뚫렸다

Hacktron AI가 libheif 힙 오버플로와 OpenAI SSO 결함을 엮어 직원 Codex 계정과 openai/openai 모노레포에 도달했다. 두 취약점은 모두 수정됐다.

Seung Jung11일 전
14.5주 만에 Rust 83만 줄, 에이전트가 끌고 간 런타임 재작성
Developer Tools

14.5주 만에 Rust 83만 줄, 에이전트가 끌고 간 런타임 재작성

GitHub가 코딩 에이전트를 동원해 TypeScript 43만 줄을 14.5주 만에 Rust 83만 2,378줄로 옮겼다. 메모리 사용량은 1,383MB에서 126MB로 떨어졌다.

Seung Jung11일 전
Microsoft, 한 달 966건 패치 신기록… 병목은 이제 방어자 쪽으로 넘어왔다
Developer Tools

Microsoft, 한 달 966건 패치 신기록… 병목은 이제 방어자 쪽으로 넘어왔다

Microsoft가 9월에 취약점 966건을 수정해 올해 누적이 2,750건에 육박했다. 보안 팀들은 이제 어려운 건 탐지가 아니라 분류라고 말한다.

Seung Jung13일 전