77 읽음
오픈AI 코덱스 샌드박스 우회 취약점 발견, 긴급 패치 완료
위키트리
보안 연구진이 오픈AI의 코딩 에이전트 코덱스(Codex)에서 샌드박스(격리 실행 환경)를 빠져나가는 두 가지 취약점을 찾아냈다. 이 중 하나는 코덱스를 가장 엄격한 읽기 전용 모드로 써도 승인 창 하나 뜨지 않은 채 개발자 컴퓨터에서 명령을 실행할 수 있는 수준이었다. 어콤플리시AI(Accomplish AI)의 오렌 욤토브는 두 취약점을 2026년 8월 12일(현지시각) 오픈AI에 신고했고, 오픈AI는 8일 만에 문제를 수정했다.
첫 번째 취약점 “히프잭(Heapjack)”은 다른 사람이 만든 저장소를 코덱스에서 열고 코드에 대해 질문을 던지는 평범한 행동을 원격 코드 실행으로 바꿔놓는다. 저장소를 작성한 공격자가 그 저장소를 열어본 사용자의 컴퓨터에서 샌드박스를 벗어난 명령을 실행하게 되는 구조다.
이 취약점은 코덱스 데스크톱 앱이 설치 시점에 전역 설정 파일인 ‘~/.codex/config.toml’에 기록하는 ‘node_repl’이라는 구성 요소를 노린다. 이 기능은 켜고 끄는 별도 설정이 없어 사용자가 선택할 수도 없다. 설정이 공유 파일에 들어가 있는 탓에 일반 코덱스 CLI(명령줄 도구) 사용자도 모르는 사이에 같은 기능을 물려받는다.
node_repl은 하나의 Node.js 프로세스 안에 서로 다른 두 개의 자바스크립트 실행 컨텍스트를 둔다. 하나는 오픈AI 자체 코드가 도는 신뢰된 영역이고, 다른 하나는 에이전트가 만든 코드가 도는 신뢰되지 않은 영역이다. 신뢰된 영역은 실행마다 새로 생성되는 무작위 토큰을 제시해 자신이 신뢰된 쪽임을 증명한다.
문제는 두 컨텍스트가 하나의 Node 프로세스, 하나의 메모리 힙을 공유한다는 점이다. 토큰은 결국 신뢰되지 않은 영역도 읽을 수 있는 메모리 속 문자열일 뿐이었다. 공격 코드는 ‘v8.getHeapSnapshot()’으로 힙 스냅샷을 뜬 뒤 UUID 형태의 문자열을 하나씩 대입해봤다. 틀린 값은 “권한 없음(not authorized)”을 돌려주지만, 맞는 토큰에 잘못된 인자를 넣으면 실제 검증 오류가 돌아와 토큰이 맞았다는 사실을 알려준다.
토큰을 손에 넣은 공격 코드는 신뢰된 영역이 샌드박스 밖 네이티브 부모 프로세스와 통신하는 데 쓰는 같은 파이프에 자신의 요청을 써넣는다. 부모 프로세스는 토큰을 확인하고 유효하다고 판단해 요청을 그대로 실행한다. 실증 코드(PoC)는 시스템의 ‘open’ 명령으로 코덱스 프로세스 트리 밖에서 아예 다른 애플리케이션을 실행하는 데 성공했다. 같은 경로로 도커(Docker) 데몬 소켓을 포함한 모든 유닉스 소켓에 접근하거나 전역 설정 파일을 편집하는 것도 가능했다. 이 모든 일이 에이전트가 아무것도 쓰지 못하도록 설계된 가장 엄격한 읽기 전용 모드에서 벌어졌다.

두 번째 취약점 “오버패치”는 오픈소스로 공개된 코덱스 CLI 안에 있다. 워크스페이스 쓰기 모드에서 에이전트는 원래 프로젝트 폴더 안에서만 파일을 쓸 수 있고, 홈 디렉터리를 겨냥한 셸 명령은 거부된다. 연구진은 코덱스 자체의 패치 적용 도구인 ‘apply_patch’를 이용해 이 제한을 우회했다.
apply_patch는 패치에 이름이 적힌 각 경로의 상위 폴더에 쓰기 권한을 부여하는 방식으로 동작한다. 패치에 ‘/tmp’라는 경로를 넣으면 도구는 디스크 루트에 쓰기 권한을 내주게 된다. 연구진의 실증 코드는 두 가지 변경을 담은 패치 하나로 구성됐다. 하나는 ‘/tmp’를 지목해 별다른 실질적 변경 없이 권한만 넓히는 역할을 했고, 다른 하나는 심볼릭 링크를 통해 홈 디렉터리의 ‘.zshrc’ 파일에 한 줄을 추가했다.
첫 번째 변경을 빼면 두 번째 쓰기는 거부된다. 두 변경이 함께 있으면 개발자가 다음에 터미널을 열 때 공격자가 심어둔 명령줄이 샌드박스를 벗어나 그대로 실행된다. ‘/tmp’를 겨냥한 시도 자체는 디렉터리를 덮어쓰려 한 탓에 실패로 끝났지만, 그 과정에서 도구의 파일 쓰기 권한 범위가 의도치 않게 넓어져버린 게 문제였다.
두 취약점은 형태가 같다. 감시·통제 장치가 정작 자신이 통제해야 할 대상 안에 놓여 있었다는 점이다. apply_patch는 공격자가 준 입력값을 근거로 스스로 권한 범위를 계산했고, node_repl은 신뢰 영역과 비신뢰 영역을 가르는 비밀 토큰을 비신뢰 영역과 같은 메모리에 두고 있었다. 두 경우 모두 샌드박스 내부에서 통과 신호가 나온 구조였다.
이런 유형의 결함이 처음 보고된 것은 아니다. 2026년 7월 필러 시큐리티 연구진은 커서와 코덱스, 제미나이 CLI, 구글 안티그래비티에서 같은 개념의 문제를 시연한 바 있다. 에이전트는 샌드박스 안에 머물러 있지만 그 안에서 만든 파일을 샌드박스 밖의 신뢰된 도구가 나중에 그대로 실행해버리는 구조였다.
욤토브의 게시글에 반응한 X(옛 트위터) 이용자들의 논평도 문제의 핵심을 짚었다. 한 이용자는 “V8 컨텍스트는 전역 변수는 격리해도 메모리는 격리하지 않으니, 샌드박스는 힙이 동의한 적 없는 약속이었을 뿐”이라고 썼다. 다른 이용자는 신뢰 경계를 “방을 나누는 파티션”에 불과하다고 표현했다. node_repl이 기본으로 켜져 있다는 점을 두고는 권한을 가진 토큰이 왜 애초에 비신뢰 자바스크립트에서 접근 가능했느냐는 지적도 나왔다.
오픈AI는 히프잭을 코덱스 데스크톱 빌드 26.818.21641에서, 오버패치를 코덱스 CLI 0.149.0에서 각각 수정했다. 두 버전 모두 신고 후 8일 안에 나왔다는 게 욤토브의 설명이다. 오픈AI 대변인은 블리핑컴퓨터에 “연구진이 연락해 발견 내용을 공유해준 데 감사드린다. 두 문제는 8월 중 해결했지만, 에이전트가 파일을 쓸 수 있는 위치에 대한 통제를 강화하고 여러 플랫폼에서 이런 보호 기능에 대한 테스트를 확대하는 등 샌드박스를 계속 강화하고 있다”고 밝혔다.
전문가들은 코덱스 데스크톱과 CLI를 해당 버전 이상으로 업데이트할 것을 권고했다. 복제해온 저장소나 제3자·비신뢰 저장소를 자주 다루는 개발자라면 업데이트가 더 중요하다. 읽기 전용 모드조차 절대적 안전장치가 아니라는 사실이 드러난 만큼, 샌드박스를 위험을 낮추는 수단으로 보되 낯선 저장소의 코드가 안전하다는 보증으로 여기지 말아야 한다는 지적이 나온다.