보안 취약점 고치려다 방어막 삭제: Copilot Autofix가 부른 Snowflake 유출 사건

보안 취약점 고치려다 방어막 삭제: Copilot Autofix가 부른 Snowflake 유출 사건

AI 보안GitHub ActionsSnowflakeCopilot

데이터 소스:HN + Wiz + CSA

취약점을 없애려던 패치가 오히려 방어막을 지워버리다

2026년 8월 17일, 사이버 보안 기업 Wiz는 데이터 기업 Snowflake를 겨냥한 권한 오용 접근 사건을 공개했습니다. 데이터 거두 Snowflake 내부에서 사용하던 Jira 시스템이 성공적으로 공략당해 내부 엔지니어링 기록과 보안 준수 프로젝트가 외부로 노출되었습니다. 뜻밖에도 해커에게 이 문을 열어준 결정적인 역할은 바로 마이크로소프트 산하의 AI 코딩 보조 도구인 GitHub Copilot Autofix였습니다.

2026년 6월 18일에 병합된 코드 커밋에서 AI 코딩 보조 도구는 자동화 워크플로 수정 작업에 참여하고 검토를 진행했습니다. 코드 검토 메커니즘은 이 제출건에 보안 승인 태그를 부여했으나, AI는 수정 과정에서 원래 명령 주입을 방지하던 보안 구조를 교체해 버렸습니다. 이 변경은 기존의 보안 경계를 직접적으로 파괴하여 문제 해결을 위한 패치가 시스템 자격 증명을 노출시키는 덫으로 변했습니다.

정적 속에서 무력화된 방어선: 완벽해 보였던 보안 스위치

자동화 스크립트에서 사용자가 제출한 제목을 처리하려면 데이터와 명령을 엄격히 분리해야 합니다. 원작자는 프로젝트에서 환경 변수와 구조화된 해석 도구 jq --arg를 사용하여 데이터를 전달했으며, 이러한 방식은 매개변수가 스크립트 해석기에 의해 명령으로 실행되지 않도록 보장했습니다. 하지만 AI가 자동 수정한 PR #1218에서 AI는 이러한 히스토리 문맥에 대한 이해가 부족하여 이 안전한 해석 코드를 직접적인 문자열 인라인 삽입 TITLE=$(echo '${{ github.event.issue.title }}' | sed ...)으로 교체했습니다.

AI의 풀 리퀘스트 자동 검토 시각화 그림: AI의 풀 리퀘스트 자동 검토 시각화. 출처: Unsplash / El Solitario

GitHub Actions의 실행 메커니즘에서 표현식 전개는 Bash 해석기가 명령을 읽기 전에 발생합니다. 사용자가 제출한 제목에 작은따옴표 '가 포함되어 있기만 하면 작은따옴표로 둘러싸인 구문 경계를 쉽게 돌파하여 운영체제 이미지 내에서 임의의 시스템 명령을 실행할 수 있습니다. sed가 문자열 필터링을 시도하더라도 이스케이프 처리 작업은 이미 셸 구문 트리가 파괴된 후에 일어나므로 방어 조치는 완전히 무용지물이 됩니다.

더욱 심각한 것은 워크플로 내부의 신원 방어 조건 자체에 치명적인 논리적 결함이 존재했다는 점입니다. 원래 코드는 github.event.pull_request.user.login을 비교하여 특정 봇의 작업을 필터링하려 했으나, 이슈로 인해 트리거되는 이벤트에서는 풀 리퀘스트 객체가 항상 null 값인 null이 됩니다. null 객체의 속성에 접근하면 조건 판단이 자동으로 실패하고 기본적으로 통과되어 정적 코드 분석 도구가 취약점을 차단할 기회를 완전히 놓쳤습니다.

AI 해커의 자가 수정: 구문 오류에서 5초 만에 자격 증명 탈취까지

취약점이 코드베이스에 숨어 있던 기간은 단 5일이었습니다. 2026년 6월 23일, Snowflake의 버그 바운티 프로그램에서 작동하던 자율 보안 에이전트 Wiz Red Agent가 이 고위험 인터페이스를 자동으로 스캔하고 위치를 파악했습니다. 전통적인 자동화 스크립트와 달리 이 AI 에이전트는 놀라운 엔지니어링 추론 능력과 자가 수정 능력을 보여주었습니다.

첫 번째 공격 시도에서 Red Agent는 샵 기호 #를 사용하여 후속 명령을 주석 처리하려 했으나, 불필요한 닫는 괄호로 인해 Bash 구문 해석 오류가 발생했습니다. 실행 실패 에러 메시지를 마주한 AI 에이전트는 포기하지 않고 에러 로그를 즉시 분석하여 공격 페이로드를 재조정했고, 세미콜론 ; echo '를 사용하여 구문 트리를 닫는 방식으로 바꾸었습니다. 두 번째 시도는 수초 만에 성공하였으며, Jira 자격 증명, 이메일 주소, 시스템 URL을 포함한 민감 정보가 신속하게 인코딩되어 지정된 테스트 서버로 전송되었습니다.

유출된 토큰을 통해 공격자는 테스트 계정 자격으로 Snowflake의 Atlassian 플랫폼에 로그인하여 내부 엔지니어링 아키텍처와 보안 준수 보고서를 직접 조회할 수 있었습니다. Snowflake 팀은 책임 있는 공개 제보를 받은 후 당일 응급으로 PR #1402를 병합하여 취약점을 수정하고 자격 증명을 갱신했으며 감사를 통해 Wiz가 유일한 접근자였음을 확인했지만, 이번 실전 공격과 방어 사례는 매우 엄중한 대립 구도를 보여주었습니다.

터미널에서 주입 명령을 실행하는 시각화 그림: 터미널에서 주입 명령을 실행하는 시각화. 출처: Unsplash / El Solitario

취약점 생성과 발견을 동시에: AI 자동화의 보안 사각지대

공식 통계에 따르면 Copilot Autofix는 개발자가 46만 개 이상의 보안 경고를 수정하도록 도왔습니다. 이는 AI 자동화가 대규모 패치 수정에서 놀라운 효율을 보인다는 점을 증명하지만, 깊은 문맥이 부족한 복잡한 시나리오에서는 숨겨진 사각지대 역시 비례하여 커짐을 의미합니다. 기업이 AI가 붙인 보안 승인 태그를 맹목적으로 신뢰할 때 방어선에는 이미 균열이 생기게 됩니다.

클라우드 보안 연합(CSA)이 2026년 5월과 8월 보고서에서 연이어 지적했듯이, CodeRabbit, Cursor, Gemini CLI를 포함한 AI 에이전트들이 인프라 파이프라인에 깊이 연결되어 있으며 그중 일부 도구는 CVSS 10.0의 최고 위험 취약점이 노출되기도 했습니다. 이는 AI 에이전트에게 코드 병합과 배포 권한이 부여될 때 보안성이 소프트웨어 공급망 전체의 생사를 직접 결정함을 보여줍니다.

실제 개발 생태계에서 오픈소스 코드베이스에는 비표준 자동화 스크립트 템플릿이 가득하며, AI 대형 모델은 학습 단계에서 결함이 있는 예시를 대량으로 흡수했습니다. 개발자가 AI를 사용하여 코드를 생성하거나 검토할 때 모델은 패턴 매칭 규칙에는 부합하지만 방어 의식이 부족한 범용 코드를 산출하는 경향이 있습니다. 정적 분석 도구는 null 통과와 같은 비즈니스 논리 취약점을 식별하기 어려워 방어선이 자동화 속에서 조용히 무너지게 됩니다.

사람 검토자에게만 모든 부담을 지울 수는 없다

Snowflake의 이번 보안 사건은 심각한 새로운 현실을 드러냅니다. AI 코딩 보조 도구가 취약점을 수리하면서 주입 방어 구조를 조용히 지워버렸고, AI 보안 에이전트는 같은 주에 해당 취약점을 자동으로 탐지하고 이용을 완료했습니다. AI가 취약점을 자동으로 생산하는 동시에 자동으로 소비하고 있으며, 사람의 검토 단계만이 전체 파이프라인에서 자동화되지 않은 유일한 고립 지대로 남았습니다.

공격과 방어 양쪽이 동시에 AI를 도입함에 따라 보안 방어의 경쟁은 더 이상 코드를 작성하는 속도 경주가 아니라 시스템의 히스토리 문맥과 경계 조건에 대한 통제력 경주가 되었습니다. AI 에이전트에 엄격한 구문 방어 가이드라인을 구축하여 단순한 문자열 삽입으로 구조화된 해석기를 대체하는 것을 금지해야 합니다. 사람 검토자가 AI가 생성한 패치에 습관적으로 승인 버튼만 누른다면 CI/CD 파이프라인의 보안 장부는 더 이상 버틸 수 없게 될 것입니다.

참고 링크:

  • Wiz 공식 보안 분석 보고서: Snowflake 내부 Jira 자격 증명 유출 사건
  • HackerOne 버그 바운티 공개 기록
  • Hacker News 커뮤니티 기술 토론
  • 클라우드 보안 연합(CSA) AI Agent 자동화 보안 연구 보고서