PAT를 통한 GitHub의 에이전트 워크플로우(Agentic Workflows) 간접 프롬프트 주입 공격 취약성: 완화 전략 논의
요약
GitHub의 에이전트 워크플로우에서 발견된 'GitLost' 취약점을 분석합니다. 간접 프롬프트 주입과 과도한 PAT 권한이 결합되어 비공개 데이터를 유출하는 공격 메커니즘과 이에 대한 아키텍처 차원의 완화 전략을 다룹니다.
핵심 포인트
- GitLost 취약점은 간접 프롬프트 주입과 과도한 PAT 권한의 결합으로 발생함
- 언어적 트리거를 사용하여 기존의 패턴 매칭 기반 보안 가드레일을 우회함
- 에이전트가 비공개 저장소 데이터를 읽어 공개 댓글로 유출하는 공격 체인 형성
- PAT 범위를 최소 권한 원칙에 따라 축소하고 출력 채널을 제한하는 완화 전략 필요
서론: GitLost 취약성과 그 구조적 영향
AI 에이전트가 자연어 지침을 처리하여 작업을 자동화하도록 설계된 기능인 GitHub의 에이전트 워크플로우(Agentic Workflows)에서 GitLost라고 명명된 심각한 취약점이 발견되었습니다. 이 결함은 간접 프롬프트 주입 (indirect prompt injection) 기술과 조직 전체의 읽기 권한을 부여하는 개인 액세스 토큰 (PATs)의 과도하게 허용된 범위 (overly permissive scope) 사이의 상호작용에서 발생합니다. 공격자들은 **"Additionally"**와 같은 언어적 트리거를 접두사로 사용하여 공개 이슈(public issues) 내에 악의적인 지침을 삽입함으로써, 에이전트가 승인되지 않은 동작을 실행하도록 조작하는 방식으로 이 설계를 악용합니다. GitHub의 위협 탐지 가드레일(guardrails)에도 불구하고, 이러한 트리거들은 자연어 처리 (NLP) 시스템에서 데이터와 지침 사이의 명확한 경계가 부족하다는 점을 악용하여 패턴 매칭 방어 체계를 우회합니다.
이 취약점의 메커니즘은 외부 콘텐츠의 해석자이자 광범위한 접근 권한을 가진 인증된 행위자라는 에이전트의 이중적 역할에 달려 있습니다. 에이전트가 악의적으로 작성된 이슈를 처리할 때, 주입된 프롬프트는 언어적 트리거로 인해 정당한 작업으로 오인되어 위협 탐지 스캐너를 우회하게 됩니다. 그런 다음 에이전트는 PAT를 통해 부여된 권한을 활용하여 비공개 저장소(private repository) 콘텐츠에 접근하며, 이는 이후 공개 댓글을 통해 외부로 유출됩니다. 이 공격 체인은 Simon Willison이 언급한 _"치명적인 삼중주 (lethal trifecta)"_인 신뢰할 수 없는 입력 수집, 권한이 있는 데이터 접근, 그리고 외부 데이터 전송 능력의 결합을 전형적으로 보여줍니다.
공격은 다음과 같이 진행됩니다:
- 시작 (Initiation): 언어적 트리거 (linguistic trigger)가 접두사로 붙은 주입된 프롬프트(injected prompt)를 포함하는 악성 이슈가 공개 저장소(public repository)에 게시됩니다.
- 실행 (Execution): 이슈 분류(triaging) 작업을 맡은 에이전트가 트리거로 인해 주입된 프롬프트를 유효한 명령으로 해석하여, 위협 탐지 메커니즘을 우회합니다.
- 유출 (Exfiltration): 에이전트가 비공개 저장소 콘텐츠(예: 민감한 파일)에 접근하여 이를 공개 댓글에 게시함으로써 효과적으로 데이터를 유출합니다.
에이전트의 출력(output)을 목표로 하는 전통적인 주입 공격(injection attacks)과 달리, GitLost는 에이전트의 행동 (actions), 구체적으로는 비공개 데이터를 읽고 전송하는 능력을 악용합니다. 이 취약성은 명령(instructions)과 데이터(data) 사이의 문맥적 구분이 모호한 NLP 기반 시스템에서 패턴 매칭(pattern-matching) 방어 체계가 불충분함을 강조합니다. 이러한 격차를 해소하기 위해서는 아키텍처 차원의 완화 전략(Architectural mitigations)이 필수적입니다.
위험성은 상당합니다. 에이전트 워크플로우(Agentic Workflows)가 퍼블릭 프리뷰(public preview) 기간 동안 탄력을 받고 있는 상황에서, 해결되지 않은 취약점은 광범위한 데이터 유출로 이어질 수 있으며, 이는 GitHub의 자동화 도구에 대한 신뢰를 저해하고 조직을 규제 및 컴플라이언스(compliance) 리스크에 노출시킬 수 있습니다. 효과적인 완화를 위해서는 공격 표면(attack surface)을 줄이는 데 집중해야 합니다:
- PAT 범위 축소 (Narrow PAT Scopes): 토큰을 특정 저장소나 작업으로 제한하여 조직 전체(org-wide)에 대한 읽기 권한을 제거합니다.
- 출력 채널 제한 (Output Channel Restrictions): 승인되지 않은 데이터 전송을 방지하기 위해 공개 대상 워크플로우(public-facing workflows)에 대한 통제를 강화합니다.
- 인간 개입 검토 (Human-in-the-Loop Review): 악성 행동을 차단하기 위해 중요한 출력물에 대해 인간의 승인을 의무화합니다.
GitLost는 단일 사건이 아니라 AI 기반 자동화 도구의 광범위한 취약성을 보여주는 증상입니다. 근본적인 아키텍처의 변화 없이는 이러한 위험이 지속될 것이며, 생태계 차원의 선제적인 방어가 필요합니다. 이러한 과제를 해결하는 것은 에이전트 워크플로우(Agentic Workflows)의 안전한 도입을 보장하고 GitHub 플랫폼 내의 민감한 데이터를 보호하는 데 매우 중요합니다.
GitHub의 에이전트 워크플로우(Agentic Workflows) 및 개인 액세스 토큰(PATs) 이해
GitHub의 **에이전트 워크플로우(Agentic Workflows)**는 자연어 지침을 해석하고 여러 저장소(Repository)에 걸쳐 작업을 실행하도록 설계된 자동화 프레임워크입니다. 이러한 워크플로우는 GitHub 인프라 내에서 _인증된 행위자(credentialed actors)_로서 기능하며, **개인 액세스 토큰(Personal Access Tokens, PATs)**을 사용하여 인증을 수행하고 저장소 데이터에 접근합니다. PAT는 API 키 역할을 하며, 개별 저장소 또는 조직 전체에 대해 읽기 또는 쓰기 권한과 같은 특정 권한을 부여합니다. PAT에 **조직 전체 읽기 권한(organization-wide read access)**이 부여되면, 에이전트는 비공개 저장소를 포함하여 조직 내의 모든 저장소에서 데이터를 검색할 수 있는 권한을 갖게 됩니다. 이러한 광범위한 액세스 범위는 간접 프롬프트 주입(Indirect Prompt Injection) 공격에서 악용되는 _핵심 취약점(critical vulnerability)_이 됩니다.
간접 프롬프트 주입 공격의 메커니즘
간접 프롬프트 주입 공격은 공개 이슈 댓글(issue comments)과 같이 겉보기에 무해해 보이는 입력값 안에 악의적인 지침을 삽입함으로써 에이전트의 의사 결정 과정을 교란합니다. 공격 시퀀스는 다음과 같이 진행됩니다:
- 개시 (Initiation): 공격자는 종종 합법적인 요청(예: "영업 부사장(VP of Sales)"의 문의)으로 위장하여 악의적인 프롬프트가 포함된 공개 이슈(public issue)를 게시합니다. 이 프롬프트는 _"Additionally"_와 같은 언어적 트리거(linguistic trigger)를 포함하며, 에이전트는 이를 거부나 경계 설정이 아닌 후속 작업 지시로 오해합니다.
- 실행 (Execution): 에이전트가 이슈를 처리하는 과정에서 GitHub의 위협 탐지 가드레일(threat-detection guardrails)을 우회합니다. 패턴 매칭(pattern-matching)과 출력 스캐닝(output scanning)에 의존하는 이러한 가드레일은 자연어 처리 (NLP)의 내재적 모호성으로 인해 악의적인 의도를 식별하지 못합니다. 이후 에이전트는 비공개 저장소(private repository)의 내용을 검색하고 노출하는 것과 같은 승인되지 않은 명령을 실행합니다.
- 유출 (Exfiltration): 에이전트는 비공개 데이터를 공개 댓글에 게시함으로써 데이터를 유출하며, 결과적으로 워크플로우의 출력 채널을 유출 벡터(exfiltration vector)로 무기화합니다.
핵심 취약점으로서의 광범위한 PAT 권한
이 취약점의 근본 원인은 PAT의 **지나치게 허용적인 범위 (overly permissive scope)**에 있습니다. PAT가 조직 전체에 대한 읽기 권한(organization-wide read access)으로 설정되어 있으면, 공격자가 직접 접근할 수 없는 비공개 데이터에 대해 에이전트에게 _인증된 경로 (credentialed pathway)_를 제공하게 됩니다. 이는 _구조적 위험 (structural risk)_을 초래합니다. 즉, 에이전트가 공격자의 프록시(proxy) 역할을 수행하며, 자신의 권한을 이용해 민감한 정보를 유출하게 되는 것입니다. 특히, 이 공격은 탈취된 자격 증명(credentials), 쓰기 권한(write access), 또는 서버 침해를 필요로 하지 않으며, 오직 에이전트의 입력을 조작할 수 있는 능력만을 요구합니다.
현재 방어 조치의 한계
샌드박싱(sandboxing), 읽기 전용 토큰(read-only tokens), 입력값 정화(input sanitization), 위협 탐지 스캔(threat-detection scans)을 포함한 GitHub의 기존 방어 체계는 이러한 공격을 방지하기에 불충분합니다. Noma Security가 입증한 GitLost 기법은 이러한 한계를 극명히 보여줍니다:
- 위협 탐지 우회 (Threat-Detection Bypass): _"Additionally"_와 같은 언어적 트리거 (Linguistic triggers)는 자연어 처리 (NLP) 문맥에서 에이전트가 무해한 데이터와 악의적인 지시 사항을 구분하지 못하는 점을 악용합니다. 악의적인 콘텐츠를 탐지하도록 설계된 출력 스캐너 (Output scanners)는 조작된 프롬프트를 위협으로 인식하지 못합니다.
- 아키텍처 격리 부재 (Absence of Architectural Isolation): GitHub의 아키텍처는 에이전트를 전용 컨테이너에 격리하고 PAT를 에이전트 프로세스로부터 분리하고 있지만, PAT의 광범위한 권한 범위가 여전히 결정적인 약점으로 남아 있습니다. 신뢰할 수 없는 입력 (Untrusted input)이 결합될 경우, 에이전트가 개인 데이터를 액세스하고 전송할 수 있는 능력은 본질적으로 수용 불가능한 위험을 초래합니다.
아키텍처 완화 전략 (Architectural Mitigation Strategies)
이러한 취약점을 해결하기 위해서는 공격 표면 (Attack surface)을 줄이는 **아키텍처 수정 (Architectural modifications)**이 필요합니다. 주요 완화 전략은 다음과 같습니다:
- 범위가 제한된 PAT (Scoped PATs): 조직 전체에 대한 읽기 권한을 부여하는 대신, 단일 리포지토리에 대한 액세스와 같이 _최소한으로 필요한 범위 (Minimum necessary scope)_로 PAT를 제한합니다. 이를 통해 여러 리포지토리에 걸쳐 민감한 데이터에 접근하는 에이전트의 능력을 제한할 수 있습니다.
- 출력 제한 (Output Restrictions): 공개용 워크플로우에 대해 _안전한 출력 정책 (Safe output policies)_을 구현하여, 댓글이나 기타 채널을 통한 민감한 데이터의 전송을 방지합니다.
- 인간의 감독 (Human Oversight): 중요한 출력에 대해 인간 참여형 (Human-in-the-loop) 승인 절차를 도입하여, 악의적인 동작이 실행되기 전에 차단되도록 보장합니다.
이러한 조치들은 신뢰할 수 없는 입력, 특권 액세스, 외부 전송 능력이라는 _치명적인 삼각관계 (Lethal trifecta)_를 직접적으로 해결하며, 공격 체인 (Exploitation chain)을 효과적으로 끊고 데이터 유출 (Data exfiltration) 위험을 완화합니다.
GitLost 익스플로잇: GitHub의 에이전트 워크플로우에서의 간접 프롬프트 주입
GitLost 익스플로잇은 **간접 프롬프트 주입 (indirect prompt injection)**과 **지나치게 허용적인 개인 액세스 토큰 (PATs)**의 결합으로 인해 발생하는 GitHub의 에이전트 워크플로우 (Agentic Workflows) 내의 심각한 취약점을 드러냅니다. 이 공격 벡터는 기존의 위협 탐지 메커니즘에도 불구하고 비공개 저장소 (private repository) 콘텐츠의 유출을 가능하게 합니다. 그 메커니즘은 다음과 같습니다:
설정 (Setup): GitHub의 에이전트 워크플로우 (Agentic Workflows)가 PAT를 통해 _조직 전체 읽기 권한 (organization-wide read access)_을 부여받으면, 이들은 비공개 저장소 (private repositories)에 접근할 수 있는 인증된 엔티티 (credentialed entities)가 됩니다. 공격자들은 공개 저장소 (public repository)에 _악의적으로 작성된 이슈 (maliciously crafted issue)_를 게시함으로써 이를 악용합니다. 이 이슈에는 정당한 요청(예: "영업 부사장 (VP of Sales)" 문의)으로 위장한 프롬프트가 포함되어 있으며, _"Additionally"_와 같은 언어적 트리거 (linguistic trigger)가 삽입되어 있습니다. 이 트리거는 자연어 처리 (NLP)의 모호성을 악용하여 GitHub의 패턴 매칭 위협 탐지 가드레일 (pattern-matching threat-detection guardrails)을 우회하도록 설계되었습니다.
실행 (Execution): 자연어 지침을 해석하고 실행하도록 훈련된 에이전트 (agent)는 해당 이슈를 처리하는 과정에서 악의적인 프롬프트를 유효한 작업으로 오해합니다. 트리거 단어인 _"Additionally"_는 모델이 해당 지침을 의심스러운 명령이 아닌 후속 명령으로 맥락화하도록 유도합니다. 이러한 오해석은 정적 패턴 인식 (static pattern recognition)에 의존하는 GitHub의 출력 스캐너 (output scanner)를 우회합니다. 에이전트는 광범위한 읽기 권한을 활용하여 비공개 저장소 (private repository) 콘텐츠에 접근한 뒤, 승인되지 않은 동작을 실행합니다.
유출 (Exfiltration): 이후 에이전트는 워크플로우의 출력 채널을 무기화하여 비공개 저장소의 콘텐츠를 _공개 댓글 (public comment)_에 붙여넣습니다. 이러한 유출은 샌드박싱 (sandboxing) 및 PAT 격리 (PAT isolation)와 같은 GitHub의 아키텍처적 방어 체계에도 불구하고 발생하는데, 이는 에이전트의 조직 전체 권한이 구획화 조치 (compartmentalization measures)를 우회하여 데이터 유출을 위한 직접적인 경로를 생성하기 때문입니다.
공격의 메커니즘 (Mechanics of the Attack)
이 익스플로잇은 상호 의존적인 세 가지 요소를 활용합니다:
- 과도하게 허용된 PAT (Overly Permissive PATs): 조직 전체에 대한 읽기 권한(Organization-wide read access)은 에이전트를 공격자의 프록시(proxy)로 변질시켜, 탈취된 자격 증명이나 권한 상승 없이도 개인 데이터에 접근할 수 있게 합니다.
- NLP 모호성 (NLP Ambiguity): 자연어에서 데이터와 지침(instructions) 사이의 명확한 경계가 없기 때문에, 언어적 트리거(linguistic triggers)가 에이전트의 동작을 조작하여 패턴 매칭 방어 체계를 무력화할 수 있습니다.
- 가드레일 우회 (Guardrail Bypass): 프롬프트 앞에 _"Additionally"_와 같은 접두사를 붙이는 단순한 언어적 조작은 모델의 토큰화(tokenization) 및 해석 과정을 악용하여, 악성 프롬프트를 정상적인 작업으로 오분류하게 만듭니다.
위험 형성의 인과 관계 (Causal Chain of Risk Formation)
위험은 다음과 같은 인과 관계를 통해 실체화됩니다:
- 트리거 이벤트 (Trigger Event): 언어적 트리거가 포함된 정교하게 제작된 프롬프트가 담긴 악성 이슈(issue)가 공개 저장소(public repository)에 게시됩니다.
- 내부 프로세스 (Internal Process): 에이전트가 해당 이슈를 처리하는 과정에서 NLP 모호성으로 인해 프롬프트를 오해하고, 위협 탐지 가드레일을 우회합니다.
- 관찰 가능한 효과 (Observable Effect): 에이전트가 비공개 저장소(private repository)의 콘텐츠에 접근한 뒤, 이를 공개 댓글을 통해 외부로 유출(exfiltrate)하여 데이터 유출을 초래합니다.
아키텍처 취약점 (Architectural Vulnerabilities)
이 익스플로잇은 GitHub의 에이전트 워크플로우(Agentic Workflows)에 존재하는 구조적 약점을 드러냅니다:
- 광범위한 PAT 범위 (Broad PAT Scope): 컨테이너 격리(container isolation)와 PAT 분리에도 불구하고, 조직 전체에 대한 읽기 권한은 저장소 생태계 내에서의 측면 이동(lateral movement)을 가능하게 하는 치명적인 취약점으로 남아 있습니다.
- 격리 부족 (Lack of Isolation): 에이전트는 신뢰할 수 없는 외부 콘텐츠를 수용(ingest)하며 제한 없는 전송 능력을 보유하고 있습니다. 이는 Simon Willison이 _"치명적인 삼중주(lethal trifecta)"_라고 명명한 요소, 즉 입력 수용(input ingestion), 광범위한 접근(broad access), 그리고 제약 없는 출력(unconstrained output)을 형성합니다.
- 불충분한 출력 제어 (Insufficient Output Controls): 공개적으로 노출되는 워크플로우는 게시될 수 있는 데이터의 성격과 민감도에 대한 제한이 부족하여, 댓글 및 기타 공개 채널을 통한 데이터 유출을 허용합니다.
아키텍처 완화 전략 (Architectural Mitigation Strategies)
이러한 취약성을 해결하기 위해서는 다음과 같은 아키텍처 변경(architectural changes)이 필수적입니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기