Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 08:05
· 1747 commits to main since this release
Cordon

Cordon 0.6.0

Measured at scale, then shipped: every known-malicious record caught, real lockfiles read the
way Trivy reads them, and code from a teammate or a clone checked before it lands.

   ┌──────────────────────────────────────────────────────────────────────────┐
   │  249,646 known-malicious records         100% caught, 287,899 checks     │
   │  190,274 packages in 1,687 lockfiles     99.6% agree with Trivy          │
   │  8,692 Agent Threat Rules cases          97.7% of attacks, 80.6% of      │
   │                                          evasions, 92.4% of benign clean │
   └──────────────────────────────────────────────────────────────────────────┘
  Map of this release
  ├─ Install ................ pipx · the Action · the containers
  ├─ Incoming code .......... clone and pull, scanned before they land
  ├─ Added .................. review, hosts, live MCP, workloads, intent, packs, policy
  ├─ Measured ............... the at-scale runs, and what they fixed
  └─ Verify it .............. hashes, signatures, provenance

Install

   pipx install cordon-scanner==0.6.0          or, already installed:
   pipx runpip cordon-scanner install --require-hashes -r <your pinned requirements>

   GitHub Action   uses: Threx-code/cordon/action@v0.6.0   (pin the commit SHA the tag names)
   Container       ghcr.io/threx-code/cordon:0.6.0        amd64 and arm64; pin it by digest
   Runner          ghcr.io/threx-code/cordon-runner:0.6.0
   Bitbucket pipe  ghcr.io/threx-code/cordon-bitbucket-pipe:0.6.0

Incoming code

   cordon-scanner clone URL        clone --no-checkout, scan the commit from git's objects,
                                   check out only if it passes; a blocked clone is removed
   cordon-scanner pull             fetch, scan what would be merged, merge only if it passes;
                                   a blocked pull leaves the checkout exactly as it was
   cordon-scanner guard install --global
                                   every clone and git init from now on carries post-checkout
                                   and post-merge hooks: a blocked pull, branch switch or clone
                                   is undone before anything has run it

   blocks   anything malicious; anything critical by default (--fail-on high to tighten)
   never    a cordon.yaml, policy or baseline inside the incoming code: it cannot configure
            its own check

Tutorial: 22 · Code arriving from someone else.

Added

   current advisories     unless offline, each scan first fetches what OSV published or
                          changed since the bundled intel was built, every 15 minutes at most;
                          the requests name no package; over a day old marks it incomplete
   review --base REF      what a dependency update adds, upgrades, downgrades and removes;
                          --online fetches, verifies and compares each release   (tutorial 21)
   scan --host / --home   an installed system: dpkg, apk, rpm, pacman, portage, and the
                          language packages and runtimes outside any project     (tutorial 23)
   live MCP               remote servers asked what they serve now, against what was approved
                          with agent mcp-approve                                  (tutorial 18)
   Kubernetes workloads   the images pod templates and Kustomizations run: unpinned, unsigned
   intent, offline        what agent-facing text asks for, in six languages, followed across
                          files: evasions caught 72.3% -> 80.6%
   language packs         Swift, Objective-C, Haskell, Julia, Zig, Nim, OCaml, Clojure
   release comparison     crates.io, RubyGems, NuGet, Go, Hex, pub and Maven, beside npm and PyPI
   the sandbox            RubyGems; a second install with the clock 400 days ahead
   policy                 pinned by digest; fetch-policy; policy-drift; pin bumps everywhere
                                                                                  (tutorial 24)
   images                 Wolfi, Chainguard, Arch, Gentoo; runtimes; default gems; jars

Measured

   real malware, 39,328 samples      94.2% detected; 79.7% by the code alone (0.5.x called
                                     the overall rate "content alone": corrected here)
   the same malware, GuardDog        95.2% against 85.5%, on one fixed-seed draw of 498
   every known-malicious record      249,646 records, 10 ecosystems, none missed
                                     (two were missed on the first run: a 213-character name
                                      and a 74-character version, cut short; fixed)
   container images against Syft     175 images: OS packages 99.9% the same; every package
                                     95.1% mean after stated exclusions; known gaps named
   real lockfiles against Trivy      1,687 lockfiles, 14 registries, 99.6% per package;
                                     every remaining difference sorted by cause, and most are
                                     Trivy listing what the build does not use
   found and fixed on the way        pnpm 10 lockfiles lost their whole tree · npm links named
                                     after their version · Go indirect modules left to go.sum ·
                                     Go never checked against the checksum database

The method, every table and what the numbers are not:
docs/08-ACCURACY.md.

Verify it

   wheel and sdist ... signed, SLSA build provenance; PyPI serves exactly what was uploaded
   images ............ signed keylessly with cosign, SLSA provenance, amd64 and arm64
   SBOMs ............. sbom.cdx.json and sbom.spdx.json attached below
   compared .......... the wheel scanned against 0.5.2's with --compare-with before publishing
   install by hash ... pip install --require-hashes -r action/requirements.txt  (at the v0.6.0 tag)

Every change, in full: CHANGELOG.md, 0.6.0.