SAST: Análisis Estático con SonarQube
SAST (Static Application Security Testing) es el proceso automatizado de analizar el código fuente para encontrar fallos de seguridad. En HERA, nuestra herramienta principal y obligatoria para SAST es SonarQube.
URL de SonarQube: https://sonarcloud.io/
¿Qué busca SonarQube?
Sección titulada «¿Qué busca SonarQube?»SonarQube actúa como un revisor de código automatizado y experto en seguridad, buscando principalmente:
- Vulnerabilidades: Patrones de código que pueden ser explotados por atacantes (ej. SQL Injection, XSS).
- Security Hotspots: Áreas del código que son sensibles desde el punto de vista de la seguridad y que requieren una revisión manual por parte de un desarrollador.
- Bugs: Errores en el código que podrían llevar a un comportamiento inesperado.
- Code Smells: Problemas en el código que, aunque no son errores, indican un diseño pobre y dificultan el mantenimiento.
Integración en el Pipeline
Sección titulada «Integración en el Pipeline»El análisis de SonarQube es un job mandatorio del Golden Pipeline y corre en la etapa security. El equipo de producto no escribe este job en su .gitlab-ci.yml — se hereda del template vía include:.
Contrato del job sast-sonarqube
Sección titulada «Contrato del job sast-sonarqube»| Atributo | Valor |
|---|---|
| Stage | security |
| Imagen base | Sonar Scanner CLI oficial |
| Variables inyectadas | SONAR_HOST_URL, SONAR_TOKEN (CI/CD variables a nivel de grupo root) |
sonar.projectKey | Derivado automáticamente por el Golden Pipeline a partir del product-manifest.yml / service-manifest.yml; formato canónico grupoherdez_<dominio>_<producto>_<implementacion>_<repo-name> (ver Aside abajo) |
| Fuentes analizadas | Directorio src/ del repositorio |
| Espera activa al Quality Gate | Sí — sonar.qualitygate.wait=true. Si el código no pasa el Gate, el job falla y el pipeline entero se detiene |
allow_failure | false — bloqueante |
| Trigger | Automático en cada MR y en cada push a develop / main |
El parámetro de espera activa al Quality Gate es el que convierte el análisis en un bloqueo real del pipeline: sin él, el job completaría verde incluso con el código rechazado por Sonar.
El Quality Gate de HERA
Sección titulada «El Quality Gate de HERA»Un “Quality Gate” (Puerta de Calidad) es un conjunto de condiciones que tu código debe cumplir para ser considerado apto para producción.
Flujo de Trabajo del Desarrollador
Sección titulada «Flujo de Trabajo del Desarrollador»- Push de Código: Al crear un Merge Request o hacer push a
develop, el pipeline ejecuta el jobsast-sonarqube. - Análisis: SonarQube analiza el código.
- Resultado:
- Pasa: El pipeline continúa a la siguiente etapa.
- Falla: El pipeline se detiene. El desarrollador recibe una notificación.
- Revisión: El desarrollador debe ir al dashboard de SonarQube (el enlace aparece en el log del pipeline) para ver los detalles del fallo.
- Corrección: El desarrollador corrige el código, hace un nuevo
commitypush, lo que dispara un nuevo análisis. El ciclo se repite hasta que el Quality Gate pase.
Ejemplo de Remediación (SQL Injection)
Sección titulada «Ejemplo de Remediación (SQL Injection)»SonarQube resalta una vulnerabilidad como la siguiente:
// ❌ CÓDIGO VULNERABLE - Detectado por SonarQubeString query = "SELECT * FROM users WHERE id = " + userId; // userId viene de un requestStatement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Recomendación de SonarQube: “Use a prepared statement to prevent SQL Injection.”
Corrección del Desarrollador:
// ✅ CÓDIGO CORREGIDOString query = "SELECT * FROM users WHERE id = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, userId);ResultSet rs = pstmt.executeQuery();Tras subir este cambio, el re-análisis de SonarQube pasará la validación para esta vulnerabilidad.
Ejemplo de Remediación (XSS — Cross-Site Scripting)
Sección titulada «Ejemplo de Remediación (XSS — Cross-Site Scripting)»// ❌ CÓDIGO VULNERABLE - Detectado por SonarQubeapp.get('/search', (req, res) => { const query = req.query.q; res.send(`<h1>Resultados para: ${query}</h1>`);});Corrección del Desarrollador:
// ✅ CÓDIGO CORREGIDO - Sanitización de outputconst escapeHtml = require('escape-html');
app.get('/search', (req, res) => { const query = escapeHtml(req.query.q); res.send(`<h1>Resultados para: ${query}</h1>`);});Security Hotspots
Sección titulada «Security Hotspots»Los Security Hotspots no son vulnerabilidades confirmadas — son áreas del código que SonarQube identifica como potencialmente sensibles y que requieren revisión manual. Ejemplos comunes:
- Uso de algoritmos criptográficos (verificar que no sea MD5/SHA1 para passwords)
- Configuración de CORS (verificar que no esté abierto a
*) - Logging de datos de usuario (verificar que no se registren datos personales)
El desarrollador debe revisar cada Hotspot en el dashboard de SonarQube y marcarlo como Safe, Fixed o To Fix con justificación.
Lista de Verificación para Desarrolladores
Sección titulada «Lista de Verificación para Desarrolladores»Antes de solicitar merge de un MR que haya fallado por SonarQube:
- Todas las vulnerabilidades
CriticalyBlockerestán corregidas - Los Security Hotspots han sido revisados y marcados con justificación
- La cobertura de pruebas es mayor o igual al 80%
- La duplicación de código es menor al 3%
- El Quality Gate muestra estado verde en el dashboard de SonarQube