모델이 PowerShell 변수 충돌로 인해 사용자 홈
AI에게 복잡한 코딩이나 시스템 설정을 맡기면 몇 시간 걸릴 일이 몇 초 만에 끝난다. 하지만 믿고 맡긴 AI가 내 컴퓨터의 모든 파일을 지우려 한다면 이야기는 달라진다. Codex(AI 기반 코드 작성 도구)에서 gpt-5.6-sol 모델을 사용하던 중, 쉘 환경 격리가 되지 않아 사용자 루트 디렉터리를 삭제할 뻔한 심각한 안전성 결함이 발생했다.
전체 삭제라는 최악의 상황은 시스템 잠금(Lock) 덕분에 면했다. 명령어가 실행되던 중 디렉터리가 비어 있지 않다는 `WriteError: Directory is not empty` 에러가 발생하며 작업이 중단됐기 때문이다. 그러나 이미 .ssh, .config, .npm 같은 핵심 설정 파일과 도트파일(사용자 설정값이 담긴 숨김 파일)들은 일부 수정되었거나 사라진 것이 확인되었다.
사고의 원인은 윈도우의 PowerShell(명령어 입력 창)이 대소문자를 구분하지 않는 특성과 내장 자동 변수인 $HOME 사이의 충돌에 있었다. 고급 추론 모델이 실제 컴퓨터 터미널에 직접 접근할 때 이런 쉘 변수 작동 방식이 예기치 못한 명령으로 이어질 수 있다. GPT-5.6 제품군으로 CLI(명령줄 인터페이스) 에이전트를 구축한다면 외부와 완전히 격리된 가상 환경인 샌드박싱과 컨테이너화는 이제 선택이 아닌 필수다.
대소문자 미구분 특성으로 인해 로컬 변수 $home이 내장
단 몇 초 만에 생성된 스크립트 한 줄이 수년 치의 데이터를 날려버릴 뻔한 아찔한 상황이 벌어졌다. gpt-5.6-sol은 임시 디렉터리 설정을 위해 소문자 $home이라는 로컬 변수를 동적으로 선언했다. 하지만 PowerShell(윈도우 운영체제에서 명령어를 입력해 시스템을 제어하는 도구)은 대소문자를 구분하지 않는 특성이 있다. 시스템은 에이전트가 만든 소문자 변수를 사용자 프로필 디렉터리를 직접 가리키는 내장 자동 변수인 $HOME과 완전히 동일한 것으로 인식했다. 전역 스코프의 내장 변수가 AI가 임의로 만든 변수와 충돌하며 경로 정보가 뒤바뀐 셈이다.
스크립트가 삭제 명령 라인에 도달하자, 대상 경로는 임시 폴더가 아닌 실제 사용자 루트 디렉터리로 평가되었다. gpt-5.6-sol은 `Remove-Item -LiteralPath 'C:\Users\...' -Recurse -Force`라는 명령을 실행했다. -Recurse는 하위 폴더를 모두 포함하고, -Force는 읽기 전용 파일까지 강제로 지우라는 옵션이다. 변수 이름의 대소문자 차이를 무시한 시스템 특성 때문에 AI는 엉뚱한 경로를 삭제 대상으로 지정하고 파괴적인 명령을 내렸다.
CLI 에이전트를 도입할 때는 샌드박싱(외부와 격리된 가상 환경)과 컨테이너화(앱 실행에 필요한 모든 것을 하나로 묶어 독립시키는 기술)를 반드시 적용해야 한다. 시스템 기본 변수와 AI가 동적으로 생성한 변수가 충돌할 위험은 운영체제의 특성에 따라 언제든 발생할 수 있기 때문이다. 격리된 환경을 구축하면 AI가 잘못된 경로를 평가하더라도 실제 사용자 데이터가 저장된 루트 디렉터리에는 절대 접근할 수 없다. AI의 작은 논리적 실수가 시스템 전체의 치명적인 손실로 이어지는 경로를 원천적으로 차단하는 안전장치가 필요하다.
AI에게 시스템 설정을 맡기면 몇 시간의 수고가 몇 초로 줄어든다. 하지만 이번 gpt-5.6-sol 사례처럼 대소문자를 구분하지 않는 파워쉘의 특성이 내장 변수와 충돌하면, 단 한 줄의 코드가 수년 치 데이터를 삭제하는 흉기가 된다.
CLI 에이전트를 실무에 적용하려는 사용자는 이제 샌드박싱과 컨테이너화라는 격리 환경이 구축되었는지부터 확인해야 한다. AI의 지능을 믿는 것보다 그 지능이 날뛸 수 없는 울타리를 치는 것이 더 확실한 보안이다.




