Audyt bezpieczeństwa z Codex
ENAudyt bezpieczeństwa z Codex zaczyna się od skanerów deterministycznych, potem równoległych audytów codex exec tylko do odczytu, po jednym na domenę, scalonych w jedną listę. Każde przyjęte znalezisko dostaje test exploita, który nie przechodzi przed poprawką, a poprawkę robi osobna sesja w worktree Git. Reguły w AGENTS.md i codzienny przegląd blokują powrót tych klas błędów.
Badacz bezpieczeństwa zgłosił podatność w trybie odpowiedzialnego ujawnienia: twoje API zwraca na produkcji stack trace w odpowiedziach z błędem, a endpoint resetu hasła zdradza atakującemu, które adresy e-mail mają konto. Za 48 godzin raport stanie się publiczny. Musisz naprawić te dwie rzeczy, znaleźć w kodzie wszystkie podobne miejsca i dopilnować, żeby następny pull request nie wprowadził ich z powrotem. Ta strona jest dla dewelopera, który prowadzi ten audyt z Codex, i dla tech leada, który potem odpowiada za bramki.
Co wyniesiesz z audytu bezpieczeństwa z Codex
Dział zatytułowany „Co wyniesiesz z audytu bezpieczeństwa z Codex”- Siedmiokrokową kolejność audytu: od odcięcia aktywnych sekretów po zaplanowanie kolejnego przeglądu.
- Pętlę w powłoce, która uruchamia równolegle trzy audyty domenowe z profilem uprawnień
:read-only, więc żaden audyt nie może zmienić kodu, który ocenia. - Sześć promptów do skopiowania: celowane badanie zgłoszenia, trzy audyty domenowe, scalenie wyników bez duplikatów i poprawka zaczynająca się od testu exploita.
- Regułę przyjmowania poprawek bez czytania każdej linii diffu: nie ma nieprzechodzącego testu exploita, nie ma poprawki.
- Blok bezpieczeństwa do sekcji
## Code Review RuleswAGENTS.mdz liniami „Do not flag”, które ograniczają szum.
Ta strona opisuje audyt, który prowadzisz ręcznie z Codex CLI. Agent Codex Security od OpenAI, @codex security review i droga znaleziska aż do merge’a są opisane w Codex Security i centrum dowodzenia agentami, a bramka w CI zbudowana na openai/codex-action w Codex w CI/CD.
Które narzędzie Codex do której części audytu?
Dział zatytułowany „Które narzędzie Codex do której części audytu?”Każda część audytu potrzebuje innego poziomu dostępu. Stan na Codex CLI 0.157.1, sprawdzone 2026-09-26, z wyjątkiem dwóch powierzchni GitHub, które ostatnio zweryfikowano w dokumentacji OpenAI 2026-08-28.
| Część audytu | Narzędzie | Potrzebny dostęp | Co dostajesz |
|---|---|---|---|
| Sekrety, pakiety ze znanymi podatnościami, wzorce oparte na regułach | Gitleaks, TruffleHog, npm audit, Semgrep (nie Codex) | Twoja powłoka i sieć | Deterministyczne raporty, na których Codex może oprzeć analizę |
| Zbadanie zgłoszonego problemu albo jednej domeny bezpieczeństwa | codex exec z -c 'default_permissions=":read-only"' | Odczyt repozytorium, bez zapisu i bez sieci | Raport znalezisk dla każdej domeny |
| Potwierdzenie znaleziska i poprawka | codex --worktree z profilem :workspace | Zapis w odizolowanym checkoucie | Nieprzechodzący test exploita, potem poprawka na gałęzi |
| Sprawdzenie gałęzi, zanim stanie się pull requestem | codex exec review albo /review | Odczyt diffu | Znaleziska review sterowane przez AGENTS.md |
| Sprawdzenie pull requesta | @codex security review na GitHubie | Połączenie Codex z GitHubem | Komentarze review skupione na bezpieczeństwie |
| Powtarzanie przeglądu | Automatyzacja w aplikacji desktopowej Codex albo codex exec z crona | Taki sam jak w audycie domenowym | Codzienny raport wyłącznie nowych znalezisk |
Domyślnym modelem w Codex jest GPT-6.1 Sol, który działa na wysiłku low, dopóki go nie zmienisz (zobacz przegląd modeli). Audyt śledzi dane wejściowe przez wiele plików, więc przy przebiegach audytowych podnieś wysiłek przez -c model_reasoning_effort="high", zanim zaczniesz rozważać inny model.
Jak przeprowadzić audyt bezpieczeństwa z Codex krok po kroku
Dział zatytułowany „Jak przeprowadzić audyt bezpieczeństwa z Codex krok po kroku”Kolejność ma znaczenie. Najpierw odcięcie sekretów, bo wyciekły klucz jest nadużywany, gdy ty jeszcze czytasz raport. Skanery idą przed Codex, bo ich wynik to twarde dane, na których agent może rozumować, a profil tylko do odczytu i tak nie daje Codex sieci, żeby uruchomił je sam.
-
Odetnij aktywne sekrety i daj Codex czystą kopię. Prowadź audyt na świeżym klonie repozytorium. Świeży klon nie ma pliku
.envz.gitignore, więc sesje audytowe nie czytają danych dostępowych z twojego lokalnego.env; sekrety zacommitowane do repozytorium znajduje krok 2. Jeśli audytujesz kod, któremu nie ufasz, na przykład repozytorium dostawcy, wybierz Open restricted w oknie Codex „Trust this folder?”: konfiguracja, hooki i polityki exec z niezaufanego folderu pozostają wyłączone, a od Codex 0.150.0 niezaufany projekt nie dostarcza też swojegoAGENTS.md.Okno terminala git clone --no-local . ../app-audit && cd ../app-audit -
Uruchom skanery deterministyczne i zachowaj ich wyniki. Najpierw zainstaluj skanery, na przykład
brew install gitleaks trufflehog semgrep jq(albopip install semgrep). Potrzebujesz Gitleaks 8.19.0 lub nowszego: w tym wydaniu pojawiła się podkomendagit, a starsze wersje znają tylkodetect(sprawdzone w wydaniach Gitleaks 2026-09-26). Potem w terminalu, w katalogu głównym klonu audytowego:Okno terminala mkdir -p auditgitleaks git --redact --report-path audit/gitleaks.json # secrets in full git history, values maskedtrufflehog git file://. --results=verified,unknown --json \| jq -c 'del(.Raw, .RawV2)' > audit/trufflehog.json # live check against the issuing service; raw values strippednpm audit --omit=dev --json > audit/npm-audit.json # advisories in production dependenciessemgrep scan --config auto --json -o audit/semgrep.json # rule-based patterns; auto sends your project URL to the Semgrep RegistryOba raporty domyślnie zawierają surowy sekret.
--redactmaskuje go w raporcie Gitleaks, a filtrjqusuwa polaRawiRawV2z każdego wyniku TruffleHog, bo Codex czyta te pliki w kroku 4, a wszystko, co przeczyta, trafia do dostawcy modelu. Commit, plik i nazwa detektora zostają, a tylko tego audyt potrzebuje.Każdy sekret, który TruffleHog oznaczy jako zweryfikowany, jest aktywny. Zrotuj go teraz, przed czymkolwiek innym z tej strony. Codex nie unieważni danych dostępowych, a sekret, który trafił do wypchniętego commita, pozostaje skompromitowany nawet po przepisaniu historii, bo kopie zostają w forkach, klonach i cache’ach CI.
-
Najpierw zbadaj zgłoszone problemy, tylko do odczytu. Wklej pierwszy prompt poniżej do
codex -c 'default_permissions=":read-only"'. Prompt przypisuje zgłoszone podatności do kodu i proponuje poprawki bez ich wprowadzania, więc już w pierwszej godzinie masz spisany plan na termin ujawnienia. -
Uruchom audyty domenowe równolegle. Zapisz trzy prompty domenowe poniżej jako
.codex/audit/input-validation.md,.codex/audit/authz.mdi.codex/audit/deps-config.md, a potem uruchom wszystkie naraz:Okno terminala for domain in input-validation authz deps-config; docodex exec \-c 'default_permissions=":read-only"' \-c model_reasoning_effort="high" \-o "audit/$domain.md" - < ".codex/audit/$domain.md" > "audit/$domain.log" 2>&1 &donewaitAudyty tylko do odczytu nie potrzebują worktree: żaden z nich nie zapisuje nic w checkoucie, więc wszystkie trzy mogą z niego korzystać jednocześnie. W 0.157.1
codex execnie ma flagi-ai jej nie potrzebuje: działa z zatwierdzaniemnever, więc komenda, która potrzebuje szerszego dostępu, kończy się błędem, zamiast czekać na zgodę, której nikt nie udzieli.-ozapisuje końcowy raport każdej sesji do pliku, a-czyta prompt ze standardowego wejścia. -
Scal raporty w jedną listę. Uruchom prompt scalający poniżej. Trzy audyty znajdują pokrywające się problemy z różnych stron, a jedna lista z jednym identyfikatorem na znalezisko to coś, co da się posortować według priorytetu, przydzielić i zamknąć.
-
Potwierdź każde znalezisko nieprzechodzącym testem, potem napraw je w worktree. Dla każdego znaleziska krytycznego lub wysokiego uruchom odizolowaną sesję
codex --worktree -c 'default_permissions=":workspace"'i wklej prompt „najpierw test exploita”. Każde znalezisko dostaje własne worktree i gałąź, więc poprawki trafiają jako osobne pull requesty, które da się przejrzeć. Przewodnik po worktree w Codex opisuje, jak przygotować worktree, żeby działał w nim zestaw testów. -
Zamknij bramki. Dodaj reguły
AGENTS.mdopisane niżej, uruchamiajcodex exec reviewprzed każdym pushem dotykającym ryzykownej ścieżki, proś o@codex security reviewna pull requestach (konfiguracja w code review z Codex), dodaj strukturalną bramkę bezpieczeństwa z Codex w CI/CD i zaplanuj codzienny przegląd.
Prompty do audytu bezpieczeństwa z Codex do skopiowania
Dział zatytułowany „Prompty do audytu bezpieczeństwa z Codex do skopiowania”Każdy prompt każe Codex traktować treść repozytorium jako dane. OWASP GenAI LLM Top 10 2026 (GenAI Security Project, publikacja 2026-08-04) wymienia „a public GitHub issue, a support ticket, or a malicious npm package” wśród miejsc, w których atakujący podkładają instrukcje dla agentów, a audyt czyta je wszystkie.
Zapisz prompt scalający jako .codex/audit/merge.md i uruchom go z profilem :workspace, a nie :read-only, bo zapisuje audit/findings.md:
codex exec -c 'default_permissions=":workspace"' - < .codex/audit/merge.mdTrzymaj katalog audit/ poza Gitem, dopisując go do .git/info/exclude w klonie audytowym: raporty opisują ścieżki ataku na twój kod.
Jak zweryfikować poprawki bezpieczeństwa bez czytania każdej linii?
Dział zatytułowany „Jak zweryfikować poprawki bezpieczeństwa bez czytania każdej linii?”Audyt jest coś wart tylko wtedy, gdy jego wynik da się przyjąć na podstawie dowodów. Te sprawdzenia zastępują czytanie każdej poprawki linia po linii.
| Dowód | Co udowadnia | Kto zatwierdza |
|---|---|---|
Test exploita w tests/security/, który przed poprawką nie przechodził, a po niej przechodzi | Znalezisko było prawdziwe i jest zamknięte | Właściciel bezpieczeństwa danej ścieżki, nie autor poprawki |
| Pełny zestaw testów i sprawdzanie typów na zielono na gałęzi z poprawką | Poprawka nie zmieniła poprawnego zachowania | CI, jako wymagane checki |
Ponowne skany bez znalezisk: Gitleaks oraz npm audit --audit-level=high kończy się kodem zero | W HEAD nie został żaden sekret ani niezałatane advisory o wysokiej wadze | CI |
| Ponowny audyt domenowy na gałęzi z poprawką nie zgłasza już znaleziska | Zniknęła cała klasa błędów, a nie tylko jedno wystąpienie | Deweloper, który prowadził audyt |
Każda linia „Do not flag” w AGENTS.md ma spisane uzasadnienie | Fałszywy alarm został oceniony, a nie zignorowany | Tech lead |
Człowiek nadal czyta dwie krótkie rzeczy: test exploita (czy atakuje dokładnie to, co opisuje znalezisko?) i każde wyciszenie. Samą poprawkę ocenia test, zestaw testów i ponowny skan. Tabela stanów znalezisk i zasady zatwierdzania dla zespołu są w Codex Security i centrum dowodzenia agentami.
Żeby sprawdzić samego audytora, raz na kwartał przygotuj jednorazową gałąź z podłożonymi błędami: SQL sklejanym ze stringów, trasą bez sprawdzenia właściciela i tokenem zaszytym na sztywno. Uruchom na niej trzy audyty domenowe. Liczba podłożonych błędów, które zgłoszą, to twoja linia bazowa, a spadek po zmianie promptu albo reguł w AGENTS.md oznacza regresję.
Zapisz reguły z audytu w AGENTS.md
Dział zatytułowany „Zapisz reguły z audytu w AGENTS.md”Lokalne review (/review, codex exec review) czyta obowiązujące pliki AGENTS.md (Codex 0.157.1), a review na GitHubie szuka sekcji ## Code Review Rules (dokumentacja OpenAI, sprawdzone 2026-10-12; sprawdzenie z 2026-08-28 nazywało ją ## Review guidelines). Zapisz reguły pod tym nagłówkiem, a jedna reguła obsłuży oba przypadki. Gdzie ładuje się ten plik, opisuje przewodnik po AGENTS.md. Zamień znaleziska z tego audytu w reguły, które recenzent sprawdzi na podstawie samego diffu:
## Code Review Rules
### Security- P0: an error handler that returns err.stack, err.message from an internal error, file paths or SQL text to the client. Log them; return { error: "internal" }.- P0: SQL or NoSQL queries built with template literals or + concatenation.- P0: a route under src/routes/ that loads a record by an ID from the request without requireOwnership() or requireRole().- P0: a secret, token or private key literal in any file, including tests.- P1: auth endpoints (login, register, reset-password) without the rate limiter, or with responses that differ for known and unknown accounts.- P1: a new dependency that is not already in package.json; check that the name exists on the registry and is the package the author meant.- Do not flag: Drizzle .where() calls with bound values; they are parameterized.- Do not flag: fake credentials under tests/fixtures/.- When you report a finding, name the rule above that it violates.Reguła o zależnościach ma konkretny powód: wpis LLM04 Supply Chain w OWASP GenAI LLM Top 10 2026 ostrzega, że asystenci kodowania „hallucinate plausible but nonexistent package names”, a atakujący rejestrują takie nazwy z wyprzedzeniem. OWASP nazywa tę praktykę „slopsquatting”.
Przed każdym pushem, który dotyka src/routes/, src/middleware/ albo src/auth/, uruchom review względem gałęzi bazowej:
codex exec review --base main -o review.mdW Codex 0.157.1 flag --base, --uncommitted i --commit nie da się łączyć z własnymi instrukcjami review: codex exec review --base main "focus on security" kończy się błędem the argument '--base <BRANCH>' cannot be used with '[PROMPT]'. Dlatego reguły bezpieczeństwa należą do AGENTS.md, skąd czytają je gotowe tryby review, a nie do promptu.
Zaplanuj codzienny przegląd bezpieczeństwa
Dział zatytułowany „Zaplanuj codzienny przegląd bezpieczeństwa”Jednorazowy audyt traci aktualność z pierwszym zmergowanym pull requestem. Codzienny przegląd raportuje tylko to, co się zmieniło. Uruchom go jako automatyzację w aplikacji desktopowej Codex albo z crona na stale włączonej maszynie, tą samą komendą codex exec -c 'default_permissions=":read-only"' co audyty domenowe. Przewodnik po automatyzacjach Codex opisuje, gdzie powinno działać zadanie cykliczne i jak przetestować prompt przed zaplanowaniem, a zaplanowane skany bezpieczeństwa – jak przechowywać dowody.
Wygeneruj audit/npm-audit.json w zadaniu, zanim uruchomi się Codex, bo profil tylko do odczytu nie ma sieci. Stała linia „nic nowego” pozwala skryptowi albo człowiekowi od razu odróżnić czysty przebieg od nieudanego.
Gdy audyt bezpieczeństwa z Codex idzie nie tak
Dział zatytułowany „Gdy audyt bezpieczeństwa z Codex idzie nie tak”Audyty domenowe zatrzymują się na błędach uprawnień. Pod :read-only komendy, które zapisują albo sięgają do sieci, kończą się błędem, a codex exec, który działa z zatwierdzaniem never, zwraca ten błąd zamiast pytać. Jak z tego wyjść: uruchom komendę sam (skaner, instalację zależności) i wskaż w prompcie plik z jej wynikiem. Nie przełączaj audytu na :workspace i nie omijaj sandboksa, żeby przejść dalej.
codex exec review odrzuca twoje instrukcje bezpieczeństwa. W 0.157.1 tryby --base, --uncommitted i --commit nie przyjmują promptu. Jak z tego wyjść: przenieś instrukcje do sekcji ## Code Review Rules w AGENTS.md albo uruchom codex exec z promptem, który sam nazywa diff („review the changes on this branch against origin/main”).
Codex oznacza sparametryzowane zapytania jako SQL injection. Nie wie, że twój ORM wiąże wartości. Jak z tego wyjść: dodaj linię „Do not flag” z nazwą wywołania ORM, jak w bloku AGENTS.md powyżej, i zostaw regułę zakazującą SQL w template literals.
Dwa przebiegi tego samego audytu zgłaszają różne znaleziska. Audyty oparte na modelu są niedeterministyczne. Jak z tego wyjść: traktuj scalony audit/findings.md jako rejestr, powtarzaj tylko audyt tej domeny, której wynikowi nie ufasz, a o tym, czy zmiana promptu pomogła, niech rozstrzyga gałąź z podłożonymi błędami.
Znalezisko jest „potwierdzone” argumentem, bez testu. Sesja pisze przekonujące wyjaśnienie zamiast nieprzechodzącego testu. Jak z tego wyjść: odeślij ją z poleceniem „write the failing test first; no explanation without it” i nie otwieraj pull requesta dla tego znaleziska, dopóki test nie istnieje.
Aktualizacja zależności psuje build. Wersja z poprawką ma zmiany łamiące zgodność. Jak z tego wyjść: przed aktualizacją przeczytaj listę zmian łamiących zgodność z punktu 1b audytu deps-config.md, aktualizuj jeden pakiet na commit, a advisory NOT REACHABLE odłóż na śledzony backlog zamiast pracy na ten tydzień.
Codzienny przegląd powtarza te same zaakceptowane znaleziska. Każdy raport wymienia te same advisory o średniej wadze, które przejrzano i oceniono miesiąc temu, i zespół przestaje go czytać. Jak z tego wyjść: zapisuj ID każdego zaakceptowanego advisory z uzasadnieniem i datą wygaśnięcia w .security-ignore.json i zostaw w prompcie regułę „zgłaszaj tylko ID spoza pliku ignore”.
Audytowane repozytorium uruchamia własne hooki. Oznaczenie repozytorium dostawcy jako zaufanego, żeby je zaudytować, włącza jego konfigurację, hooki i polityki exec. Jak z tego wyjść: audytuj niezaufany kod w osobnym klonie i wybierz Open restricted. Sesja, która działała, gdy folder był zaufany, może zachować tamtą konfigurację, więc po zmianie zaufania zacznij nową sesję.
Jak ten sam audyt robią Claude Code i Cursor?
Dział zatytułowany „Jak ten sam audyt robią Claude Code i Cursor?”Ta strona dotyczy tylko Codex. Claude Code ma /security-review i plugin Claude Security, opisane w audycie bezpieczeństwa z Claude Code. Funkcje przeglądu bezpieczeństwa w Cursorze opisuje strona bezpieczeństwo w Cursorze. Wersja tego workflow niezależna od narzędzia, ze skanerami jako bramkami CI i dowolnym z trzech agentów triażującym ich wyniki, to automatyzacja operacji bezpieczeństwa.