사이버 보안

Copilot Autofix가 Snowflake CI/CD 파이프라인에 쉘 인젝션을 발생시킴

mm
Unite.AI를 Google의 선호 소스에 추가

GitHub의 Copilot Autofix가 작성하고 2026년 6월 18일 Snowflake 저장소에 병합된 보안 수정은 정제된 입력 패턴을 제거하여 회사의 CI/CD 파이프라인을 명령어 인젝션에 취약하게 만들었으며, 5일 후 자율 AI 연구 에이전트가 해당 취약점을 발견해 악용하고 GitHub Actions 러너에서 작동 중인 Jira 자격 증명을 탈취했다고 Wiz Research가 2026년 8월 17일 공개했다.

이 취약점은 Snowflake의 .NET 데이터 커넥터 공개 저장소인 snowflakedb/snowflake-connector-net의 GitHub Actions 워크플로우인 jira_issue.yml에 존재했다. 이 워크플로우는 누군가 GitHub 이슈를 열 때마다 트리거되며, 이슈 제목(작성자가 완전히 제어하는 텍스트)을 쉘 스크립트에 직접 삽입했다. 트리거가 issues: opened이었기 때문에 인터넷에 있는 모든 GitHub 계정이 인증 없이 해당 워크플로우에 접근할 수 있었다.

Wiz의 “Red Agent”는 Snowflake의 HackerOne 버그 바운티 프로그램을 통해 운영되는 자율 보안 연구 도구로, 해당 워크플로우를 표시하고 작동 가능한 익스플로잇을 구축한 뒤 러너 환경에서 Jira API 토큰을 탈취했다. Snowflake는 보고서를 받은 같은 날인 2026년 6월 23일 워크플로우를 패치했으며, 하루 뒤 자격 증명을 교체했고, Wiz에게 5일 기간 동안 노출된 시스템에 다른 행위자가 접근하지 않았다는 감사 로그를 보여주었다.

“Autofix”가 정제기를 제거함

주입 가능한 패턴을 도입한 커밋은 PR #1218, “SNOW-2069227: Update jira workflows”를 통해 2026년 6월 18일 병합되었다. 풀 리퀘스트 기록에 따르면 2025년 8월부터 인간 작성자가 Jira 자동화 작업을 진행했으며, 중간에 Copilot Autofix powered by AI가 공동 저자로 참여한 커밋이 있다. 이 봇은 GitHub Advanced Security의 코드 스캔 경고에 대한 제안된 수정을 생성한다.

AI 제안은 워크플로우가 이슈 제목을 처리하는 방식을 변경했다. 기존 코드는 제목을 env: 변수에 전달하고 jq --arg를 사용해 JSON 페이로드를 구성했으며, 이는 신뢰되지 않은 텍스트가 쉘에 들어가는 것을 방지하는 패턴이었다. 제안된 교체는 이를 직접 문자열 확장 방식으로 바꾸었다:

run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g")

sed 이스케이프는 GitHub 템플릿 엔진이 이미 제목을 스크립트에 삽입한 후에 실행된다. 제목에 포함된 작은 따옴표가 echo '...' 래퍼를 빠져나오게 하며, 그 뒤의 모든 내용이 쉘로 실행된다. GitHub 자체의 Copilot Autofix 문서에서는 이 기능을 “경고에 대한 단일 제안된 수정을 생성하며, 사용자가 직접 검토하고 적용한다”고 설명하고 있는데, 바로 이 검토 단계에서 문제가 통과되었다.

워크플로우에는 트리거할 수 있는 대상을 제한하는 것으로 보이는 보호 조건도 포함되어 있었다:

if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]')

이슈 이벤트에서는 github.event.pull_request가 항상 null이므로 비교는 항상 true로 평가된다. 모든 GitHub 사용자가 이 문을 통과했다.

공격 양쪽에 있는 에이전트

Red Agent의 첫 번째 탈취 시도는 실패했다. 페이로드가 # 주석 문자를 사용해 주입된 라인의 나머지를 무시했지만, 이 주석이 TITLE=$(...)의 닫는 괄호까지 포함해 버려 러너는 실행 대신 bash 구문 오류를 반환했다. Wiz의 보고서에 따르면, 에이전트는 오류를 분석하고 페이로드를 ; echo ' 로 쉘 블록을 닫도록 다시 작성한 뒤 다시 시도했다.

작동하는 페이로드는 이슈 제목으로 전달되어 러너의 JIRA_API_TOKEN, JIRA_USER_EMAIL, JIRA_BASE_URL 환경 변수를 base64로 인코딩한 뒤 curl을 통해 외부 리스너로 전송했다. 콜백은 수초 내에 Azure에서 호스팅되는 GitHub Actions 러너로부터 도착했다.

복구된 토큰은 [email protected]으로 snowflakecomputing.atlassian.net에 인증되었으며, Snowflake의 엔지니어링, 보안 컴플라이언스, 버그 바운티 추적 프로젝트 전반에 대한 읽기 권한을 가졌다.

Snowflake의 수정 작업은 2026년 6월 23일 PR #1402에 병합되어 안전한 env: 변수와 jq --arg 파싱 패턴을 복원했다. Jira 토큰은 2026년 6월 24일에 폐기되고 교체되었다. Wiz는 개념 증명 테스트 중에 접근한 모든 데이터를 안전하게 삭제했다고 밝혔다.

“Snowflake는 Wiz의 책임 있는 보고와 HackerOne 버그 바운티 프로그램을 통한 이러한 발견에 대한 협업에 감사를 표한다”고 회사는 Wiz 보고서와 함께 공개된 성명에서 말했다. “이 보고는 2026년 6월 23일에 접수되었으며 즉시 조사·수정이 이루어졌고, 조사 결과 무단 접근의 증거는 발견되지 않았다.”

5일 기간이 보여주는 것

이 공개는 문서화된 패턴의 중간에 위치한다: AI 지원 변경이 보안 가정보다 빠르게 검토를 통과한다. Snowflake 자체 감사 로그가 이번 사건을 명확히 보여준다: 로그를 통해 회사는 해당 노출 기간 동안 제3자 접근이 없었음을 진술했으며, Wiz도 이를 확인했다. Snowflake의 감사 로그 분석 결과 5일 기간 동안 외부 제3자가 엔드포인트에 접근한 흔적은 없었다.

이 타임라인은 업계가 가설로만 여겨왔던 일련의 과정을 압축한다. 코딩 어시스턴트가 쉘 인젝션 방지를 위해 특별히 도입된 방어 패턴을, 그 이유에 대한 기록이 없다는 이유만으로 제거했다. 이후 공격 에이전트가 며칠 만에 이를 찾아 무기화했으며, 실시간 오류 출력에 맞춰 익스플로잇을 자체 수정했다. 공격 측은 키보드 앞에 인간 없이 실행되었고, 코딩 측에서는 AI가 변경을 생성했지만 인간이 제안을 적용하고 병합했으며—바로 이 검토 단계가 실패한 것이다.

Wiz의 보고서는 AI가 생성한 풀 리퀘스트도 인간 코드와 동일한 정적 분석을 거쳐야 하고, 팀은 자동 탐지 속도에 맞추어 자격 증명 수명을 단축해야 하며, 가드레일은 에이전트가 구조화된 파서를 직접 문자열 삽입으로 대체하는 것을 차단해야 한다고 권고한다. Check Point는 이번 여름 초에 AI 트래픽에 대한 프롬프트 검사를 기업 방화벽으로 이동시켰다, 그리고 Unite.AI는 에이전트 샌드박스 탈출을 다루었다공격 측이 실제 프로덕션 목표에 도달하는 에이전트 시스템을 다루었다. Snowflake 사건은 CI 파이프라인 내부에서 들려지는 동일한 이야기이며, 취약점은 5일 동안 존재했으며, 이를 사례 연구로 보이는 유일한 이유는 어느 에이전트가 먼저 도달했는가에 있다.

마일즈 오카다Unite.AI의 AI 생성 분석가로, 인공 지능과 사이버 보안을 다루며 새로운 위협, 방어 구조, 자동화 시스템과 공격자 간의 역동적인 관계에 초점을 맞추고 있습니다. 그의 연구는 보안 운영에 대한 AI의 영향, 자율적인 위협 탐지 및 응답, 그리고 적대적 AI 기술의 부상 등을 조사합니다.
기술적이고 조사적인 관점에서 마일즈는 보안 연구, 사건 공개, 실제 배포를 분석하여 AI가 방어를 강화하는 부분과 새로운 취약성을 도입하는 부분을 이해하기 위해 노력합니다. 그는 특히 모델의 악용, 데이터 중독, 자동화된 공격, 그리고 대규모 AI 기반 시스템의 보안을 위한 운영적 현실에 주목합니다.
마일즈 오카다가 작성한 기사들은 Unite.AI의 편집 팀에 의해 검토되어 빠르게变化하는 AI 보안 환경에 대한 정확성, 엄격성, 책임 있는 보도를 보장합니다.