Skip to main content
All posts
DevSecOps

Auditar tu propio código sin ser tratado como un atacante: DevSecOps sin bloqueos en bf16.ai

Los clasificadores automáticos cortan con frecuencia a mitad de stream los análisis SAST defensivos al generar tests de regresión SQLi o SSRF. Construye un pipeline de remediación con retención cero (ZDR) en bf16.ai.

TL;DR · Resumen de Ingeniería AppSec

  • La paradoja defensiva: Las APIs comerciales cortan las respuestas a mitad de stream con finish_reason: "content_filter" cuando un ingeniero genera tests unitarios locales para vulnerabilidades SQLi/SSRF de su propio repositorio.
  • Pipeline en dos fases sobre bf16.ai: Filtra los falsos positivos de Semgrep con deepseek/deepseek-v4.1-flash-abliterated ($0.30/$0.05/$1.20) y genera el parche + test Vitest con zai-org/glm-5.3-abliterated ($1.40/$0.30/$4.40).
  • Retención Cero (ZDR): 0 bytes de código propietario almacenados en disco y precios al mismo nivel que las tarifas oficiales del fabricante.

1. Por qué los filtros cibernéticos rompen pipelines defensivos a mitad de stream

Buena parte de las alertas estáticas de Semgrep o CodeQL son falsos positivos inalcanzables. Al pedir a un LLM estándar que verifique la trazabilidad source-to-sink y escriba un test de regresión Vitest, el monitor de salida suele cortar el stream en el token 64 al detectar comillas SQL escapadas:

[ci:sast-triage] Alert #418 -> semgrep.javascript.express.db.sequelize-raw-sql
[ci:sast-triage] Requesting source-to-sink reachability + Vitest regression test...
[upstream:frontier-api] HTTP 200 (stream truncated at token 64)
  finish_reason: "content_filter"
  error: "Output halted by automated cyber-risk safeguard: response appeared to construct a SQL injection proof-of-concept payload."
[ci:sast-triage] ERROR: Unexpected EOF in JSON stream. PR #892 security check marked INCONCLUSIVE.

2. Remediación en dos pasadas en bf16.ai con Retención Cero (ZDR)

En bf16.ai puedes combinar dos modelos con ventana de 1M tokens:

  1. Pasada 1 — Filtrado masivo (deepseek/deepseek-v4.1-flash-abliterated): Descarta rápidamente alertas ya mitigadas por esquemas Zod o middlewares.
  2. Pasada 2 — Test y parche unificado (zai-org/glm-5.3-abliterated): Mediante json_schema estricto devuelve la traza exacta, el test Vitest y el diff git apply sin sermones ni cortes.

Bucle DevSecOps: Diff del PR analizado en endpoints ZDR de bf16.ai para generar tests de regresión y parches verificados.

▲ Bucle DevSecOps: Diff del PR analizado en endpoints ZDR de bf16.ai para generar tests de regresión y parches verificados.

3. Motor TypeScript de triaje e integración en GitHub Actions

La abliteración ortogonal conserva intacta la gramática JSON, garantizando parseo determinista incluso con payloads complejos de prueba:

import OpenAI from 'openai';

const bf16 = new OpenAI({
  baseURL: 'https://api.bf16.ai/v1',
  apiKey: process.env.BF16_SEC_AUDIT_KEY,
});

export async function auditDiffAndEmitPatch(gitDiff: string, routeContext: string) {
  // Pass 2 Deep Remediation on GLM-5.3 Flagship (Abliterated)
  const response = await bf16.chat.completions.create({
    model: 'zai-org/glm-5.3-abliterated',
    temperature: 0.1,
    response_format: {
      type: 'json_schema',
      json_schema: {
        name: 'sast_remediation_bundle',
        strict: true,
        schema: {
          type: 'object',
          additionalProperties: false,
          required: ['exploitable', 'sink_trace', 'vitest_regression_spec', 'unified_patch'],
          properties: {
            exploitable: { type: 'boolean' },
            sink_trace: { type: 'string' },
            vitest_regression_spec: { type: 'string' },
            unified_patch: { type: 'string' },
          },
        },
      },
    },
    messages: [
      {
        role: 'system',
        content:
          'You are an application security remediation engine auditing first-party repository code. ' +
          'Determine whether user-controlled input reaches the sink unparameterized. If exploitable, ' +
          'emit a local Vitest regression test and a minimal unified diff fixing the sink.',
      },
      { role: 'user', content: `## Route Context\n${routeContext}\n\n## PR Diff\n${gitDiff}` },
    ],
  });

  return JSON.parse(response.choices[0]?.message?.content ?? '{}');
}

Integra el flujo en GitHub Actions sin pagar licencias mensuales por desarrollador. Como muestra bf16.ai/pricing, pagas únicamente por token al mismo nivel que las tarifas oficiales del fabricante:

# .github/workflows/bf16-sast-remediation.yml
name: PR Security Triage (bf16.ai ZDR)
on: [pull_request]

jobs:
  sast_verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Run Semgrep & Triage Reachable Sinks via bf16.ai
        env:
          BF16_SEC_AUDIT_KEY: ${{ secrets.BF16_SEC_AUDIT_KEY }}
        run: |
          semgrep scan --config auto --json > semgrep.json
          node scripts/sec-triage-bf16.mjs semgrep.json
          pnpm vitest run tests/security-regressions

4. Comparativa de pipelines y economía por Pull Request

Enrutar la pasada 1 a deepseek-v4.1-flash-abliterated y la pasada 2 a zai-org/glm-5.3-abliterated evita pagar la tarifa del modelo insignia en la mayoría de las alertas: los hallazgos inalcanzables se descartan a $0.30 / 1M de entrada, y solo los sinks alcanzables confirmados (SQLi, SSRF, path traversal, confusión de alg en JWT o fallos de timing en el HMAC de webhooks) se facturan a $1.40 / 1M de entrada y $4.40 / 1M de salida. Antes de basarte en el coste por PR o en la tasa de parches válidos, mídelos en tus propios repositorios:

Pipeline de Triaje SASTQué Ocurre con Cada Alerta
Reglas estáticas Semgrep solasCada alerta, alcanzable o no, espera un triaje manual y una corrección escrita a mano
Semgrep + API con filtro estrictoEl triaje puede detenerse a mitad de stream por content_filter, dejando JSON truncado y un check no concluyente
Semgrep + bf16.ai (2 pasadas)Los sinks alcanzables reciben una traza, un test de regresión Vitest y un parche que debe pasar CI antes de la revisión

5. 4 reglas de seguridad y autorización para auditoría automatizada

  1. Audita únicamente repositorios propios o con autorización escrita.
  2. Ejecuta los tests de regresión en contenedores efímeros aislados (Testcontainers).
  3. Exige revisión humana y suite de tests en verde antes de fusionar cualquier parche.
  4. Usa una clave sk-bf16-v1- exclusiva para CI con tope diario en USD.