AI Code Security — cuatro agentes que detectan lo que SAST pasa por alto en código generado por IA. Construido sobre GitLab Duo Agent Platform.
El 40-62% del código generado por IA contiene vulnerabilidades de seguridad. SAST tradicional detecta CVEs. Nosotros detectamos lo que SAST pasa por alto — inyección de prompts, ejecución de salida de LLM, deserialización ML insegura.
La IA acelera la generación de código pero crea nuevos cuellos de botella de seguridad:
| Problema | Impacto |
|---|---|
| Las revisiones de seguridad bloquean MRs durante horas o días | 7 horas/semana perdidas por miembro del equipo |
| La IA dificulta la gestión del cumplimiento | 70% de los equipos lo reportan |
| Problemas de cumplimiento descubiertos después del despliegue | 76% de las organizaciones |
| Las herramientas SAST tradicionales pasan por alto riesgos específicos de IA | Inyección de prompts, salida LLM a ejecución, deserialización ML insegura |
| El 40-62% del código generado por IA tiene vulnerabilidades | Ninguna herramienta existente detecta patrones de amenazas específicos de IA |
Fuente: GitLab 2025 Global DevSecOps Report
AgentFlow Auditor — Cuatro agentes de IA que detectan riesgos de seguridad que el SAST tradicional pasa por alto en código generado por IA. 41 reglas de detección que incluyen inyección de prompts de LLM, salida a ejecución, deserialización insegura, inyección SQL, SSRF y path traversal. Publica informes escaneables, genera parches de corrección, rastrea la deriva de riesgos. Una sola @mención lo activa todo.
Developer opens MR │ ▼ @duo-agentflow-auditor review this MR │ ▼ ┌───────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │ Scanner │──────▶│ Reporter │ │ │ │ Agent │ │ Agent │ │ │ │ │ │ │ │ │ │ Read diffs │ │ Grade risk │ │ │ │ Match 34 │ │ Risk heatmap │ │ │ │ rules │ │ Post MR comment │ │ │ │ Score risk │ │ Create issue │ │ │ └─────────────┘ └────────┬─────────┘ │ │ │ │ │ ┌───────┴────────┐ │ │ │ SAFE? │ │ │ │ ├─ Yes ──────────────┐ │ │ │ └─ No ───┐ │ │ │ │ └───────────┘ │ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌────────▼───────┘┐ │ │ │ │ Metrics │◀──────│ Fixer │ │ │ │ │ Agent │ │ Agent │ │ │ │ │ │◀──────────────────────────────┘ │ │ │ Baseline │ │ Confidence-scored│ │ │ │ Cross-MR │ │ patches │ │ │ │ Green │ │ Fix branch + MR │ │ │ │ Posture │ │ │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ GitLab Duo Agent Platform (ambient) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ External SAST Agent (CI/CD container) │ │ │ │ bandit + semgrep + custom rules merge │ │ │ └───────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
### Agent Roster
| Agente | Rol | Herramientas | Capacidad clave |
|:------|:-----|:------|:---------------|
| **Scanner** | Analizar diffs de MR | 10 herramientas | 41 reglas (26 regex + 15 Semgrep), detección específica de IA, integración de vulnerabilidades |
| **Reporter** | Publicar informes de auditoría | 7 herramientas | Escaneable en 10s (calificación + mapa de calor + top 5), vinculación de vulnerabilidades, creación automática de incidencias en DANGER |
| **Fixer** | Generar correcciones de código | 8 herramientas | Parches con puntuación de confianza (HIGH/MEDIUM/LOW), creación automática de MR de corrección |
| **Metrics** | Rastrear línea base de riesgos | 6 herramientas | Aprendizaje entre MRs, postura del equipo, deriva de la línea base, seguimiento de energía/carbono |
| **SAST Scanner** | SAST externo | CI/CD | Ejecuta bandit + semgrep, fusiona con reglas personalizadas mediante script Python |
---
## Características
<table>
<tr>
<td width="50%">
### Escaneo de seguridad
- **41 Reglas de detección** — 26 regex + 15 reglas personalizadas de Semgrep
- **8 Categorías de riesgo** — Desde comandos destructivos hasta inyección de prompts
- **Detección específica de IA** — Inyección de prompts en LLM, salida a ejecución, deserialización insegura
- **Puntuación de riesgo** — 0-100 por hallazgo (gravedad x contexto x categoría)
- **Sistema de calificación** — SAFE / WARNING / DANGER
</td>
<td width="50%">
### Automatización
- **Activación con un solo disparador** — `@mencionar` o asignar revisor
- **Enrutamiento condicional** — Los escaneos SAFE omiten el fixer, ahorrando tokens
- **Comentarios de MR estructurados** — Tablas de riesgo, sugerencias de corrección, detalles plegables
- **Generación automática de correcciones** — Parches de código en una nueva rama
- **Creación de incidencias** — Automática en calificación DANGER
</td>
</tr>
<tr>
<td width="50%">
### Seguimiento de línea base
- **Detección de deriva de riesgos** — Comparar escaneos a lo largo del tiempo
- **Análisis de tendencias** — Mejorando / degradando / estable
- **Tasa de adopción de correcciones** — Rastrear cuántas sugerencias se aplicaron
- **Registro histórico** — Anexo JSONL por escaneo
</td>
<td width="50%">
### Métricas verdes
- **Seguimiento de tokens** — Uso por escaneo
- **Estimación de energía** — kWh por escaneo
- **Huella de carbono** — kg CO2 con analogías del mundo real
- **Sugerencias de optimización** — Reducir alcance del escaneo, almacenar en caché las líneas base
</td>
</tr>
</table>
---
## Categorías de detección
### Reglas personalizadas de Semgrep
15 reglas de Semgrep de nivel de producción en 6 categorías:
| Regla | Categoría | Gravedad | Detección |
|:-----|:---------|:---------|:----------|
| `llm-prompt-injection` | Seguridad IA | WARNING | Entrada de usuario fluyendo hacia llamadas a API de LLM |
| `llm-output-code-exec` | Seguridad IA | ERROR | Salida de LLM pasada a exec/eval |
| `unsafe-deserialization-ml` | Seguridad IA | WARNING | pickle.load, torch.load en modelos no confiables |
| `sql-injection` | Seguridad Web | ERROR | Consultas SQL con formato de cadena (f-string, .format, concat) |
| `path-traversal` | Seguridad Web | ERROR | Entrada de usuario en operaciones de ruta de archivo (recorrido ../) |
| `ssrf-request-forgery` | Seguridad Web | ERROR | URLs controladas por usuario en solicitudes HTTP |
| `open-redirect` | Seguridad Web | WARNING | Entrada de usuario en funciones de redirección |
| `missing-input-validation` | Seguridad Web | WARNING | Datos de solicitud utilizados sin validación de esquema |
| `dangerous-eval-exec` | Python | WARNING | eval/exec con contenido dinámico |
| `subprocess-shell-true` | Python | WARNING | subprocess con shell=True |
| `dangerous-os-system` | Python | WARNING | os.system/popen (obsoleto) |
| `insecure-random-python` | Cripto | WARNING | módulo random para tokens de seguridad |
| `insecure-random-javascript` | Cripto | WARNING | Math.random() para tokens de seguridad |
| `hardcoded-credentials` | Secretos | WARNING | Contraseñas, claves API, tokens codificados |
| `insecure-http` | Red | INFO | URLs HTTP (con corrección automática a HTTPS) |
### Categorías de detección por regex
| Categoría | Gravedad | Patrones de ejemplo |
|:---------|:---------|:-----------------|
| Comandos destructivos | 🚨 Danger | `rm -rf /`, `mkfs`, `dd to disk` |
| Exfiltración de credenciales | 🚨 Danger | `curl` publicando secretos a URLs externas |
| Inyección de prompts (grave) | 🚨 Danger | "Ignorar instrucciones anteriores", anulaciones de roles |
| Ejecución ofuscada | 🚨 Danger | `base64 -d \| bash`, tubería remota al shell |
| Ejecución de shell | ⚠️ Warning | `shell=True`, `eval()`, `exec()`, `os.system()` |
| Llamadas de red | ⚠️ Warning | `curl`/`wget`/`fetch` a URLs externas |
| Transporte inseguro | ⚠️ Warning | `http://` donde debería usarse `https://` |
| Credenciales codificadas | ⚠️ Warning | Contraseñas, claves API, tokens en el código fuente |
### Fórmula de puntuación de riesgo```
score = severity_weight + category_weight + executable_context + actionable + risk_modifier
= clamp(0, 100)
severity_weight: danger=50, warning=25
category_weight: destructive-command=15, credential-exfil=15, prompt-injection=10, ...
executable_context: +20 if file is .sh/.py/.js/.ts
actionable: +15 if executable AND not in trusted domain allowlist
risk_modifier: per-rule adjustment (0-15)
| Grado | Condición | Acción |
|---|---|---|
| 🚨 PELIGRO | max_risk >= 90 OR high_risk_findings >= 3 | Bloquear merge + crear issue |
| ⚠️ ADVERTENCIA | max_risk >= 70 OR high_risk_findings >= 1 | Revisar antes del merge |
| ✅ SEGURO | Sin señal de riesgo significativa | Seguro para hacer merge |
git clone https://gitlab.com/centisgood/duo-agentflow-auditor.git cd duo-agentflow-auditor
> 📖 Guía completa de duplicación (3 métodos, configuración de CI, estrategias de sincronización): [`docs/GITLAB_MIRROR_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/GITLAB_MIRROR_GUIDE.md)
### 2. Agentes y flujos publicados automáticamente
El grupo del hackathon aplica un [pipeline central de CI](https://gitlab.com/gitlab-ai-hackathon/ci) mediante [política de seguridad](https://gitlab.com/gitlab-ai-hackathon/security-policies). Cuando haces push a GitLab, el trabajo `catalog-sync` **automáticamente** publica todos los `agents/*.yml` y `flows/*.yml` en el Catálogo de IA — sin necesidad de configuración manual ni etiquetas git.
> El `.gitlab-ci.yml` de tu proyecto se sobrescribe con el pipeline central del hackathon. El `.gitlab-ci.yml` incluido solo sirve como referencia.
| # | Agente | Archivo de catálogo | Documentos de prompt | Herramientas |
|---|--------|---------------------|----------------------|--------------|
| 1 | Scanner | [`agents/scanner.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/scanner.yml) | [`agents/scanner.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/scanner.md) | 8 herramientas |
| 2 | Reporter | [`agents/reporter.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/reporter.yml) | [`agents/reporter.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/reporter.md) | 6 herramientas |
| 3 | Fixer | [`agents/fixer.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/fixer.yml) | [`agents/fixer.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/fixer.md) | 8 herramientas |
| 4 | Metrics | [`agents/metrics.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/metrics.yml) | [`agents/metrics.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/agents/metrics.md) | 5 herramientas |
Flujo: [`flows/security-audit.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/flows/security-audit.yml) — pipeline de 4 agentes con enrutamiento Scanner → Reporter → Fixer → Metrics.
<details>
<summary>Alternativa: Configuración manual mediante la interfaz de GitLab</summary>
**Agentes**: Automatización → Agentes → Nuevo agente → pegar el prompt del sistema desde los archivos `.md`
**Flujo**: Automatización → Flujos → Nuevo flujo → pegar la definición desde [`flows/security-audit.yml`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/flows/security-audit.yml)
</details>
### 3. Habilitar desencadenantes
| Desencadenante | Cómo |
|----------------|------|
| Mencionar | Comenta `@duo-agentflow-auditor` en cualquier MR |
| Asignar revisor | Asignar la cuenta de servicio como revisor del MR |
### 4. Pruébalo```bash
# Create test branch with vulnerable code
git checkout -b test/security-audit
cp examples/vulnerable-mr/* .
git add . && git commit -m "test: add vulnerable code for audit"
git push origin test/security-audit
# Open MR → Comment: @duo-agentflow-auditor please review this MR
Guía detallada: Ver
docs/SETUP_GUIDE.md
Grade: 🚨 DANGER Recommendation: FAIL — do not merge without fixes
| Risk | File | Findings | Max Score |
|---|---|---|---|
| 🟥🟥🟥🟥🟥 | unsafe_script.py | 5 | 95 |
| 🟥🟥🟥🟧⬜ | risky_config.yaml | 3 | 78 |
| 🟧🟧⬜⬜⬜ | insecure_fetch.js | 2 | 62 |
🚨 unsafe_script.py:55 — rm -rf (95/100) 🚨 unsafe_script.py:13 — shell=True (88/100) 🚨 unsafe_script.py:27 — eval() (85/100) ⚠️ insecure_fetch.js:41 — HTTP (62/100)
### Métricas Verdes```markdown
### 🌱 Sustainability Report
| Metric | Value |
|---------------------|---------------------|
| Tokens Used | 12,450 |
| Energy | 0.0037 kWh |
| CO₂ Footprint | 0.0014 kg |
| Efficiency | 2.4 findings/1K tok |
💡 LED bulb for 13 seconds | 🚗 Car driving 5.6 meters
duo-agentflow-auditor/ │ ├── agents/ │ ├── scanner.yml # Catalog agent — security scanner │ ├── reporter.yml # Catalog agent — report generator │ ├── fixer.yml # Catalog agent — auto-fix patches │ ├── metrics.yml # Catalog agent — green metrics │ ├── scanner.md # Detailed prompt documentation │ ├── reporter.md # Detailed prompt documentation │ ├── fixer.md # Detailed prompt documentation │ └── metrics.md # Detailed prompt documentation │ ├── flows/ │ └── security-audit.yml # Catalog flow — conditional routing pipeline │ ├── scripts/ │ ├── merge_sast_results.py # SAST result merger (bandit + semgrep + custom rules) │ └── demo.sh # E2E demo automation (glab CLI) │ ├── tests/ │ └── test_merge_sast_results.py # 76 pytest tests — scoring, grading, parsing │ ├── .gitlab/ │ └── duo/ │ └── flows/ │ └── sast-scanner.yaml # External SAST agent (CI/CD container) │ ├── rules/ │ ├── danger_rules.json # 11 high-severity detection patterns │ ├── warning_rules.json # 15 medium-severity detection patterns │ └── semgrep/ # 15 Semgrep custom rules │ ├── ai-security/ # LLM prompt injection, output exec, unsafe deser │ ├── web-security/ # SQL injection, path traversal, SSRF, open redirect, input validation │ ├── python-security/ # eval/exec, subprocess, os.system │ ├── crypto/ # Insecure random (Python + JavaScript) │ ├── secrets/ # Hardcoded credentials │ └── network/ # Insecure HTTP (with autofix) │ ├── Dockerfile # Production SAST container (python:3.11-slim) ├── requirements.txt # bandit + semgrep dependencies │ ├── examples/ │ ├── vulnerable-mr/ # Intentionally risky code (demo) │ │ ├── unsafe_script.py # shell=True, eval(), rm -rf, cred leak │ │ ├── risky_config.yaml # Prompt injection, hardcoded secrets │ │ └── insecure_fetch.js # HTTP, exec(), token exposure │ └── safe-mr/ # Secure code for contrast (demo) │ ├── safe_script.py │ ├── safe_config.yaml │ └── safe_script.js # HTTPS, execFile, env vars │ ├── docs/ │ ├── SETUP_GUIDE.md # Step-by-step setup │ ├── EXECUTION_PLAN.md # Implementation plan │ ├── WOW_MOMENTS.md # Visual impact & demo choreography │ ├── DEVPOST_SUBMISSION.md # Devpost submission draft │ └── GITLAB_MIRROR_GUIDE.md # GitHub → GitLab mirroring │ ├── .gitlab-ci.yml # CI — catalog-sync + validation ├── AGENTS.md # Project-level agent customization ├── IMPLEMENTATION.md # Architecture & design document ├── CONTRIBUTING.md # Contribution guidelines ├── LICENSE # MIT License └── README.md # This file
---
## Tecnología
| Componente | Tecnología |
|:----------|:-----------|
| **Plataforma** | Plataforma de Agente GitLab Duo (GA en GitLab 18.8) |
| **Modelo de IA** | Anthropic Claude Sonnet |
| **Esquema de Flujo** | Flow Registry v1 (`ambient` entorno) |
| **Disparadores** | Mencionar, Asignar, Asignar Revisor |
| **Herramientas del Agente** | Más de 30 herramientas integradas de GitLab en 4 agentes (incluye vinculación de vulnerabilidades) |
| **Detección** | 41 reglas: 26 regex + 15 Semgrep (seguridad de IA, seguridad web, criptografía, secretos, red) |
| **SAST Externo** | Canalización dockerizada de bandit + semgrep con fusionador de resultados |
| **Pruebas** | 76 pruebas pytest que cubren puntuación, calificación y análisis |
| **Salida** | Comentarios MR en Markdown, Issues de GitLab, MRs de corrección |
---
## Documentación
| Documento | Descripción |
|:---------|:-----------|
| [`IMPLEMENTATION.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/IMPLEMENTATION.md) | Arquitectura, fórmula de puntuación, script de demostración, alineación de evaluación |
| [`docs/SETUP_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/SETUP_GUIDE.md) | Guía paso a paso en 7 pasos con solución de problemas |
| [`docs/EXECUTION_PLAN.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/EXECUTION_PLAN.md) | Plan de 6 fases con aproximadamente 35 tareas detalladas |
| [`docs/WOW_MOMENTS.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/WOW_MOMENTS.md) | Diseño de impacto visual y coreografía de demostración |
| [`docs/DEVPOST_SUBMISSION.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/DEVPOST_SUBMISSION.md) | Texto del formulario de envío copiar y pegar |
| [`AGENTS.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/AGENTS.md) | Personalización de escaneo a nivel de proyecto |
| [`docs/GITLAB_MIRROR_GUIDE.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/docs/GITLAB_MIRROR_GUIDE.md) | Reflejo de GitHub a GitLab (3 métodos) |
| [`CONTRIBUTING.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/CONTRIBUTING.md) | Cómo contribuir |
---
## Pruebas```bash
# Run the full test suite (76 tests)
python -m pytest tests/ -v
# Run with coverage
python -m pytest tests/ --cov=scripts --cov-report=term-missing
Las pruebas cubren: JSON loading, rule parsing, severity/category normalization, risk scoring formula, grade classification, bandit/semgrep output parsing, finding deduplication, and the CLI entry point.
scripts/demo.sh
scripts/demo.sh --gitlab-remote origin
scripts/demo.sh --cleanup
El script de demostración crea un MR de prueba con código vulnerable, activa el auditor mediante `@mention` y consulta los resultados.
---
## Contribución
Consulte [`CONTRIBUTING.md`](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/CONTRIBUTING.md) para obtener directrices.
**Resumen rápido:**
1. Haz un fork del repositorio
2. Crea una rama de funcionalidad (`git checkout -b feature/amazing`)
3. Haz commit de los cambios (`git commit -m 'feat: add amazing feature'`)
4. Sube a la rama (`git push origin feature/amazing`)
5. Abre un Merge Request
---
## La paradoja de la IA — Por qué esto es importante
<div align="center">
| Sin AgentFlow Auditor | Con AgentFlow Auditor |
|:--------------------------|:----------------------|
| El MR espera 2+ días para revisión | **45 segundos** para auditoría completa |
| SAST omite riesgos específicos de IA | **41 reglas** incl. 3 específicas de IA + 7 amenazas de seguridad web |
| Sin sugerencias de corrección | **Parches con puntuación de confianza** (ALTA/MEDIA/BAJA) |
| Los escaneos SAFE desperdician tokens de reparación | **Enrutamiento condicional** omite el reparador |
| Sin seguimiento a lo largo del tiempo | **Aprendizaje entre MRs** + postura del equipo |
| Sin conciencia energética | **Métricas verdes** por escaneo |
</div>
---
## Licencia
Este proyecto tiene licencia [MIT](https://gitlab.com/centisgood/duo-agentflow-auditor/-/blob/main/LICENSE).
---
<div align="center">
**Un disparador. Cuatro agentes. Cero puntos ciegos de IA.**
Construido con [GitLab Duo Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/) y [Anthropic Claude](https://www.anthropic.com/)
</div>