Codex를 Windows에서 사용할 수 있도록 안전하고 효과적인 샌드박스 구축

OpenAI는 Windows용 Codex를 위해 맞춤형 샌드박스 구현을 개발하여, 사용자가 비효율적인 수동 명령 승인과 무제한 "전체 접근" 모드 사이에서 선택해야 하는 상황을 없앴습니다. 이 샌드박스는 Codex가 파일을 광범위하게 읽을 수 있게 하면서, 특정 작업 공간에 대한 쓰기 접근을 제한하고 무단 네트워크 접근을 차단하여, Windows 환경을 macOS 및 Linux에서의 Codex와 동일한 안전성과 사용성을 제공하도록 합니다.

기존 Windows 격리 도구가 충분하지 않았던 이유

OpenAI는 여러 네이티브 Windows 격리 원시 기능을 평가했지만, 개발자 워크플로우(쉘, Git, Python 및 다양한 빌드 도구)의 개방형 특성과 호환되지 않는다는 것을 발견했습니다.

  • AppContainer: 강력한 OS 경계를 제공하지만, 좁은 범위의 애플리케이션을 위해 설계되었으며 코딩 에이전트가 실행해야 하는 다양한 바이너리 범위에 대해 너무 제한적이었습니다.
  • Windows Sandbox: 이 경량 VM은 강력한 격리를 제공하지만, Codex가 일회용 게스트 OS가 아닌 사용자의 실제 로컬 체크아웃 및 환경에서 작동해야 하기 때문에 부적합합니다. 또한 Windows Home SKU에서는 사용할 수 없습니다.
  • Mandatory Integrity Control (MIC): 낮은 무결성 레이블을 사용하는 것은 위험도가 높다고 판단되었습니다. 작업 공간을 낮은 무결성으로 표시하면 해당 호스트의 모든 낮은 무결성 프로세스에 대한 "싱크"가 되어, 샌드박스에만 대상 접근을 부여하는 것이 아니라 전체에 접근을 허용하게 됩니다.

"비관리자 샌드박스" 프로토타입

첫 번째 프로토타입은 관리자 권한 없이(비관리자) 실행되는 데 초점을 맞추었으며, 보안 식별자(SIDs)와 쓰기 제한 토큰을 활용해 파일 시스템 접근을 관리했습니다.

파일 시스템 쓰기 제한

Codex가 파일을 수정할 수 있는 위치를 제어하기 위해 팀은 합성 SIDs와 쓰기 제한 토큰을 조합했습니다:

  1. Synthetic SIDs: 맞춤형 sandbox-write SID를 생성하여, 다른 시스템 사용자와 충돌하지 않으면서 접근 제어 목록(ACL)에서 권한을 정의했습니다.
  2. Write-Restricted Tokens: 이 토큰은 쓰기 작업이 성공하려면 두 가지 검사를 필요로 합니다: 일반 사용자 신원이 허용되어야 하고, 토큰의 제한 목록에 있는 최소 하나의 SID(sandbox-write SID 포함)도 접근 권한을 부여받아야 합니다.

이를 통해 Codex는 현재 작업 디렉터리와 구성된 writable_roots에 대한 쓰기/실행/삭제 권한을 부여받았으며, .git, .codex, .agents와 같은 민감한 폴더에 대한 접근은 명시적으로 차단되었습니다.

네트워크 접근 제한

프로토타입이 비관리자였기 때문에 Windows 방화벽을 사용할 수 없었습니다. 대신, 환경 변수(HTTPS_PROXY, GIT_HTTPS_PROXY)를 오염시키고 PATH 앞에 denybin 디렉터리를 추가해 SSH 및 SCP 호출을 가로채는 등 "권고" 제한에 의존했습니다.

이 접근 방식은 프로세스가 환경 변수를 쉽게 우회하거나 직접 소켓을 열 수 있기 때문에 너무 약하다는 것이 밝혀졌습니다.

최종 "관리자 샌드박스" 아키텍처

강력한 네트워크 차단을 달성하기 위해 OpenAI는 설정 중 관리자 권한이 필요한 "관리자 샌드박스"로 전환하여 방화벽 규칙과 전용 시스템 사용자를 구현했습니다.

설정 및 권한

codex-windows-sandbox-setup.exe 바이너리는 관리자 설정을 처리합니다:

  • User Creation: 두 개의 로컬 사용자를 생성합니다: CodexSandboxOffline(방화벽 규칙에 의해 차단) 및 CodexSandboxOnline(차단되지 않음).
  • Credential Management: 사용자 자격 증명은 Windows 데이터 보호 API(DPAPI)를 통해 암호화됩니다.
  • Firewall Rules: CodexSandboxOffline 사용자에 대한 외부 네트워크 접근이 완전히 차단됩니다.
  • Read ACLs: 샌드박스 사용자는 실제 사용자와 구분되므로, 설정 과정에서 비동기적으로 필수 디렉터리(예: C:\Users\<real-user>, C:\Windows\, C:\Program Files\)에 대한 읽기/실행 권한을 부여하여 에이전트가 필요한 파일을 계속 읽을 수 있도록 합니다.

명령 실행 흐름

Windows 권한 경계 때문에 codex.exe는 제한 토큰을 가진 다른 사용자로 직접 프로세스를 생성할 수 없습니다. 따라서 실행 흐름을 분리하기 위해 codex-command-runner.exe를 도입했습니다:

  1. Initiation: codex.exeCreateProcessWithLogonW를 사용해 지정된 샌드박스 사용자로 codex-command-runner.exe를 실행합니다.
  2. Restriction: 런너 내부에서 프로세스는 자체 토큰을 열고 CreateRestrictedToken을 사용해 제한 토큰을 만든 뒤, CreateProcessAsUserW를 사용해 최종 자식 프로세스(예: Python 스크립트 또는 Git 명령)를 실행합니다.

샌드박스 구성 요소 스택 요약

최종 아키텍처는 보안과 개발자 생산성의 균형을 맞추기 위해 네 개의 구별된 계층으로 구성됩니다:

  • codex.exe: 주요 비관리자 하니스.
  • codex-windows-sandbox-setup.exe: 관리자 설정, 사용자 생성 및 방화벽 구성을 처리합니다.
  • codex-command-runner.exe: 제한 토큰을 발행하고 샌드박스 사용자로 최종 자식 프로세스를 생성합니다.
  • The Child Process: 제한된 권한 하에 에이전트가 실행하는 실제 명령.

Sources