Nothing here yet.
Nothing here yet.
Completely agree on the validation layer and I think the baked-in approach is the right long-term answer. Separate CI/CD gates are better than nothing, but by the time a vulnerable dependency hits your pipeline you've already generated code around it. Catching it at the AI tool layer means the suggestion never lands in the first place. Here's what I've been thinking about for the Nix side of this, since I wrote the post. Scanning for CVEs using store hashes My idea is to use the Nix store hash directly as the lookup key rather than just the version string. The store path format is /nix/store/<32-char-hash>-<name>-<version>/ that hash is a cryptographic fingerprint of the exact bytes in the package. So instead of asking "is litellm 1.82.6 vulnerable?", you ask "is this specific build of litellm 1.82.6 the one that hashes to r8vvq9kq... on a known-bad list?" A patched build and a backdoored build of the same version produce different hashes. They can be tracked and blocked independently. The workflow I'm proposing: # Dump your full system closure with store hashes nix path-info --recursive /run/current-system \ | grep -oP '(?<=/nix/store/)[a-z0-9]+-[^/]+' \ | sort -u # Pipe that into an OSV query, or use vulnix for NVD lookups vulnix --system You maintain a blocklist of known-compromised store hashes. Any derivation that would produce a hash on that list fails at build time before the code ever runs. This is something no pip-based toolchain can replicate because version strings are mutable. The Nix hash isn't. Baking it into AI tools My suggestion for making this native to AI coding tools rather than a post-hoc CI step: Give the AI a vulnerability-check tool via MCP or function calling that it queries before recommending any package. The model calls check_osv("litellm", "1.82.8") before generating the pip install line if there's a hit, it surfaces the CVE inline and suggests a safe version instead. The AI becomes the first gate, not the last. For Nix specifically, I'd push for a meta.knownVulnerabilities field in nixpkgs derivations the package definition itself carries the signal. AI tools that read nixpkgs metadata would inherit this automatically without any separate scanning step. Pre-commit hooks on flake changes are a low-friction middle ground right now: # Runs vulnix on any flake.nix or flake.lock change, whether a human or agent made it - id: vulnix-check name: CVE scan on flake changes entry: vulnix --system files: '(flake\.nix|flake\.lock)$' Rolling back safely with agenix / sops-nix This is where I think Nix has the cleanest story of any package manager. Rollback is a git operation: # Find the last clean flake.lock git log --oneline flake.lock # Restore it git checkout <safe-commit> -- flake.lock # Or jump straight to a previous NixOS generation nixos-rebuild switch --rollback The critical part is what happens to secrets after a potential exfiltration. My recommendation is to treat the package rollback and the credential rotation as two separate, auditable git commits you want a clear record of when each happened. With agenix: # Re-encrypt with a new secret value agenix -e secrets/openai-api-key.age agenix -e secrets/aws-credentials.age # Commit rollback + rotated secrets together git add flake.lock secrets/ git commit -m "rollback to pre-1.82.7, rotate exposed credentials" nixos-rebuild switch With sops-nix: # Rotate the data encryption key, then update the values sops --rotate --in-place secrets/credentials.yaml sops secrets/credentials.yaml # edit new values in-place git add flake.lock secrets/credentials.yaml git commit -m "rollback vulnerable package, rotate via sops" nixos-rebuild switch The thing that makes this genuinely different from rotating credentials on a traditional system: you're rolling back to a cryptographic commitment, not just an earlier apt/pip state. The LiteLLM backdoor the systemd user service polling for instructions survives pip uninstall. It does not survive a Nix generation rollback to a state where it was never installed. When you rotate your keys into that environment, you're rotating into something you can actually verify is clean. That's the combination I'd argue for: hash-based CVE scanning to catch problems early, AI-layer validation to prevent them from being suggested in the first place, and declarative rollback + secrets rotation to recover cleanly when something does get through.