Dwie luki w piaskownicy OpenAI Codex. Obie dały się obejść od wewnątrz
Oren Yomtov z Accomplish AI znalazł dwa sposoby na wydostanie się z piaskownicy OpenAI Codex. Jedna z luk, nazwana Heapjack, pozwalała wykonywać polecenia na maszynie dewelopera z poziomu trybu read-only, najsurowszego trybu piaskownicy, w którym agent nie powinien nic zapisywać — bez pytania o zgodę i bez niczego widocznego na ekranie. Obie luki Yomtov zgłosił 12 sierpnia; OpenAI załatało je w ciągu ośmiu dni.
Codex to agent kodujący dostępny jako narzędzie linii poleceń i aplikacja desktopowa, który uruchamia działania modelu w izolacji, żeby niezaufany kod nie dotarł do reszty systemu. Łączy je wzorzec: mechanizm egzekwowania uprawnień znajdował się wewnątrz komponentu, który miał egzekwować. Nie łączy ich implementacja — Heapjack to wyciek tokenu w stercie Node, Overpatch to rozszerzenie uprawnień w narzędziu do poprawek — tylko ten sam błąd w konstrukcji granicy zaufania.
Heapjack: token zaufania w tej samej stercie
Luka dotyczy komponentu node_repl, który Codex Desktop dopisuje do globalnego pliku ~/.codex/config.toml już przy instalacji. Nie ma opcji rezygnacji ani wyłączenia, a ponieważ wpis trafia do wspólnej konfiguracji, użytkownicy Codex CLI dziedziczą to samo narzędzie, nie będąc o tym pytani.
node_repl uruchamia jeden proces Node.js z dwoma kontekstami JavaScript: zaufanym, w którym działa kod OpenAI, i niezaufanym, w którym działa kod agenta. Kontekst zaufany potwierdza swoją tożsamość losowym tokenem generowanym na nowo przy każdym starcie — ale oba konteksty współdzielą jedną stertę pamięci, więc token jest zwykłym ciągiem znaków, do którego sięga niezaufana strona.
Niezaufany kod robi zrzut sterty przez v8.getHeapSnapshot() i sprawdza kolejno każdy ciąg wyglądający jak UUID. Zła odpowiedź kończy się komunikatem „not authorized”, poprawny token z błędnym argumentem zwraca prawdziwy błąd walidacji — i właśnie to zdradza atakującemu, że trafił. Mając token, niezaufany kod wysyła własne żądanie tym samym potokiem, przez który kontekst zaufany rozmawia z natywnym, niepiaskowanym procesem nadrzędnym. Rodzic weryfikuje token, uznaje go za poprawny i wykonuje polecenie.
W dowodzie koncepcji wystarczyło systemowe polecenie open, żeby uruchomić aplikację poza drzewem procesów Codexa. Ten sam dostęp obejmuje dowolne gniazdo uniksowe — z gniazdem demona Dockera na czele — oraz narzędzie edytujące globalny plik konfiguracyjny. Wszystko to w trybie read-only, w którym agent nie powinien zapisać ani jednego pliku.
Overpatch: apply_patch sam ustalał swoje uprawnienia
Druga luka, Overpatch, siedzi w otwartoźródłowym Codex CLI. W trybie workspace-write agent może pisać wyłącznie w folderze projektu, a polecenie powłoki wymierzone w katalog domowy zostaje odrzucone. Yomtov sprawił, że narzędzie do poprawek apply_patch mimo to tam zapisało.
apply_patch przyznaje prawo zapisu do folderu nadrzędnego każdej ścieżki wymienionej w patchu, więc wpisanie „/tmp” daje prawo zapisu do katalogu głównego. Działający exploit składa się z dwóch zmian: pierwsza wymienia „/tmp” i nic poza poszerzeniem uprawnień nie robi, druga dopisuje linię do pliku .zshrc przez dowiązanie symboliczne do katalogu domowego. Bez pierwszej zmiany zapis jest odrzucany; z nią następny terminal, który otworzy deweloper, wykonuje linię atakującego poza piaskownicą.
Ta klasa błędu nie jest nowa. W lipcu 2026 roku badacze z Pillar Security pokazali ten sam wzorzec — agent zapisuje w piaskownicy plik, który później uruchamia zaufane narzędzie poza nią — w Cursorze, Gemini CLI i Google Antigravity.
Heapjack został załatany w buildzie Codex Desktop 26.818.21641, Overpatch w Codex CLI 0.149.0. Użytkownicy powinni mieć te wersje lub nowsze.
