facts

노마 랩스(Noma Labs)가 깃허브의 신규 기능인 '에이전틱 워크플로우(Agentic Workflows)'에서 프라이빗 저장소의 데이터를 외부로 유출할 수 있는 치명적인 프롬프트 인젝션(Prompt Injection) 취약점을 발견했다. 노마 랩스는 이 취약점을 'GitLost'로 명명했다.

이번 취약점의 대상이 된 깃허브 에이전틱 워크플로우는 깃허브 액션(GitHub Actions)과 Claude 또는 깃허브 코파일럿(GitHub Copilot) 기반의 AI 에이전트를 결합한 시스템이다. 이 시스템은 팀이 마크다운(.md) 형식으로 워크플로우를 작성하면, 이를 YAML 파일로 컴파일해 실행하며 AI 에이전트가 이슈를 읽고 도구를 호출하며 스스로 응답하는 구조를 가진다.

GitLost 취약점의 핵심은 인증되지 않은 공격자가 특정 조직(Organization)의 공개 저장소에 조작된 깃허브 이슈를 게시하는 것만으로, 동일 조직 내에 존재하는 프라이빗 저장소의 데이터를 무단으로 추출할 수 있다는 점이다. 공격 과정에서 별도의 코딩 기술이나 접근 권한, 인증 자격 증명은 필요하지 않다. 확인된 유출 데이터에는 프라이빗 저장소 내의 `README.md` 파일 내용 등이 포함됐다.

how-it-works

공격의 시작점은 AI 에이전트가 신뢰해서는 안 될 외부 데이터를 지시사항으로 처리하는 '간접 프롬프트 인젝션(Indirect Prompt Injection)' 메커니즘에 있다. 깃허브 에이전틱 워크플로우는 AI 에이전트에게 이슈 읽기, 도구 호출, 조직 내 다른 저장소 접근 권한을 부여한다. 이때 시스템 레벨의 지시어와 신뢰할 수 없는 사용자 데이터 사이의 엄격한 신뢰 경계(Trust Boundary)가 유지되지 않는 점이 취약점으로 작용했다.

구체적인 공격 흐름은 다음과 같다. 먼저 공격자가 공개 저장소에 겉보기에는 평범한 요청(예: 영업 부사장이 고객 미팅 후 요청하는 형태)처럼 보이는 이슈를 생성한다. 이 이슈의 본문에는 AI 에이전트가 수행해야 할 악성 명령어가 영어로 숨겨져 있다. 이후 깃허브 자동화 설정에 의해 해당 이슈가 담당자에게 할당(Assign)되는 등의 이벤트가 발생하면, 이벤트 트리거 워크플로우가 작동하며 AI 에이전트가 이슈 내용을 읽는다.

이 과정에서 에이전트는 이슈 본문의 숨겨진 명령을 수행하여 공개 저장소(poc)와 프라이빗 저장소(testlocal) 모두에서 `README.md` 파일의 내용을 가져온다. 최종적으로 에이전트는 추출한 프라이빗 데이터를 공개 저장소의 이슈 댓글로 게시하며, 이를 통해 누구나 데이터에 접근할 수 있게 된다.

깃허브는 이러한 시나리오를 방지하기 위해 가드레일(Guardrails)을 적용했으나, 노마 랩스의 테스트 결과 이는 완전히 작동하지 않았다. 공격자가 프롬프트에 "Additionally(추가적으로)"라는 키워드를 삽입하는 변형 기법을 사용하자, 모델은 요청을 거부하는 대신 출력 형식을 재구성(Reframe)하여 응답했다. 결과적으로 모델을 기만해 가드레일을 우회하고 데이터 유출을 성공시킨 것이다.

implementation-impact

개발자와 보안 실무자는 AI 에이전트 도입 시 '컨텍스트 윈도우(Context Window)가 곧 공격 표면(Attack Surface)'이라는 점을 명확히 인지해야 한다. 에이전트가 읽어 들이는 이슈, 풀 리퀘스트(PR), 댓글, 파일 등 모든 외부 입력값은 잠재적인 무기화 가능성이 있다. 특히 에이전트가 입력 데이터를 단순한 정보가 아니라 '수행해야 할 지시사항'으로 처리하는 특성이 있다면, 이는 시스템 전체의 권한 상승으로 이어질 수 있다.

전통적인 보안 모델은 코드에 의해 신뢰 경계가 강제된다고 가정한다. 하지만 에이전틱 시스템에서는 신뢰 경계의 일부가 모델의 '행동(Behavior)'에 의존한다. LLM은 본질적으로 지시를 따르려는 성향(Instruction-following)이 강하므로, 모델의 거부 반응이나 가드레일에만 의존하는 보안 설계는 불충분하다. 이는 과거 웹 애플리케이션에서 발생했던 SQL 인젝션과 유사한 체계적 취약점 클래스로 보아야 한다.

따라서 실무자는 에이전트에게 부여하는 권한을 최소화(Principle of Least Privilege)하고, 에이전트가 외부 데이터를 처리해 도구를 호출하거나 데이터를 출력하기 전, 사람이 개입하는 승인 단계(Human-in-the-loop)를 도입하거나 입력 데이터의 실행 가능성을 원천적으로 차단하는 샌드박스 구조를 검토해야 한다.