OpenAI Codex: 민감한 파일 제외에 관한 논쟁
OpenAI Codex: 민감한 파일 제외에 관한 논쟁
OS 레벨 샌드박싱이 유일하게 신뢰할 수 있는 보안 조치임
AI 에이전트의 하네스 내에서 차단 목록(blocklist)이나 .agentignore 파일을 구현하는 것은 보안 측면에서 불충분합니다. LLM은 도구 사용을 통해 상위 수준의 제한을 우회할 수 있기 때문입니다. 진정한 격리는 컨테이너, 가상 머신 또는 엄격한 Unix 권한을 사용하여 보안 경계를 애플리케이션 계층에서 운영 체제 계층으로 이동하는 것을 필요로 합니다.
커뮤니티 구성원들이 언급했듯이, 에이전트가 셸(shell)에 접근할 수 있다면 rg (ripgrep)와 같은 명령어를 사용하여 파일 시스템 전체에서 민감한 문자열을 찾을 수 있습니다. 특정 read_file 도구가 제한되더라도, 민감한 데이터를 포함하는 셸 명령어의 출력 결과는 여전히 모델로 업로드됩니다.
"모델이 'rg foo'를 실행하고, 그 파일 중 하나에 'foo'라는 문자열이 포함되어 있다면 어떻게 될까요? 모델은 파일 내용이 포함된 도구 출력 결과를 업로드합니다. 따라서 유일한 해결책은 codex 프로세스가 해당 파일들에 접근할 수 없도록 만드는 것입니다."
권장되는 격리 전략
비밀 정보를 유출하는 것을 방지하기 위해 개발자들은 다음과 같은 몇 가지 아키텍처 패턴을 제안합니다:
- Containerization: 민감한 파일이 마운트되지 않은 컨테이너에서 에이전트를 실행하거나, Apptainer와 같은 도구를 사용하여 작업에 필요한 특정 저장소만 마운트합니다.
- Clean Virtual Machines: 각 에이전트 대화마다 전용 클라우드 VM을 생성합니다. 이를 통해 에이전트가 로컬 머신이나 신뢰할 수 있는 컨텍스트에 접근할 수 없도록 보장하며, 명시적으로 허용되지 않는 한 원격 오리진과 통신할 수 없게 합니다.
- Opt-in Access: "opt-out" (차단 목록) 모델에서 "opt-in" (허용 목록) 모델로 전환하여, 세션이 시작되기 전에 사용자가 구성한 기본 폴더만 샌드박스로 복사합니다.
- Unix Permissions:
chmod를 사용하여 Codex 프로세스를 실행하는 사용자 계정이 민감한 디렉터리에 대한 읽기 권한이 부족하도록 보장합니다.
.agentignore 및 차단 목록의 한계
.gitignore와 유사한 표준 .agentignore 파일에 대한 요청이 있지만, 기술 전문가들은 그러한 기능이 "가짜 보안 의식"을 제공한다고 주장합니다.
차단 목록이 실패하는 이유
- 예측 불가능성: LLM은 상위 수준의 제한을 우회하여 작업할 수 있습니다. 프로세스 내에서 강제되는 제한은 악의적이거나 환각을 일으키는 에이전트에 의해 무력화될 수 있습니다.
- 도구 중복성: 에이전트가 개발 중인 코드가 실행을 위해
.env파일에 접근해야 한다면, 에이전트는 메모리 내에서 또는 디버깅 중인 애플리케이션의 출력을 통해 해당 값을 관찰할 수 있습니다. - 불완전성: 사용자가 정의한 차단 목록이 민감한 데이터로 가는 모든 가능한 경로를 포괄할 만큼 충분히 포괄적일 가능성은 통계적으로 낮습니다.
이러한 보안 결함에도 불구하고, 일부에서는 .agentignore 파일이 보안을 위해 의존하지 않는다는 전제하에, 에이전트가 무관한 파일에 토큰을 낭비하지 않도록 하는 "힌트"로서 여전히 가치가 있다고 주장합니다.
비밀 정보 관리의 대안적 접근 방식
에이전트를 샌드박싱하는 것 외에도, 논의의 핵심은 비밀 정보가 파일 시스템에 저장되는 방식에 자체적인 원인이 있는 경우가 많다는 점을 강조합니다.
- Eliminate
.envFiles: 저장소 내의 평문 파일에 API 키를 저장하는 방식에서 벗어납니다. 대신, 비밀 정보는 런타임에 주입되거나ssh-agent와 같은 프록시를 통해 처리되어 베어러 토큰 노출을 것을 방지해야 합니다. - Runtime Injection: 실행 중에 비밀 정보를 환경 변수에 직접 주입하여 에이전트가 발견할 수 있는 파일 형태로 존재하지 않도록 합니다.
커뮤니티 주도형 도구 및 패치
여러 개발자들이 이러한 격차를 해결하기 위해 오픈 소스 프로젝트와 로컬 패치를 공유했습니다:
- Rumpelpod: 원격/보안 devcontainers에서의 에이전트를 위한 오케스트레이터.
- YoloAI: FOSS AI 샌드박스.
- Drop: AI 에이전트로부터 민감한 파일을 숨기기 위해 설계된 Linux 샌드박스.
- Custom Patches: 일부 사용들은 규칙 강제를 통합하기 위해 로컬 패치를 구현했습니다. 이는 별도의 도구 기반 및 셸 기반 제한을 개별적으로 사용하는 대신, 모든 파일 시스템 접근을 제어하는 단일 샌드박스 프로필(예:
bwrap사용자 네임스페이스 사용)로 대체합니다.