Le pedí a Claude que escribiera mi endpoint de login. Estaba roto de cuatro maneras distintas.
No era obvio. El código se veía limpio, estaba bien formateado, tenía comentarios útiles. Pero tenía SQL injection, JWT sin verificar, y las contraseñas hasheadas con MD5. Construí Parley para que eso no le pase a nadie más.
Fue en un proyecto de lado, un sábado a la tarde. Necesitaba un endpoint de autenticación rápido en Python. Le pasé el contexto a Claude, me devolvió 80 líneas prolijas, lo copié, lo pegué, funcionó en el primer intento.
Tres días después, mirando el código más despacio antes de hacer el deploy, noté algo raro en la query. El modelo había armado el SQL concatenando strings. Directamente. Sin prepared statements. El tipo de error que cualquier tutorial de seguridad web menciona en el primer capítulo.
Lo peor no fue encontrar eso. Lo peor fue que, si no lo buscaba activamente, nunca lo hubiera visto. El código era prolijo, estaba bien indentado, tenía nombres de variables descriptivos. Transmitía confianza. Y esa confianza era el problema real.
El problema no es que la IA sea mala generando código. El problema es que fue entrenada con millones de líneas de código histórico — y ese código histórico está lleno de vulnerabilidades que en su momento nadie cuestionó. El modelo aprendió los patrones incorrectos con la misma confianza con la que aprendió los correctos. No distingue entre código seguro y código que simplemente funciona.
Busqué herramientas para auditarlo sistemáticamente. Snyk requería cuenta en la nube y estaba pensado para integrar en pipelines de CI de equipos medianos. Semgrep era potente pero genérico, con una curva de configuración que no tenía sentido para un proyecto chico. Ninguna herramienta estaba especializada en los patrones específicos que producen los LLMs — porque hasta hace poco ese no era un problema que existiera a esta escala.
Así nació Parley.
Qué es
Parley es un CLI que actúa como tu equipo de seguridad personal para código generado con IA. La idea es simple: generás código con Claude, ChatGPT o Copilot, lo pegás en tu proyecto, y antes de hacer commit corrés Parley. Él te dice si hay problemas de seguridad, sin mandar nada a internet, sin cuentas, sin configuración previa.
$ parley scan auth.py
[CRITICAL] SQL injection — línea 34[HIGH] JWT sin verificar — línea 67[HIGH] Hash inseguro (MD5) — línea 89[INFO] Error expuesto al cliente — línea 102
4 findings en 1 archivo (2 críticos, 2 altos, 0 medios)Treinta segundos. Sin fricción. Sin tener que recordar un checklist mental cada vez que copiás código de un chat.
Cómo funciona por dentro
Tiene dos capas que se activan en orden:
Capa 1 — Análisis estático (siempre activa, instantánea)
24 reglas en YAML comparan el código contra patrones conocidos de vulnerabilidades. Es como un corrector ortográfico pero para seguridad. No necesita internet ni modelos de IA para funcionar — corre en milisegundos.
Capa 2 — Análisis con LLM local (opcional, --llm)
Usa un modelo corriendo en tu propia máquina via Ollama para entender el contexto de cada finding y explicarte exactamente por qué es peligroso y cómo arreglarlo. Esta capa agrega el “por qué” que el análisis estático no puede dar.
La decisión de usar un modelo local para la capa 2 fue deliberada. Si el código que estás auditando es código propietario o de autenticación, mandarlo a un servidor externo para analizarlo introduce exactamente el tipo de riesgo que querés evitar. Con Ollama todo queda en tu máquina.
Las 24 reglas, agrupadas en 8 categorías
Definimos las reglas cubriendo los patrones más frecuentes que aparecen en código AI-generado, no vulnerabilidades en abstracto:
| Categoría | Reglas |
|---|---|
| Inyección | 3 |
| Validación de entrada | 3 |
| Secretos hardcodeados | 3 |
| Memoria y buffers | 3 |
| Deserialización | 3 |
| Manejo de errores | 3 |
| Autenticación | 3 |
| Config insegura | 3 |
Cada regla es un archivo YAML simple y legible. No hace falta entender el motor en Go para contribuir una nueva — alcanza con conocer el patrón de vulnerabilidad que querés cubrir.
Así se ven los findings en detalle
Una decisión de diseño importante: Parley es conservador con los falsos positivos. Preferimos avisarte de menos cosas con alta confianza que llenarte de alertas que no son reales. Si hay duda, el finding se marca como INFO en lugar de HIGH. La idea es que cuando Parley dice CRITICAL, vos lo tratés como crítico de verdad.
CRITICAL SQL injection por concatenación de strings
auth.py:34— La query arma el WHERE pegando directamente el valor del parámetro username. Un atacante puede cerrar la query e inyectar cualquier SQL arbitrario, incluyendo lecturas de otras tablas o eliminación de datos. Usá prepared statements:cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
HIGH JWT aceptado sin verificar la firma
auth.py:67— El token se decodifica converify=False. Esto significa que cualquier persona puede construir un token con el payload que quiera — por ejemplo, conrole: admin— y el sistema lo va a aceptar. Siempre verificá la firma con tu clave secreta antes de confiar en el contenido del token.
HIGH Contraseña hasheada con MD5
auth.py:89— MD5 fue roto hace décadas y existen tablas rainbow que permiten revertir hashes comunes en segundos. Para passwords usá bcrypt, argon2 o scrypt, que están diseñados específicamente para ser lentos y resistentes a fuerza bruta.
INFO Stack trace expuesto al cliente
auth.py:102— El bloque except devuelvestr(e)directamente en la respuesta HTTP. Dependiendo del error, eso puede filtrar rutas internas del servidor, nombres de tablas de la base de datos o strings de conexión. Loggeá el detalle internamente y devolvé un mensaje genérico al cliente.
Por qué open source y sin telemetría
El código que Parley escanea puede ser código propietario, puede tener lógica de negocio sensible, puede ser exactamente el código de autenticación que no querés que salga de tu entorno. La decisión de no mandar nada a ningún servidor externo no es un feature — es el punto de partida.
El motor está escrito en Go porque compila en un solo binario ejecutable sin dependencias. Instalación en segundos, funciona igual en Mac, Linux y Windows. Las reglas están en YAML para que sean legibles y fáciles de contribuir. Python aparece únicamente en el módulo de integración con Ollama, porque es el entorno más natural para ese tipo de integración.
El código es público en GitHub bajo licencia MIT. Sin telemetría, sin analytics, sin ningún tipo de comunicación con servidores externos.
Qué sigue y cómo podés ayudar
Parley está en etapa de prueba de concepto. Las 24 reglas cubren los patrones más comunes que encontramos en código AI-generado, pero el espacio es mucho más amplio. Cada lenguaje tiene sus propios antipatrones. Cada framework tiene sus propias trampas. Y los modelos evolucionan — los patrones que generan hoy no son exactamente los mismos que generaban hace un año.
Hay tres formas concretas de contribuir:
Nuevas reglas YAML — si encontrás un patrón de vulnerabilidad que Parley no detecta, podés abrir un issue describiendo el patrón o mandar directamente una PR con la regla. No hace falta tocar Go.
Testing en proyectos reales — si tenés proyectos con código AI-generado, corré Parley y contanos qué encontró, qué se perdió y qué generó falsos positivos. Ese feedback es lo más valioso que podemos recibir ahora mismo.
Soporte para más lenguajes — las reglas actuales cubren Python y Go principalmente. Hay mucho trabajo por hacer en JavaScript, TypeScript, Java y Rust.
Si usás IA para escribir código — y en 2025 casi todos lo hacemos — Parley es esa segunda mirada que deberías darle antes de hacer deploy. No reemplaza una auditoría de seguridad seria. Pero sí reemplaza el “seguro que está bien, lo generó la IA”. Y eso, resulta, es bastante.