<CarlosDev/>

Actual

El número que Codex Security no publicó

OpenAI liberó su escáner de seguridad y reportó 92% de recall. El número que decide si los hallazgos sirven — la precisión — nunca se publicó.

Publicado
Lectura
16 min
Redacción
Estable
Banner de Codex Security — el número que no publicaron.
En este registro7 secciones

El 29 de julio de 2026, OpenAI publicó Codex Security — un CLI y un SDK de TypeScript para encontrar, validar y corregir vulnerabilidades — bajo licencia Apache 2.0. Venía funcionando desde marzo como research preview con el nombre Aardvark, y el número que lo acompañó en todas partes es genuinamente llamativo: 92% de las vulnerabilidades conocidas e introducidas sintéticamente detectadas en repositorios de referencia, más 3.000 vulnerabilidades críticas corregidas hasta abril y diez CVE divulgados en proyectos de código abierto.

El repositorio superó las 8.000 estrellas en menos de un mes. Fui a buscar la metodología detrás de ese 92%, y lo que encontré no fue un defecto. Fue una ausencia.

El número es recall. El número que decide si puedes usar la herramienta es la precisión, y la precisión nunca se publicó.

Qué es realmente

Antes del argumento, la arquitectura — porque la mayoría de las notas la contó mal, y en las dos direcciones.

El CLI corre en tu máquina y escanea repositorios que ya están en disco. Pero el razonamiento no es local. Llama a un modelo hospedado — gpt-5.6-sol con esfuerzo de razonamiento xhigh por defecto — y ejecutar escaneos requiere acceso a Codex Security, que está restringido. Los escaneos de repositorio completo pueden requerir además lo que la documentación llama Trusted Access for Cyber.

Así que la descripción precisa es más estrecha que la nota de prensa y que la reacción en contra. Lo que es Apache 2.0 es el CLI, el SDK, el arnés de Docker y la orquestación. Lo que está cerrado es aquello que decide si un hallazgo es un hallazgo. Puedes leer cada línea de cómo se recolecta, se trocea y se envía tu código. No puedes leer, ejecutar ni auditar la parte que razona sobre él.

TU MÁQUINA · APACHE 2.0 veredictos tu código OPENAI · CERRADOmodelo gpt-5.6-sol Hallazgos + extractos Tu repositorio CLI codex-security

Esa distinción importa más que la discusión de licencias a la que suele reducirse. Significa que la propiedad interesante de esta herramienta — su criterio — no es reproducible por ti, y que su perfil de error es el que diga la evaluación de OpenAI.

Lo que nos lleva a la evaluación.

De dónde sale el 92%

El recall responde una pregunta: de las vulnerabilidades que existen, ¿cuántas encontró el escáner? Sobre repositorios de referencia sembrados con fallos conocidos e introducidos a propósito, Codex Security encontró 92 de cada 100.

Es un resultado real y difícil. También es, por sí solo, infalsificable como afirmación de utilidad, porque se puede alcanzar 100% de recall reportando que cada línea del código es vulnerable.

La pregunta complementaria es la precisión: de las cosas que el escáner reportó, ¿cuántas eran reales? El recall mide lo que atrapas. La precisión mide lo que tienes que atravesar para llegar ahí. Pon un escáner con 92% de recall y 20% de precisión sobre un monorepo y le habrás entregado a tu equipo de seguridad cuatro falsas alarmas por cada verdadera — indefinidamente, en cada commit.

Hay dos cosas más sobre ese 92% que conviene retener.

Incluye vulnerabilidades introducidas sintéticamente. Los fallos inyectados son más fáciles que los orgánicos: suelen estar contenidos localmente, tener una forma idiomática y no estar enredados con la arquitectura que los rodea. Las vulnerabilidades reales son con frecuencia emergentes — una función segura llamada con estado influido por un atacante tres capas más arriba. Cualquier cifra de recall que mezcle ambas sobrestima el desempeño sobre el segundo tipo.

Y está medido sobre repositorios elegidos para el benchmark. Tu código no.

Qué encontraron los benchmarks independientes

Aquí la historia gira, y gira en contra de la narrativa fácil, no a favor.

RealVuln (Pellew y Raza, marzo de 2026) evaluó 15 escáneres sobre 26 repositorios Python vulnerables con 796 hallazgos etiquetados a mano — 676 vulnerabilidades reales y 120 trampas deliberadas de falso positivo. El conjunto de trampas es la parte que importa: existe específicamente para atrapar herramientas que llegan a un recall alto por coincidencia de patrones.

Los resultados de precisión:

EscánerPrecisión
Claude Sonnet 4.6LLM de propósito general0.785
Gemini 3.1 ProLLM de propósito general0.774
SonarQubeSAST basado en reglas0.611
SecLab AgentEspecializado en seguridad0.605
SnykSAST basado en reglas0.282
SemgrepSAST basado en reglas — el titular actual0.205
Precisión en RealVuln, 26 repositorios Python vulnerables, 796 hallazgos etiquetados a mano.1.0 = todo hallazgo es real · 0.0 = todo hallazgo es ruido

Yo esperaba que esta tabla condenara a los LLM. Hace lo contrario. Los modelos de propósito general fueron aproximadamente tres veces más precisos que las herramientas SAST basadas en reglas que la industria viene ejecutando hace una década. En las clases que exigen entender de verdad qué hace el código, la brecha de recall es todavía mayor: inyección SQL 95% contra 32%, inyección de comandos 83% contra 24%.

Semgrep con 0,205 de precisión significa que cuatro de cada cinco hallazgos son ruido. Ese es el titular actual. Eso es lo que los equipos ya toleran.

Así que el encuadre honesto no es «los escáneres con IA son ruidosos». Es: los escáneres con IA parecen una mejora grande sobre una línea base que era muy mala, y Codex Security decidió no reportar dónde cae en el eje donde esa mejora se vería.

El segundo paper fija el rango. ¿Están los LLM de frontera listos para ciberseguridad? (Dahiya et al., revisado en junio de 2026) evaluó ocho modelos y encontró que todos los modelos de frontera producen entre 10% y 50% de falsos positivos en detección de caja blanca, sobrepredciendo vulnerabilidades de forma sistemática. Su mejor modelo especializado alcanzó 0,904 de precisión con 9,7% de falsos positivos. La motivación que declaran es exactamente la misma brecha: los benchmarks previos no reportaban tasas de falsos positivos, y esa es la métrica que determina la utilidad en el mundo real.

Un 10% y un 50% de falsos positivos son la diferencia entre una herramienta en la que tu equipo confía y una que tu equipo silencia. Codex Security podría estar en cualquiera de los dos extremos. Nada de lo publicado te dice cuál.

Por qué esto lo es todo

Si crees que un escáner ruidoso es apenas molesto, mira lo que le hizo a curl.

curl mantuvo un bug bounty en HackerOne desde abril de 2019. Para 2025, los reportes generados con LLM — largos, seguros de sí mismos, superficialmente plausibles y fabricados — habían desbordado a un equipo de seguridad voluntario de siete personas. Los números de Daniel Stenberg: la tasa de vulnerabilidades confirmadas cayó de más del 15% a menos del 5%, con aproximadamente uno de cada cinco envíos siendo basura directa. Cada reporte falso seguía costando horas, porque no se puede descartar una afirmación de seguridad sin leerla.

A comienzos de 2026 curl cerró el programa. Lo reabrió alrededor de un mes después, cuando la calidad de los reportes se recuperó, pero el volumen siguió subiendo.

El encuadre del propio Stenberg fue que la basura generada por IA es un ataque de denegación de servicio contra el código abierto. Ese es el modelo mental correcto, y se traslada directo a tu pipeline de CI. Los falsos positivos en herramientas de seguridad no se degradan con elegancia. Consumen el recurso más escaso del equipo — la atención experta — y cuando ese recurso se agota, la gente deja de leer los hallazgos. Un escáner ignorado tiene valor negativo, porque sigue cargando la promesa de que algo se está revisando.

Por eso mismo, un detalle chico de diseño del CLI tranquiliza más que cualquier benchmark. findings false-positive permite marcar un hallazgo como no aplicable con una razón escrita, y la decisión persiste entre escaneos futuros sin suprimir la regla subyacente. Eso no es una comodidad. Es una admisión, en código, de que los falsos positivos son el problema operativo — y está construido de la forma correcta, porque suprimir la regla es justamente como los equipos se quedan ciegos ante una clase entera de vulnerabilidad.

Alguien en ese equipo entiende el modo de falla real. Eso hace que la métrica faltante resalte más, no menos.

Qué te da la liberación del código

En concreto, y conviene separarlo del debate sobre si la etiqueta corresponde.

Obtienes: la capacidad de auditar qué sale de tu máquina, ejecutar el escáner en tus propios contenedores, integrarlo a CI con tu propia política, mantener los resultados en infraestructura que controlas y bifurcar la orquestación si no te sirve. Para entornos regulados eso no es poco — el flujo de datos es la pregunta que realmente hace cumplimiento, y ahora se responde leyendo el código.

No obtienes: la capacidad de ejecutarlo sin la aprobación de OpenAI, reproducir sus resultados, evaluarlo antes de pedir acceso, ni seguir usándolo si cambian los términos. La inteligencia de escaneo es una dependencia hospedada con una puerta delante.

Qué haría yo

  • Tómate la prueba en serio y diséñala como una medición. El acceso está restringido, así que tienes una sola oportunidad de primera impresión. No la gastes en un repositorio que ya sabes que está limpio.
  • Mide la precisión tú mismo, porque nadie más lo hizo. Ejecútalo sobre un repositorio cuyo historial de vulnerabilidades conozcas — uno con CVE resueltos y commits auditados. Cuenta hallazgos confirmados sobre hallazgos totales. Esa sola razón te dice más que el 92%.
  • Incluye un conjunto de trampas de falso positivo. El diseño de RealVuln vale la pena copiarlo: siembra código que parezca vulnerable y no lo sea. El comportamiento de un escáner ante casi-aciertos deliberados es el mejor sustituto disponible de su comportamiento sobre tu código real.
  • Compara contra la línea base que realmente ejecutas, no contra la perfección. Si hoy Semgrep te da 0,205 de precisión, un escáner en 0,6 es una ganancia grande aunque esté lejos de estar limpio.
  • Presupuesta el tiempo de revisión antes de habilitarlo en CI. Con cualquier precisión plausible, alguien va a leer hallazgos que terminan en nada. Decide quién y cuánto tiempo antes de que se bloquee el primer pull request.

Lo que vale la pena llevarse no es que Codex Security esté sobrevalorado — con la evidencia disponible es una herramienta fuerte, y la literatura independiente es más amable con esta clase de escáner de lo que yo esperaba al empezar.

Es que una cifra de 92% de recall, publicada sin su contraparte de precisión, es media medición presentada como una completa. La mitad que se publicó es la mitad que vende. La mitad que no, es la que determina si tu equipo va a seguir leyendo la salida dentro de seis meses.

Pide ese número cuando solicites acceso. Si existe, es lo más útil que podrían decirte.

7 min

Integrar Codex Security a CI sin bloquear a todo el mundo

Códigos de salida, política de severidad, techos de costo y el problema del directorio de salida — el detalle operativo de adoptar un escáner con IA.

Leer por separado: Integrar Codex Security a CI sin bloquear a todo el mundo

El artículo principal sostiene que la precisión es el número que nadie publicó. Este complemento asume que decidiste adoptarlo igual — lo cual es razonable — y cubre la parte que determina si la implementación sobrevive al contacto con tu equipo.

Todo lo que sigue proviene de la referencia publicada del CLI. Nada de esto es una afirmación de benchmark.

Requisitos

Node.js 22 o superior, y Python 3.10 o superior — la dependencia de Python no es opcional y hace falta para escanear y exportar, algo que sorprende a quien asume que un paquete de npm es autocontenido.

La autenticación es inicio de sesión con ChatGPT para personas y una variable de entorno para automatización: OPENAI_API_KEY, CODEX_API_KEY o CODEX_ACCESS_TOKEN. Usa --auth api-key en CI para que una sesión interactiva vieja no cambie en silencio con qué identidad corre un pipeline. Para máquinas sin interfaz existe login --device-auth.

Los códigos de salida son la superficie de integración

Esta es la parte que conviene resolver primero, porque todo lo demás en tu pipeline se apoya en ella.

CódigoSignificado
0Completado, y la política se cumplió
1Hallazgos en o por encima del umbral de severidad configurado
2Error de entrada o ejecución, o cobertura incompleta
130Interrumpido (Ctrl-C)
143Terminado (SIGTERM)

El que te va a morder es el 2. Mezcla «la herramienta falló» con «el escaneo no cubrió del todo el objetivo» — y los escaneos reportan cobertura como complete, partial o unknown. Un job que trate el 2 como fallo de infraestructura y reintente va a tapar alegremente un escaneo que examinó en silencio una fracción de tu código.

0 1 2 Salida Cumple, merge Hallazgos, revisar Sin evidencia, frenar

Empieza en modo solo-reporte

--fail-on-severity acepta critical, high, medium o low, y es el interruptor que convierte un escáner en un bloqueante.

No lo actives el primer día. Ejecuta el escaneo, exporta los hallazgos y deja que el pipeline pase igual mientras mides cuánto de la salida es real. Es la misma medición de precisión que propone el artículo principal, solo que no te cuesta nada extra porque el escaneo ya está corriendo.

npx @openai/codex-security scan . \
  --output-dir "$RUNNER_TEMP/codex-security" \
  --max-cost 5

Cuando tengas algunas semanas de datos, sube la puerta de arriba hacia abajo. Primero critical. La primera experiencia de nadie con una herramienta de seguridad nueva debería ser un release bloqueado por un hallazgo de severidad media en un archivo que no tocó.

Escanea el diff, no el mundo, en los pull requests

Los escaneos de repositorio completo son para ejecuciones programadas. En un pull request, escanea lo que cambió:

npx @openai/codex-security scan . --diff "origin/${BASE_REF}"

--working-tree cubre cambios preparados y sin preparar en local, e install-hook integra la misma verificación a un hook de pre-commit. Ojo: los escaneos de diff y working-tree requieren que el argumento del repositorio sea la raíz del worktree de git — pasar un subdirectorio falla en vez de acotar.

--mode deep hace una revisión más amplia pero no admite objetivos de diff ni working-tree. El modo profundo es un job nocturno o semanal contra el repositorio entero, no algo que pongas en el camino al merge.

El costo es un flag de primera clase, y eso es una advertencia

--max-cost toma una cifra en dólares. La existencia de ese flag te dice que la configuración por defecto — gpt-5.6-sol con esfuerzo xhigh — es lo bastante cara como para que escanear sin límite sea un riesgo real.

Lee con atención la salvedad documentada: las solicitudes ya en curso pueden terminar por encima del límite. Es un techo con desborde, no un corte duro. Ponlo por debajo de lo que estás dispuesto a gastar de verdad.

Los cinco niveles de esfuerzo — minimal, low, medium, high, xhigh — son la otra palanca. xhigh es el valor por defecto, lo que significa que la configuración de fábrica es la más cara. Un escaneo de diff por pull request con esfuerzo menor, más un escaneo profundo nocturno en xhigh, es la forma en la que va a terminar la mayoría de los equipos.

Para trabajo sobre muchas repos, bulk-scan toma un CSV con columnas id, repository y revision, y corre con --workers 4 por defecto. Súbelo a conciencia; el techo de costo es por escaneo, no por ejecución masiva.

El directorio de salida es un artefacto sensible

Los resultados del escaneo contienen fragmentos de código fuente y detalles de las vulnerabilidades. Eso es un archivo que describe cómo explotar tu producto, en prosa, con código.

Tres consecuencias:

  • Escríbelo fuera del repositorio. Un --output-dir apuntando a cualquier lugar dentro del árbol de trabajo es la forma en que ese archivo termina commiteado. Usa el directorio temporal del runner.
  • No lo publiques como artefacto de CI público. En un repositorio público, los artefactos de build los puede descargar cualquiera.
  • Dale una política de retención, que la documentación recomienda de forma explícita.

Exporta a SARIF para los tableros — export --format sarif — y deja que la plataforma de seguridad guarde el detalle bajo su propio control de acceso, en lugar de dejar copias en el almacenamiento de CI.

npx @openai/codex-security export \
  --format sarif \
  --output-dir "$RUNNER_TEMP/codex-security"

Separa encontrar, validar y corregir

scan, validate y patch son comandos distintos, y mantenerlos distintos es el instinto correcto.

validate vuelve a verificar hallazgos candidatos contra el código actual, que es lo que quieres al triar un backlog — un hallazgo levantado hace tres semanas puede estar ya corregido. patch genera la remediación. Ninguno de los dos debería correr sin supervisión en el camino al merge. Un parche generado es una propuesta; necesita la misma revisión que cualquier otro cambio, y probablemente más, porque llega con una afirmación implícita de corrección en seguridad.

scans compare y scans match comparan resultados entre ejecuciones, que es cómo respondes «¿este pull request introdujo algo nuevo?» sin releer todo el backlog.

Registra los falsos positivos como corresponde

findings false-positive marca un hallazgo como no aplicable con una razón escrita, y la decisión persiste entre escaneos futuros sin suprimir la regla subyacente.

Úsalo, y exige que la razón sea real. La alternativa — equipos deshabilitando categorías enteras de reglas para acallar el ruido — es la forma en que una organización se queda ciega ante una clase completa de vulnerabilidad mientras su tablero sigue en verde.

--knowledge-base acepta documentos de arquitectura y modelo de amenazas. Si tienes un modelo de amenazas escrito, esta es la entrada de mayor palanca disponible: es la diferencia entre un escáner que marca cada llamada de deserialización y uno que sabe cuáles de ellas son alcanzables desde un límite no confiable.

Una primera implementación razonable

  1. Escaneos de diff en modo solo-reporte sobre pull requests, sin puerta de severidad, salida al temporal del runner, --max-cost bajo.
  2. Escaneo profundo semanal del repositorio completo, resultados exportados a SARIF.
  3. Después de un mes, cuenta hallazgos confirmados sobre hallazgos totales. Ese es tu número de precisión, sobre tu código.
  4. Activa --fail-on-severity critical solo si esa razón lo justifica.
  5. Alimenta el modelo de amenazas vía --knowledge-base y mide si la razón mejora.

El paso 3 es el que la gente saltea, y es el único que te dice si algo del resto valió la pena.

Clasificado en

Citas

6

Referencias externas