짙은 네이비-블랙 바탕의 추상 일러스트: 왼쪽에는 높고 밀폐된 유리 챔버가 서 있고, 그 내부는 빛나는 옅은 파란색 결정질 물질로 가득 차 있다; 유리 바닥 근처의 흠집에서 하나의 밝은 시안색 필라멘트가 빠져나와 오른쪽으로 브러시드 스틸 파이프를 따라 길게 뻗다가, 파이프를 벗어나 탁 트인 어두운 공간에서 세 가닥의 짧은 호박색 실로 갈라진다. 희미한 호박색 호가 유리 안에 갇힌 채 남아 있다. 텍스트, 숫자, 사람 또는 조직 로고는 나타나지 않는다. OrcaRouter 로고는 오른쪽 아래 모서리에 합성되어 있다.
AI Safety Incidents

OpenAI Codex 샌드박스에서 빠져나오는 두 가지 방법: Heapjack과 Overpatch

작성자

Rowan Sterling

게시일

최신 모델 · 20모든 모델 보기 →
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

2026년 9월 15일, Accomplish AI의 수석 보안 연구원인 Oren Yomtov는 OpenAI의 Codex 코딩 에이전트를 둘러싼 샌드박스를 벗어나는 두 가지 별개의 방법에 관한 기술 보고서를 발표했다. 그의 글에 따르면 두 방법 모두 2026년 8월 12일 OpenAI에 보고되었고 둘 다 8일 이내에 수정되었다. Codex Desktop 빌드 26.818.21641의 Heapjack과 Codex CLI 0.149.0의 Overpatch이다. Heapjack이 둘 중 더 심각하다. 공격 대상자는 Codex에서 저장소를 열고 코드에 관해 질문하는 것 외에는 아무것도 할 필요가 없으며, 이는 제품이 제공하는 가장 엄격한 모드인 읽기 전용으로 실행되고 승인 프롬프트도, 화면에 표시되는 것도 없다. Cloud Security Alliance에 따르면 두 결함 모두 CVE가 부여되지 않았고 OpenAI의 별도 권고문도 발표되지 않았으며, 이로 인해 피해를 입은 사람은 보고되지 않았다. 이는 올해의 다른 에이전트 제어 관련 항목들과 함께 AI 인시던트 아카이브에 수록되어 있으며, 여기서 각 기록에는 출처 문서, 신뢰도 등급, 이의 제기 플래그가 포함된다.

Heapjack: 토큰이 신뢰할 수 없는 쪽이 읽을 수 있는 힙에 있었습니다.

Codex Desktop은 Yomtov가 공격한 해당 컴포넌트를 설치하기 전에 묻지 않습니다. 설치 시 ~/.codex/config.toml의 전역 구성 파일에 node_repl 블록을 기록하며, Yomtov는 이를 선택적으로 켤 수 있는 방법도, 끌 수 있는 설정도 없다고 보고합니다. 이 항목은 사용자별 선택이 아니라 공유 구성에 존재하기 때문에, 일반 Codex CLI 사용자는 아무런 질문 없이 동일한 도구를 그대로 물려받습니다.

node_repl 도구는 그 자체로 샌드박스 외부에서 실행되는 네이티브 프로그램입니다. 이 도구는 애플리케이션을 열고, Unix 소켓에 연결하며, 전역 구성 파일을 편집할 수 있습니다. 샌드박스 내부에서 시작되는 것은 단일 Node.js 프로세스이며, 그 프로세스는 두 개의 JavaScript 실행 컨텍스트를 보유합니다. 하나는 OpenAI 자체 코드가 포함된 신뢰할 수 있는 컨텍스트이고, 다른 하나는 에이전트가 수행하도록 요청받은 작업을 실행하는 신뢰할 수 없는 컨텍스트입니다.

신뢰 컨텍스트는 실행할 때마다 새로 생성되는 무작위 토큰을 제시함으로써 자신이 신뢰받는다는 것을 증명한다. 그것은 두 컨텍스트 사이의 경계가 되도록 의도된 것이다. 그러나 그것은 경계가 아니다. 두 컨텍스트 모두 단일 메모리 힙을 공유하는 단일 V8 아이솔레이트 안에 존재하므로, 그 토큰은 신뢰할 수 없는 코드가 읽을 수 있는 메모리에 놓인 문자열일 뿐이다. X에서 이 공개에 반응한 한 댓글 작성자는 BleepingComputer가 인용한 문장에서 이 점을 더 노골적으로 지적했다. "V8 컨텍스트는 전역을 격리할 뿐 메모리는 격리하지 않으므로, 샌드박스는 사실상 힙이 결코 동의한 적 없는 약속이었다." 그것은 하나의 규정일 뿐 증거는 아니다. 증거는 개념 증명이다.

Yomtov의 익스플로이트는 그 설명이 암시하는 바로 그 일을 합니다. 신뢰할 수 없는 JavaScript가 v8.getHeapSnapshot()을 호출하고, 결과 스냅샷에서 UUID 형태의 문자열을 스캔한 뒤 각 후보를 테스트합니다. 잘못된 추측에는 "권한 없음"이 돌아옵니다. 올바른 토큰에 유효하지 않은 인수를 결합하면 대신 진짜 유효성 검사 오류가 반환됩니다. 두 오류 메시지의 차이가 바로 올바른 값을 식별하는 오라클입니다.

토큰을 손에 넣은 샌드박스 프로세스는 파일 디스크립터 1에 자신의 JSON 요청을 기록합니다. 이는 신뢰된 컨텍스트가 네이티브 부모에 도달하기 위해 사용하는 것과 동일한 stdout 파이프입니다. 부모는 토큰을 검증하고, 유효한 토큰을 찾아내면 작업을 수행합니다. 개념 증명에서 그 작업은 시스템 open 명령이었으며, 이 명령은 요청을 launchd에 넘기고 Codex의 프로세스 트리 완전히 바깥에서 애플리케이션을 실행합니다. 동일한 토큰은 임의의 Unix 소켓, 그중에서도 Docker 데몬 소켓에 대한 연결을 허용하며, 전역 구성 파일을 편집하는 도구에도 접근할 수 있게 합니다.

이 모든 것은 읽기 전용 모드에서 실행되는데, 이는 신중한 사용자가 바로 눈앞의 저장소를 신뢰하지 않기 때문에 선택하는 모드입니다. 어느 단계에서도 승인 프롬프트는 나타나지 않았습니다. 실제 시나리오는 짧습니다. 복제한 저장소를 Codex에서 읽기 전용 모드로 열고 코드에 관해 질문하는 것입니다. 그 저장소를 작성한 사람은 해당 머신에서 샌드박스 없는 명령 실행 권한을 얻게 되며, 화면에는 그 사실을 알리는 내용이 전혀 없습니다.

Comparison card titled 'Two escapes, one shape', subtitled 'Both broke the boundary from the inside, and neither showed the user anything.' Two columns headed Heapjack and Overpatch carry six rows: Surface, reading 'Codex Desktop, node_repl tool' and 'Codex CLI, apply_patch tool'; Root cause, reading 'Trusted and untrusted V8 contexts share one memory heap' and 'Write permission derived from the parent folder of each path in a patch'; Defeats, reading 'Read-only mode, the strictest setting' and 'Workspace-write confinement'; Approval prompt, reading 'None shown' in both columns; Outcome, reading 'Unsandboxed native execution via launchd, plus Docker socket access' and 'Persistent execution from a modified .zshrc on the next terminal'; and Fixed in, reading 'Desktop build 26.818.21641' and 'CLI 0.149.0'. An amber footer strip reads 'Both enforcement mechanisms lived inside the component they were meant to enforce.'

Overpatch: 자신이 건드린 모든 것에 부모를 부여하는 패치 도구

두 번째 결함은 오픈소스 명령줄 에이전트인 Codex CLI에 있으며, 메모리 버그가 아니라 권한 버그입니다. workspace-write 모드에서 에이전트는 프로젝트 폴더 안에만 쓸 수 있고 다른 곳에는 쓸 수 없으며, 홈 디렉터리를 대상으로 한 셸 명령은 거부됩니다. apply_patch 도구는 그 경계를 지켜야 했습니다. 대신 적용 중인 패치에 명시된 경로에서 권한을 도출했고, 각 경로의 상위 디렉터리에 쓰기 권한을 부여했습니다.

패치에서 /tmp 아래의 경로를 지정하면, /tmp의 상위가 /이기 때문에 권한 부여가 디스크의 루트까지 넓어집니다. 그게 트릭의 전부입니다.

동작하는 익스플로잇은 단일 패치에 두 개의 항목을 사용한다. 첫 번째는 /tmp를 지정하고 유용한 일은 하지 않는다. 파일은 디렉터리를 덮어쓸 수 없으므로 실패하며, 오직 권한 부여 범위를 넓히기 위해서만 존재한다. 두 번째는 홈 디렉터리로 향하는 심볼릭 링크를 통해 .zshrc에 한 줄을 추가한다. 첫 번째 항목을 제거하면 쓰기가 거부된다. 이를 유지하면 개발자가 다음에 여는 터미널이 공격자의 줄을 샌드박스 없이 실행하며, 샌드박스는 더 이상 개입하지 않는다.

그것은 Overpatch를 일회성 공격이 아니라 지속성 버그로 만든다. 오염된 시작 파일은 개발자가 여는 모든 셸에서 다시 실행되며, 누군가 .zshrc를 읽고 덧붙여진 줄을 발견할 때까지 계속된다 — 이것이 Cloud Security Alliance의 지침이 증상을 기다리는 대신 그러한 것을 찾아 나서라고 하는 이유이다.

두 버그 모두 집행을 집행 대상 내부에 넣었습니다

Yomtov 자신의 프레이밍은 Codex를 넘어 더 널리 적용되는 부분이다. apply_patch는 공격자가 제공한 입력을 바탕으로 자체 권한을 계산했다. node_repl은 신뢰할 수 있는 코드와 신뢰할 수 없는 코드를 구분하는 비밀을, 신뢰할 수 없는 코드가 읽을 수 있는 메모리에 보관했다. 각 경우에 샌드박스는 내부에서 무언가를 통과시키라는 지시를 받았다.

이러한 공격 형태는 새로운 것이 아니다. 2026년 9월 20일 이 공개 내용을 보도한 BleepingComputer는 2026년 7월에 Pillar Security 연구원들이 Cursor, Codex, Gemini CLI, Google의 Antigravity 전반에서 동일한 아이디어를 시연했다고 지적한다. 즉, 샌드박스 안에 머무는 에이전트가 파일을 작성하면 샌드박스 밖의 신뢰된 도구가 나중에 그 파일을 실행하는 방식이다. Codex 관련 두 사례를 특별하게 만드는 것은 Heapjack의 읽기 전용 우회와, 이를 포함하는 구성 요소를 비활성화할 수 있는 설정이 전혀 없다는 점이다.

수정 사항, 그리고 OpenAI가 말한 것과 말하지 않은 것

Accomplish에 따르면, OpenAI는 Codex Desktop 빌드 26.818.21641에서 Heapjack을, Codex CLI 0.149.0에서 Overpatch를 수정했다. 두 수정은 모두 8월 12일 보고서가 나온 지 8일 이내에 — 그 일정을 순전히 그대로 읽으면 8월 20일까지 — 반영되었으며, Yomtov는 이러한 반전의 공을 OpenAI에 돌렸다.

OpenAI는 두 취약점 중 어느 것에 대해서도 별도의 보안 권고문을 발표하지 않았고, CVE 식별자도 부여되지 않았다. Cloud Security Alliance는 2026년 9월 22일자 연구 노트에 이 두 가지 부재를 기록했다. 논평을 요청받은 OpenAI 대변인은 BleepingComputer에 다음과 같이 말했다. "연구자들이 저희에게 연락해 연구 결과를 공유해 준 데 감사드립니다. 저희는 두 문제 모두 8월에 해결했지만, 샌드박스를 계속 강화하고 있으며, 최근 업데이트에서는 에이전트가 파일을 쓸 수 있는 위치에 대한 통제를 강화하고 여러 플랫폼에서 그러한 보호 조치에 대한 테스트를 확대했습니다."

그 성명은 수정 사항을 확인할 뿐 메커니즘에 대해서는 아무 말도 하지 않는다. 8월의 변경 사항이 설계 패턴을 제거한 것인지, 아니면 그 패턴에서 벗어나는 두 가지 특정 경로를 차단한 것인지는 말하지 않는다. OpenAI 외부의 누구도 그렇게 말하지 않았다.

Timeline card titled 'Report to public write-up: 34 days', subtitled 'The fix came in eight. The explanation did not come for another month.' Four dates sit on a horizontal rail: 12 AUG, 'Reported to OpenAI', noting both flaws came in one report from Oren Yomtov at Accomplish; 20 AUG, 'Fixed within eight days', noted as arithmetic from the stated eight-day figure, with OpenAI confirming it acted in August; 15 SEP, 'Write-up published', noted as the date the archive files this record under; and 22 SEP, 'Third-party reaction', noting the Uganda CERT advisory rated Red and the Cloud Security Alliance research note. A footer strip reads 'No CVE was assigned at any point on this timeline, and no standalone OpenAI advisory was published.'

무엇이 확립되어 있고, 무엇이 한 연구자에게 달려 있는가

아카이브는 이 항목을 연구 결과로 분류한다. 심각도 높음, 지역 전 세계, 신뢰도 B — 문서화되었으나 단일 또는 2차 출처 — 이견 없음, 실제 피해 기록 없음. 그 등급은 이 글의 나머지 부분을 읽는 올바른 렌즈다. 여러 당사자가 확인하는 것과 발견자만이 주장하는 것 사이의 간극이 이야기 전체를 관통하기 때문이다.

확립된 것, 즉 둘 이상의 당사자가 그렇게 말한다는 의미에서:

• 해당 공개는 존재하며 날짜가 명시되어 있다. Yomtov의 보고서는 2026년 9월 15일에 게시되었으며, 두 가지 결함 모두 2026년 8월 12일에 OpenAI에 보고되었고, 그의 설명에 따르면 8일 이내에 수정되었다.

• OpenAI는 8월에 조치를 취했다고 확인했습니다. 대변인은 BleepingComputer에 두 문제 모두 처리되었다고 말했으며, 이는 회사가 자체적으로 어떤 권고문도 기술적 설명도 발표하지 않았음에도 발견자와 독립적으로 신고 및 수정 타임라인을 뒷받침합니다.

• 수정된 버전은 일관되게 명시되어 있습니다. Codex Desktop의 빌드 26.818.21641과 Codex CLI의 버전 0.149.0은 Accomplish가 제시했고, BleepingComputer가 이를 다시 보도했으며, 2026년 9월 22일 우간다 국가 컴퓨터 비상 대응팀 및 조정 센터의 권고문에도 실려 있는데, 해당 기관은 이 두 버전을 "Red"로 평가했습니다.

• CVE도 없고, 벤더 권고문도 없으며, 보고된 악용 사례도 없습니다. 2026년 9월 22일자 Cloud Security Alliance 노트는 CVE와 독립적인 OpenAI 권고문이 모두 존재하지 않음을 기록하고 있으며, 어떤 조직도 Overpatch의 지속성 메커니즘이 설치되어 있는 것을 발견했다는 확인된 사례가 없다고 보고합니다.

• 아카이브는 이에 대해 어떤 이의도 제기하지 않는다. 해당 기록은 disputed false로 표시되어 있으며, 신뢰도 등급은 사실관계에 대한 어떤 이견보다는 출처 패턴을 반영한다.

확립되지 않았거나, 발견자에 의해서만 확립된:

• 메커니즘 세부 사항은 Yomtov의 것이다. 힙 스냅샷 오라클, 공유 파일 디스크립터, 상위 디렉터리 권한 부여 — 이 모든 것은 그의 글과 개념 증명에서 나온다. 현재 유통되는 가장 상세한 제3자 요약인 Cloud Security Alliance의 노트는 그의 설명과 BleepingComputer의 보도를 종합한 것이라고 설명하며, 어느 익스플로잇을 재현했거나 어느 수정 사항을 테스트했다고 밝히지 않는다. CERT.UG의 권고문은 같은 자료를 편집한 것이다.

• 취약한 버전 범위는 공개된 적이 없습니다. 수정 버전만 명시되어 있어, 각 결함이 어떤 이전 빌드에 포함되었는지에 대한 목록은 없습니다.

• 패치된 설치가 이 두 사례가 아니라 해당 부류의 버그로부터 안전한지는 명시되지 않았다. OpenAI의 "샌드박스를 지속적으로 강화"는 일반적인 약속일 뿐, 특정 메커니즘에 대한 주장은 아니다.

• 두 취약점 중 어느 것도 악용되었다는 보고는 없었습니다. 이는 보고가 없었다는 뜻이지, 부재를 확인한 결과가 아닙니다. 그리고 개념 증명은 Heapjack 경로가 사용자가 알아차릴 만한 어떤 것도 화면에 남기지 않는다는 것을 보여줍니다.

사용자가 조치할 수 있는 항목

26.818.21641보다 오래된 Codex Desktop 빌드나 0.149.0보다 오래된 Codex CLI 버전을 사용하는 사람은 Accomplish가 그리는 경계의 취약한 쪽에 속하며, 이번 공개가 제시하는 유일한 해결책은 업데이트입니다. 그 외에도 Cloud Security Alliance는 신뢰할 수 없는 저장소를 다룬 과거 Codex Desktop 세션을 감사하여 launchd 또는 open 활동과 Docker 소켓 연결 여부를 확인하고, 셸 시작 파일 — .zshrc, .bashrc 및 이에 상응하는 파일 — 을 읽어 사용자가 작성한 것이 아니라 나중에 덧붙여진 명령이 있는지 확인할 것을 권장합니다.

같은 노트는 저장소를 신뢰할 수 없을 때 읽기 전용 모드를 보호 수단으로 취급하지 말라고 조언하며, 이는 Heapjack이 스스로 내리는 결론이기도 하다. 그 구조적 권고는 더 나아간다: 공유 비밀과 관례 대신 물리적 프로세스 및 메모리 격리, 에이전트의 손이 닿지 않는 곳에 보관되는 자격 증명, 그리고 프로젝트 외부 경로를 참조하는 패치를 보자마자 의심스러운 것으로 취급하는 것이다. 이는 제3자의 제안이다. OpenAI가 두 차례의 버전 업 외에 이 중 어떤 것을 채택했는지는 공개되지 않았다.

Abstract illustration on a deep navy-black field: a thick curved wall of frosted glass arcs across the frame; embedded in its far face, where nothing on the inside can reach it, sits a small precision mechanism of brushed brass and steel — a knurled dial, a sprung lever and a fine threaded rod — glowing faintly amber through the frosting. On the near side a small blue sphere rests at the foot of the wall and a thin blue line rises from it, stopping flat against the inner surface. A cold horizon of pale light runs beyond the wall. No text, numbers, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

마지막으로 구분해 둘 만한 두 가지가 있다. 하나는 널리 사용되는 코딩 에이전트의 버그 두 건으로, 2026년 8월 12일에 보고되어 8일 만에 수정되었고 두 개의 빌드 번호로 마무리되었다. 다른 하나는 욤토프가 지목한 설계 질문, 즉 샌드박스가 자신이 담아야 할 코드에 의해 강제될 수 있는가라는 질문이며, 그 질문은 버전 번호로 답할 수 있는 종류의 것이 아니다. Accomplish도 OpenAI도 8월의 변경 사항이 그 질문을 해결한다고 말하지 않았다.