Skip to main content
All posts
DevSecOps

Eigenen Code auditieren, ohne wie ein Angreifer blockiert zu werden: DevSecOps auf bf16.ai

Automatische Cyber-Filter brechen defensive SAST-Analysen routinemäßig mitten im Stream ab, sobald SQLi- oder SSRF-Regressionstests erzeugt werden. So baust du eine zweistufige ZDR-Pipeline auf bf16.ai.

TL;DR · AppSec-Engineering im Überblick

  • Das Verteidiger-Paradoxon: Klassische APIs kappen Triage-Streams mitten in der Antwort mit finish_reason: "content_filter", wenn für eigenen Legacy-Code lokale SQLi-/SSRF-Unit-Tests generiert werden.
  • Zweistufige Pipeline auf bf16.ai: Pass 1 filtert mit deepseek/deepseek-v4.1-flash-abliterated ($0.30/$0.05/$1.20) Semgrep-Fehlalarme heraus; Pass 2 erzeugt auf zai-org/glm-5.3-abliterated ($1.40/$0.30/$4.40) strikte JSON-Regressionstests und Patches.
  • Zero-Prompt-Retention (ZDR): 0 Bytes Quellcode-Speicherung bei Herstellerpreis-Parität.

1. Warum Cyber-Safeguards defensive CI-Pipelines mitten im Stream abbrechen

Ein großer Teil aller statischen Semgrep- oder CodeQL-Funde ist im Kontext nicht erreichbar. Soll ein Standard-LLM die Source-to-Sink-Erreichbarkeit prüfen und einen lokalen Vitest-Regressionstest ausgeben, schlägt häufig der Output-Klassifikator bei Token 64 zu und hinterlässt defektes JSON:

[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. Zweistufige Source-to-Sink-Remediation auf bf16.ai (Zero Retention)

Auf bf16.ai kombinierst du dafür zwei abliterierte 1M-Kontext-Modelle:

  1. Pass 1 — Rauschfilter (deepseek/deepseek-v4.1-flash-abliterated): Sortiert durch Zod/Middleware geschützte Funde aus, deren Sinks nicht erreichbar sind.
  2. Pass 2 — Regressionstest & Patch (zai-org/glm-5.3-abliterated): Liefert per striktem json_schema den exakten Sink-Trace, den Vitest-Test und ein minimales Unified-Diff ohne Belehrungen.

DevSecOps-Loop: PR-Diff und AST-Kontext laufen über ZDR-Endpunkte auf bf16.ai zu verifizierten lokalen Patches.

▲ DevSecOps-Loop: PR-Diff und AST-Kontext laufen über ZDR-Endpunkte auf bf16.ai zu verifizierten lokalen Patches.

3. TypeScript-Triage-Engine und GitHub-Actions-Integration

Da orthogonale Abliteration die JSON-Grammatik vollständig erhält, parst jedes Antwortpaket deterministisch:

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 ?? '{}');
}

In GitHub Actions integriert entfällt jede monatliche Sitzplatzgebühr. Wie auf bf16.ai/pricing dokumentiert, zahlst du exakt nach Token-Verbrauch auf offiziellem Hersteller-Preisniveau:

# .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. Pipeline-Vergleich und Kosten pro Pull Request

Wer Pass 1 auf deepseek-v4.1-flash-abliterated und Pass 2 auf zai-org/glm-5.3-abliterated routet, zahlt für die meisten Alerts nicht den Flaggschiff-Preis: Nicht erreichbare Funde werden zu $0.30 / 1M Input aussortiert, und nur als erreichbar bestätigte Sinks (SQLi, SSRF, Path Traversal, JWT-alg-Confusion oder HMAC-Timing-Bugs in Webhooks) werden mit $1.40 / 1M Input und $4.40 / 1M Output abgerechnet. Kosten pro PR und den Anteil grüner Patches misst du am besten an deinen eigenen Repositories, bevor du dich auf eine der beiden Zahlen verlässt:

SAST-PipelineWas mit jedem Alert passiert
Reine Semgrep-RegelnJeder Alert, ob erreichbar oder nicht, wartet auf manuelle Triage und einen handgeschriebenen Fix
Semgrep + gefilterte Frontier-APIDie Triage kann mitten im Stream mit content_filter abbrechen und hinterlässt gekapptes JSON sowie einen ergebnislosen Check
Semgrep + bf16.ai (2-stufig)Erreichbare Sinks erhalten einen Trace, einen Vitest-Regressionstest und einen Patch, der vor dem Review die CI bestehen muss

5. 4 verbindliche Leitplanken für automatisierte Code-Audits

  1. Ausschließlich eigene oder schriftlich autorisierte Repositories prüfen.
  2. Generierte Regressionstests nur gegen isolierte Wegwerf-Container (Testcontainers) ausführen.
  3. Patches niemals ohne grüne Test-Suite und menschliches Code-Review mergen.
  4. Eigenen CI-Schlüssel auf bf16.ai/dashboard/keys mit täglichem USD-Limit anlegen.