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.
48 lines
1.1 KiB
YAML
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: ["*"]
|
|
...
|