Snowflake Jira 뚫은 GitHub Actions 스크립트 인젝션 사건
AI-Generated GitHub Copilot “Autofix” Allowed Compromise of Snowflake's Jira
TL;DR Highlight
이슈 제목 한 줄이 Actions 러너를 뚫어 Snowflake Jira 토큰을 유출시켰다
Who Should Read
GitHub Actions 워크플로에 이슈·PR 값을 넣어 쓰면서 AI 코딩 도구로 CI 코드를 고치는 개발자
Core Mechanics
- 이슈 제목으로 러너 명령 실행
- snowflake-connector-net의 jira_issue.yml이 이슈 제목을 셸 스크립트에 그대로 끼워 넣었다.
- 작은따옴표 하나로 echo '...'를 빠져나가 임의 명령을 실행할 수 있었다.
- issues: opened 트리거라서 GitHub 사용자 누구나 발동시킬 수 있었다.
- 안전한 패턴을 지우고 위험한 패턴을 넣었다
- PR #1218이 기존의 env: + jq --arg 방식을 지웠다.
- 대신 ${{ github.event.issue.title }}를 직접 보간하는 방식으로 바꿨다.
- 이 PR이 머지된 6월 18일부터 취약점이 살아 있었다.
- 보안 게이트 조건은 항상 참이었다
- if 조건이 github.event.pull_request.user.login을 검사했다.
- issues 이벤트에서는 pull_request가 항상 null이다.
- 그래서 조건이 항상 true가 되어 모든 사용자가 통과했다.
- GitHub Advanced Security는 못 잡았다
- 스캔이 취약한 jira_issue.yml을 추출해 분석했는데도 인젝션을 표시하지 않았다.
- Copilot Autofix의 문서상 기여는 같은 PR의 jira_close.yml 수정이었다.
- 8월 17일 업데이트: Copilot은 공동 작성자로 머지된 PR을 검토해 이상 없다고 판정했다. 코드 변경 자체가 AI 보조인지는 불분명하다.
Community Reactions
- zizmor로 정적 분석하면 잡혔다는 의견
- 댓글에서 zizmor를 CI에 넣으라는 제안이 나왔고, 해당 jira_issue.yml 줄에서 template-injection 오류가 난 출력을 붙였다.
- 신뢰도 High이고 자동 수정도 제공된다는 내용이다.
- 기술 부채 정리가 AI 덕에 쉬워져 위험을 불렀다는 의견
- 예전엔 백로그에 묻혔을 사소한 정리 PR이 에이전트 덕에 쉽게 만들어진다.
- 코드는 생성이 공짜여도 리뷰·유지 비용은 공짜가 아니라는 주장이다.
- Autofix를 허용한 쪽 책임이라는 의견과 AI 탓이 과하다는 반론
- Snowflake가 autofix를 허용했으니 스스로 발등을 찍은 것이라는 의견이 있었다.
- AI 반대 글이 과하고 사람이 감독할 책임이라는 반론도 있었다.
- PR #1218의 Copilot 커밋은 취약점과 무관해 보인다는 지적
- 댓글에서 Copilot 공동 작성 커밋이 하나뿐이고 취약점과 관련이 없다고 짚었다.
- 이후 원문에 Copilot의 역할을 명확히 하는 업데이트가 붙었다.
How to Apply
- zizmor를 워크플로에 돌려보기
- 오늘 레포의 .github/workflows에 zizmor를 실행해 template-injection 경고를 확인하라.
- 경고가 나온 run: 블록 목록을 만들어라.
- run: 블록 속 ${{ }} 보간을 env로 옮기기
- github.event.issue.title 같은 외부 입력은 env: 변수에 받아라.
- 셸에서는 "$ISSUE_TITLE"로 참조하고, JSON은 jq --arg로 만들어라.
- AI가 만든 CI 변경은 안전 패턴 삭제 여부를 diff에서 확인하기
- 리뷰 때 env:나 jq 같은 기존 방어 코드가 사라졌는지 먼저 봐라.
- 워크플로 파일 변경은 사람 승인을 필수로 설정하라.
- 워크플로 시크릿을 최소 권한·단기 토큰으로 바꾸기
- Jira 같은 외부 서비스 토큰은 읽기 전용으로 제한하라.
- 주기적으로 교체하는 절차를 만들어라.
Try It
# Claude 또는 ChatGPT에 붙여넣기 (GitHub Actions 워크플로 인젝션 점검용)
아래 GitHub Actions 워크플로를 보안 리뷰해 줘.
{{워크플로 YAML}}
다음을 확인해 줘.
1. run: 블록 안에서 ${{ github.event.* }} 같은 외부 입력을 직접 보간한 곳
2. if: 조건이 이벤트 종류에 따라 null이 되어 항상 참이 되는 곳 (예: issues 이벤트에서 github.event.pull_request 참조)
3. 시크릿에 접근하는 단계가 신뢰할 수 없는 사용자 입력으로 발동되는지
각 문제마다 위험한 줄, 이유, env: 변수와 jq --arg를 쓴 수정안을 보여줘.
이어서 해 볼 것: pip install zizmor 후 zizmor .github/workflows 를 돌려 결과를 비교해 봐.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓