Przejdź do głównej zawartości

Audyt 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.

  • 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 Rules w AGENTS.md z 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.

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ęść audytuNarzędziePotrzebny dostępCo dostajesz
Sekrety, pakiety ze znanymi podatnościami, wzorce oparte na regułachGitleaks, 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ństwacodex exec z -c 'default_permissions=":read-only"'Odczyt repozytorium, bez zapisu i bez sieciRaport znalezisk dla każdej domeny
Potwierdzenie znaleziska i poprawkacodex --worktree z profilem :workspaceZapis w odizolowanym checkoucieNieprzechodzący test exploita, potem poprawka na gałęzi
Sprawdzenie gałęzi, zanim stanie się pull requestemcodex exec review albo /reviewOdczyt diffuZnaleziska review sterowane przez AGENTS.md
Sprawdzenie pull requesta@codex security review na GitHubiePołączenie Codex z GitHubemKomentarze review skupione na bezpieczeństwie
Powtarzanie przegląduAutomatyzacja w aplikacji desktopowej Codex albo codex exec z cronaTaki sam jak w audycie domenowymCodzienny 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.

  1. Odetnij aktywne sekrety i daj Codex czystą kopię. Prowadź audyt na świeżym klonie repozytorium. Świeży klon nie ma pliku .env z .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ż swojego AGENTS.md.

    Okno terminala
    git clone --no-local . ../app-audit && cd ../app-audit
  2. Uruchom skanery deterministyczne i zachowaj ich wyniki. Najpierw zainstaluj skanery, na przykład brew install gitleaks trufflehog semgrep jq (albo pip install semgrep). Potrzebujesz Gitleaks 8.19.0 lub nowszego: w tym wydaniu pojawiła się podkomenda git, a starsze wersje znają tylko detect (sprawdzone w wydaniach Gitleaks 2026-09-26). Potem w terminalu, w katalogu głównym klonu audytowego:

    Okno terminala
    mkdir -p audit
    gitleaks git --redact --report-path audit/gitleaks.json # secrets in full git history, values masked
    trufflehog git file://. --results=verified,unknown --json \
    | jq -c 'del(.Raw, .RawV2)' > audit/trufflehog.json # live check against the issuing service; raw values stripped
    npm audit --omit=dev --json > audit/npm-audit.json # advisories in production dependencies
    semgrep scan --config auto --json -o audit/semgrep.json # rule-based patterns; auto sends your project URL to the Semgrep Registry

    Oba raporty domyślnie zawierają surowy sekret. --redact maskuje go w raporcie Gitleaks, a filtr jq usuwa pola Raw i RawV2 z 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.

  3. 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.

  4. Uruchom audyty domenowe równolegle. Zapisz trzy prompty domenowe poniżej jako .codex/audit/input-validation.md, .codex/audit/authz.md i .codex/audit/deps-config.md, a potem uruchom wszystkie naraz:

    Okno terminala
    for domain in input-validation authz deps-config; do
    codex exec \
    -c 'default_permissions=":read-only"' \
    -c model_reasoning_effort="high" \
    -o "audit/$domain.md" - < ".codex/audit/$domain.md" > "audit/$domain.log" 2>&1 &
    done
    wait

    Audyty 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 exec nie ma flagi -a i jej nie potrzebuje: działa z zatwierdzaniem never, więc komenda, która potrzebuje szerszego dostępu, kończy się błędem, zamiast czekać na zgodę, której nikt nie udzieli. -o zapisuje końcowy raport każdej sesji do pliku, a - czyta prompt ze standardowego wejścia.

  5. 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ąć.

  6. 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.

  7. Zamknij bramki. Dodaj reguły AGENTS.md opisane niżej, uruchamiaj codex exec review przed każdym pushem dotykającym ryzykownej ścieżki, proś o @codex security review na 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:

Okno terminala
codex exec -c 'default_permissions=":workspace"' - < .codex/audit/merge.md

Trzymaj 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ódCo udowadniaKto zatwierdza
Test exploita w tests/security/, który przed poprawką nie przechodził, a po niej przechodziZnalezisko było prawdziwe i jest zamknięteWł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 zachowaniaCI, jako wymagane checki
Ponowne skany bez znalezisk: Gitleaks oraz npm audit --audit-level=high kończy się kodem zeroW HEAD nie został żaden sekret ani niezałatane advisory o wysokiej wadzeCI
Ponowny audyt domenowy na gałęzi z poprawką nie zgłasza już znaleziskaZniknęła cała klasa błędów, a nie tylko jedno wystąpienieDeweloper, który prowadził audyt
Każda linia „Do not flag” w AGENTS.md ma spisane uzasadnienieFałszywy alarm został oceniony, a nie zignorowanyTech 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ę.

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:

Okno terminala
codex exec review --base main -o review.md

W 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.

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.

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ę.

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.

Wróć do przeglądu sekcji Eksploatacja w Codex.