Skip to main content
All posts
DevSecOps

Auditare il proprio codice senza essere trattati da attaccanti: DevSecOps su bf16.ai

I classificatori automatici troncano regolarmente le analisi SAST difensive durante la generazione di test di regressione SQLi o SSRF. Come creare una pipeline ZDR a due stadi su bf16.ai.

TL;DR · Sintesi Ingegneristica AppSec

  • Il paradosso difensivo: Le API tradizionali interrompono i flussi a metà risposta (finish_reason: "content_filter") mentre generano test unitari locali SQLi/SSRF sul tuo stesso repository.
  • Pipeline a due stadi su bf16.ai: Filtra prima i falsi positivi Semgrep con deepseek/deepseek-v4.1-flash-abliterated ($0.30/$0.05/$1.20) e genera test Vitest + patch con zai-org/glm-5.3-abliterated ($1.40/$0.30/$4.40).
  • Zero-Prompt Retention (ZDR): 0 byte di codice proprietario salvato su disco e prezzi allineati ai listini API ufficiali dei vendor.

1. Perché i filtri cyber interrompono le pipeline CI difensive a metà stream

Una buona parte degli avvisi statici di Semgrep o CodeQL rappresenta rumore non raggiungibile. Chiedendo a un LLM standard di verificare il percorso source-to-sink ed emettere un test Vitest, il monitor d’uscita spesso taglia lo stream al token 64 lasciando JSON incompleto:

[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. Rimedio in due passaggi su bf16.ai con Zero-Prompt Retention (ZDR)

Su bf16.ai puoi combinare due modelli abliterated con finestra da 1M token:

  1. Pass 1 — Filtro rapido (deepseek/deepseek-v4.1-flash-abliterated): Scarta gli avvisi già protetti da Zod o middleware.
  2. Pass 2 — Test e patch (zai-org/glm-5.3-abliterated): Con json_schema rigoroso emette traccia, test Vitest e diff git apply senza interruzioni.

Loop DevSecOps: Diff della PR analizzato su endpoint ZDR di bf16.ai per produrre test di regressione e patch verificate.

▲ Loop DevSecOps: Diff della PR analizzato su endpoint ZDR di bf16.ai per produrre test di regressione e patch verificate.

3. Motore TypeScript di triage e workflow GitHub Actions

L’abliterazione ortogonale mantiene intatta la grammatica JSON, così ogni campo viene interpretato in modo deterministico già al primo passaggio:

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 lo script in GitHub Actions senza canoni mensili per utente. Come mostrato su bf16.ai/pricing, le tariffe a consumo seguono i listini ufficiali dei vendor:

# .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. Confronto tra pipeline e costo per Pull Request

Instradare il Pass 1 su deepseek-v4.1-flash-abliterated e il Pass 2 su zai-org/glm-5.3-abliterated evita di pagare la tariffa del modello di punta sulla maggior parte degli avvisi: quelli non raggiungibili vengono scartati a $0.30 / 1M in input, e solo i sink raggiungibili confermati (SQLi, SSRF, path traversal, confusione di alg nei JWT o bug di timing HMAC nei webhook) vengono fatturati a $1.40 / 1M in input e $4.40 / 1M in output. Misura il costo per PR e il tasso di patch verdi sui tuoi repository prima di fare affidamento su questi valori:

Pipeline SASTCosa succede a ogni avviso
Solo regole statiche SemgrepOgni avviso, raggiungibile o meno, attende un triage manuale e una correzione scritta a mano
Semgrep + API con filtro rigidoIl triage può interrompersi a metà stream su content_filter, lasciando JSON troncato e un controllo non conclusivo
Semgrep + bf16.ai (2 stadi)I sink raggiungibili ricevono una traccia, un test di regressione Vitest e una patch che deve passare la CI prima della revisione

5. 4 regole di sicurezza e autorizzazione per i code audit automatici

  1. Analizza esclusivamente repository di tua proprietà o con autorizzazione scritta.
  2. Esegui i test generati solo contro container effimeri isolati (Testcontainers).
  3. Richiedi test verdi e revisione umana prima di fare merge delle patch.
  4. Usa una chiave sk-bf16-v1- dedicata alla CI con tetto giornaliero USD.