unsloth/.github/dependabot.yml
Daniel Han 0879e72440 CI(security): defense-in-depth additions across 7 axes
Goes after the residual gaps from the supply-chain incident audit.
Each addition targets a real attack class that prior layers couldn't
catch:

  1. step-security/harden-runner (audit mode) on every job. eBPF
     egress firewall on the runner -- if scan_packages misses a
     payload, harden-runner's audit log records every host the
     malicious archive dialed. Audit mode initially so we observe
     the legitimate egress profile before promoting to block.

  2. Trivy filesystem scan (vuln + misconfig + secret). Hits NVD +
     GHSA + GitLab + Aqua Vuln DB and also catches Dockerfile / k8s /
     Tauri / shell IaC misconfigs that pip-audit + OSV don't see.

  3. TruffleHog secret-leak scan on PR diffs. --only-verified so we
     only flag tokens the source provider confirmed are live; runs
     base..head on PRs and full repo on push. Catches accidental API
     key commits that the Lint CI's grep-based codespell check
     cannot. checkout fetch-depth: 0 so the diff range exists.

  4. CycloneDX SBOM generation as artifact. Per-requirements file
     plus a project-level SBOM from pyproject.toml. Lets downstream
     consumers audit our wheel contents (the ML supply-chain SBOM gap
     is a known industry-wide problem; meets half of NTIA SBOM mins).

  5. GitHub Actions pinning verifier. Reports every `uses: foo@v4`
     or `@main` mutable ref. tj-actions/changed-files (Mar 2025) hit
     anyone using non-SHA pins. Currently surfaces 4 third-party
     unpinned refs (dtolnay/rust-toolchain, swatinem/rust-cache) and
     40 first-party (`actions/*`); informational baseline, tighten
     once we're ready. Dependabot's github-actions ecosystem
     auto-bumps SHA pins, so the maintenance cost is zero.

  6. Hash-pin verifier. Reports how many == specs would gain from
     `--hash=sha256:` entries. Currently 11 == pins, 0 with hash.
     Roadmap step: `uv pip compile --generate-hashes` then
     `pip install --require-hashes`. Hash-locked installs would have
     refused a republished litellm 1.82.7 even at the same version
     string.

  7. Custom Semgrep rules at .semgrep/unsloth-rules.yml. Seven rules
     for the *specific shape* of recent ML-stack CVEs we'd otherwise
     re-introduce ourselves: langchain-core deserialize-roundtrip
     (CVE-2025-68664), n8n private-pyodide-eval (CVE-2025-68668),
     marimo websocket-no-auth (CVE-2026-39987), litellm
     popen-with-network-stdin, Shai-Hulud workflow-write,
     pickle-from-network, shell=True with f-string interpolation.

dependabot.yml: extend to pip + cargo ecosystems so security
advisories on Python deps and the Tauri shell auto-generate update
PRs alongside the github-actions / bun / npm ones.

All new steps continue-on-error initially; findings land in
GITHUB_STEP_SUMMARY plus the advisory-audit-logs artifact.
2026-05-07 00:09:40 +00:00

48 lines
1.1 KiB
YAML

---
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
actions:
patterns: ["*"]
- package-ecosystem: "bun"
directory: "/studio/frontend"
schedule:
interval: "weekly"
groups:
bun-frontend:
patterns: ["*"]
- package-ecosystem: "npm"
directory: "/studio/backend/core/data_recipe/oxc-validator"
schedule:
interval: "weekly"
groups:
npm-oxc-validator:
patterns: ["*"]
# pip + cargo so security advisories on Python deps + the Tauri shell
# auto-generate PRs alongside the github-actions / bun / npm updates.
# Grouped weekly so we don't get one PR per dep; security advisories
# bypass the group and open immediately.
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
groups:
python:
patterns: ["*"]
- package-ecosystem: "cargo"
directory: "/studio/src-tauri"
schedule:
interval: "weekly"
groups:
cargo-tauri:
patterns: ["*"]
...