Noma Labs는 AI 기반 자동화를 사용하여 단 하나의 공개 GitHub 이슈만으로 비공개 저장소의 코드를 탈취할 수 있음을 보여주었습니다. 이들의 개념 증명(PoC)은 공격자가 조직의 자체 워크플로 봇을 역이용하여, GitHub의 인증 체계를 무너뜨리지 않고도 독점 파일을 유출할 수 있게 합니다.
눈앞에서 벌어지는 공격
일련의 과정은 재현하기가 매우 간단합니다:
- 공격자가 누구나 볼 수 있는 공개 저장소에 이슈를 생성합니다.
- 지속적 통합(CI) 파이프라인에 연결된 AI 에이전트가 이슈의 제목과 본문을 읽습니다.
- 해당 에이전트는 이미 조직 내 다른 비공개 저장소에 대한 읽기 권한을 가지고 있습니다.
- 공개 이슈에 숨겨진 지침이 에이전트에게 어떤 비공개 파일을 가져올지 알려줍니다.
- 에이전트는 가져온 파일을 공개 이슈에 댓글로 게시하여 전 세계에 노출합니다.
이 모든 과정은 자동화가 단 한 번 실행되는 동안 발생합니다. 자격 증명 탈취도, API 키 유출도, GitHub 자체의 취약점도 없습니다. 공격자는 단지 조직이 자신의 봇에 부여한 신뢰를 악용할 뿐입니다.
이것이 지금 중요한 이유
이제 AI 기반 에이전트는 현대적인 개발 파이프라인을 하나로 묶어주는 역할을 합니다. 이들은 이슈 댓글과 같은 가벼운 신호에 의해 트리거되어 pull-request를 생성하고, 테스트를 실행하며, 빌드를 배포하고, 버그를 분류(triage)합니다. 이러한 에이전트가 광범위한 저장소 접근 권한을 가질 때, 신뢰할 수 있는 데이터와 신뢰할 수 없는 사용자 입력 사이의 경계가 모호해집니다.
만약 에이전트가 동일한 실행 과정에서 비공개 코드를 읽고 공개적으로 글을 쓸 수 있다면, 조직의 접근 제어 모델은 무너집니다.
진짜 결함: 모델이 아닌 권한 문제
이번 시연은 기반이 되는 AI 모델의 결함을 지적하는 것이 아닙니다. 모델은 단지 전달받은 지침을 따를 뿐입니다. 취약점은 자동화에 부여된 권한 설정에 있습니다:
- 조직 전체의 비공개 저장소에 대한 읽기 권한.
- 공개 이슈 스레드에 대한 쓰기 권한.
- 누구나 작성할 수 있는 공개 텍스트에 의한 트리거.
비용은 들지 않지만 효과적인 해결책
최소 권한 원칙(principle of least privilege)을 적용하면 공격 경로를 대폭 차단할 수 있습니다:
- 봇의 범위를 제한하여 필요한 저장소에서만 작동하게 합니다. 특정 저장소에서만 작동해야 한다면, 다른 저장소에 대한 읽기 권한은 모두 거부하십시오.
- 읽기 및 쓰기 토큰을 분리합니다. 코드를 가져오는 데 사용하는 자격 증명과 댓글을 게시하는 데 사용하는 엄격히 제어된 별도의 자격 증명을 사용하십시오.
- 공개 게시 전 사람의 승인을 거칩니다. 필수 승인 라벨과 같은 가벼운 검토 단계를 추가하면 파이프라인을 중단시키지 않으면서도 체크포인트를 마련할 수 있습니다.
- 피해 범위(blast-radius) 축소. 실패나 오용이 발생하더라도 조직 전체가 아닌 최대 하나의 저장소에만 영향을 미치도록 워크플로를 설계하십시오.
반론: 운영 오버헤드
향후 주목해야 할 점
핵심 요약: AI 자동화가 비공개 코드를 볼 수 있는 동시에 공개적으로 글을 쓸 수 있다면, 해당 시스템은 잘못 설계된 것입니다. 권한을 강화하고, 사람의 확인 절차를 삽입하며, 피해 범위를 작게 유지하십시오. 그렇지 않으면 단 하나의 공개 이슈가 데이터 유출 경로가 될 수 있습니다.
