Ir al contenido principal

Guía

Exportar SARIF desde un escaneo SAST sin conexión

SARIF es el formato que GitHub, GitLab y la mayoría de los paneles de seguridad CI esperan. Aquí está exactamente cómo StaticCodeAudit lo genera, qué contiene el archivo, y cómo conectarlo a GitHub Code Scanning — sin subir ni una sola línea de código fuente a ningún sitio.

SARIF en un párrafo

SARIF (Static Analysis Results Interchange Format) es un estándar OASIS — actualmente versión 2.1.0 — para representar la salida de herramientas de análisis estático en un único esquema JSON. En lugar de que cada escáner invente su propio formato de informe, las herramientas que hablan SARIF se conectan directamente a GitHub Code Scanning, GitLab SAST, Azure DevOps y la mayoría de paneles de seguridad, sin parser propio. Agrupa los hallazgos bajo un array tool.driver.rules (metadatos de reglas) y un array results (cada hallazgo: ID de regla, severidad, archivo, línea, mensaje).

Generar el informe

Un solo flag, ejecutable desde cualquier runner CI o su propia máquina:

./staticcodeaudit-linux-x86_64 /path/to/project --sarif --fail-on-high

Esto escribe dos archivos junto al informe HTML habitual: un archivo SCA-SARIF-<timestamp>.sarif y el SCA-REPORT-<timestamp>.html de siempre — la exportación SARIF es aditiva, sigue obteniendo el informe legible. --fail-on-high es opcional pero es lo que hace que el paso realmente bloquee un pipeline: el proceso termina con código 1 en cuanto hay un hallazgo de severidad HIGH, 0 en caso contrario.

Qué contiene realmente el archivo

Un ejemplo real recortado — un hallazgo, producido al escanear un fragmento vulnerable de dos líneas:

{
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json",
  "version": "2.1.0",
  "runs": [{
    "tool": {
      "driver": {
        "name": "StaticCodeAudit",
        "version": "1.0.0",
        "informationUri": "https://codefixture.com",
        "rules": [{
          "id": "hardcoded_secret",
          "name": "Hardcoded secret",
          "fullDescription": { "text": "Plain text secrets in code can be exposed via Git repository." },
          "defaultConfiguration": { "level": "error" }
        }]
      }
    },
    "results": [{
      "ruleId": "hardcoded_secret",
      "level": "error",
      "message": { "text": "Plain text secrets in code can be exposed via Git repository." },
      "locations": [{
        "physicalLocation": {
          "artifactLocation": { "uri": "app.py" },
          "region": { "startLine": 6 }
        }
      }],
      "fixes": [{ "description": { "text": "Use environment variables or system_configs in database." } }]
    }]
  }]
}

Cada result lleva una ruta de archivo, un número de línea, y — cuando se conoce una remediación — una entrada fixes con una sugerencia en lenguaje claro. GitHub Code Scanning renderiza todo esto directamente en la pestaña Security, anotado en la línea exacta en la vista diff.

SARIF o SBOM — nunca ambos en la misma ejecución

StaticCodeAudit también exporta un inventario de dependencias como SBOM CycloneDX 1.5 (--sbom), pero ambas exportaciones son mutuamente excluyentes por ejecución — responden preguntas distintas (vulnerabilidades encontradas vs. dependencias existentes) y mezclarlas en un solo archivo dificultaría el consumo correcto de ambas. Pedir las dos a la vez falla de inmediato:

$ ./staticcodeaudit-linux-x86_64 /path/to/project --sarif --sbom
❌ --sarif and --sbom are mutually exclusive. Use one or the other.

Ejecute el escaneo dos veces en CI si necesita ambos artefactos — cada ejecución tarda bastante menos de un segundo en una base de código pequeña a mediana. Vea la guía de exportación SBOM para el lado de inventario de dependencias.

Conectarlo a GitHub Code Scanning

La acción oficial de GitHub upload-sarif lee cualquier archivo SARIF 2.1.0, sin importar qué herramienta lo produjo. Un paso de workflow mínimo:

- name: Run StaticCodeAudit
  run: ./staticcodeaudit-linux-x86_64 /path/to/project --sarif --fail-on-high

- name: Upload SARIF to GitHub Code Scanning
  if: always()
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: docs/audit-reports/*.sarif

if: always() importa aquí: sin él, un hallazgo HIGH (que hace que el paso anterior termine con código 1) saltaría el paso de subida y nunca vería los resultados en la pestaña Security — solo sabría que el pipeline falló, no por qué.

Disponibilidad

La exportación SARIF está incluida desde el nivel Team en adelante (Team, Team Plus, Enterprise); el nivel Solo exporta solo en HTML. Detalle completo en la página de precios.

Preguntas frecuentes

¿Generar un informe SARIF envía algo por la red?

No. El archivo SARIF se escribe en disco local, junto al informe HTML, a partir de datos ya calculados durante el escaneo local. StaticCodeAudit no realiza ninguna llamada de red saliente durante un escaneo, verificable con un monitor de red (tcpdump -i any -n) — generar un formato de exportación adicional no cambia eso.

¿Puedo usar el archivo SARIF con GitLab u otra plataforma en lugar de GitHub?

Sí — SARIF 2.1.0 es un estándar OASIS genérico, no específico de GitHub. GitLab, Azure DevOps y la mayoría de paneles de seguridad que soportan "importar SARIF" aceptan el mismo archivo sin modificación. El ejemplo anterior usa la acción upload-sarif de GitHub porque es el destino más común, no porque el formato esté ligado a ella.

¿Por qué --sarif --sbom falla en vez de producir ambos archivos?

Es una decisión de diseño explícita, no una funcionalidad ausente: un archivo SARIF describe hallazgos, un SBOM CycloneDX describe un inventario de dependencias — combinarlos en una sola exportación dificultaría el consumo correcto de ambos aguas abajo. Ejecute el escaneo dos veces (o en dos jobs CI paralelos) si su pipeline necesita ambos artefactos del mismo commit.

¿Cada hallazgo incluye una sugerencia fixes?

Solo donde StaticCodeAudit conoce un patrón de remediación para esa regla — el ejemplo anterior (hardcoded_secret) sí lo tiene, pero no todas las reglas incluyen uno todavía. Cuando falta, la entrada results igual lleva la ubicación y el mensaje completos, solo sin el campo fixes.

Pruébelo con su propio código

Abra el informe de demostración en vivo — sin instalación, sin registro — o ejecute el binario contra un proyecto pequeño e inspeccione usted mismo el archivo SARIF.

Abrir el informe en vivo Descargar el binario de demo