Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 15:22
· 28 commits to main since this release

Added

  • Network data-flow fields (flowsh/v3, effect-ir/v2). The report now
    asserts two network data flows so a consumer can key on the flow rather than
    infer it from the co-occurrence of a NetEgress and a sink:
    score.cradleFlows (network content reaching code execution — curl … | sh,
    source <(curl …), sh -c "$(curl …)"; a download-then-execute chain is not
    currently asserted, because no frontend establishes that flow) and
    score.ingestFlows (a download client writing fetched content to a file —
    curl -o/-O, wget default/-O). The sink is marked by the additive
    effect-level netFlow role (cradle on a CodeExec, ingest on an
    FSWrite), which bumps the effect IR to effect-ir/v2; a program with no
    network flow serialises byte-for-byte as before. DetectCradleFlows /
    DetectIngestFlows live in engine/taint.go, the binder marks the curl/wget
    output parameters (and synthesises wget's implicit download), and the bash
    frontend marks a code-execution sink fed by network content. VCS sync (git clone/fetch/pull) is never an ingest. The CLI envelope tag moves to
    flowsh/v3.

  • PowerShell abstract variable state (Σ). The PowerShell frontend now
    interprets a script through its own bounded abstract variable state Σ
    instead of lowering raw parse-tree text, mirroring the bash frontend at the
    frontend's own layer (front/ps/state.go, front/ps/wordeval.go, and a
    structured-control-flow front/ps/parse.go). Fabricated literal targets are
    gone — $dir/file.txt no longer lands as a confidently-Certain concrete
    path: an effect target is the evaluated value when the word is known and ⊤
    otherwise, a URL with a literal host prefix keeps a host-scoped egress
    instead of widening to ⊤, and a word's provenance (including secret)
    flows onto the egress effect so exfiltration pairs on real per-command
    dataflow rather than a program-level co-occurrence heuristic. Unset reads
    degrade to ⊤ (never the empty string), if/foreach/for/while/do/
    try fork and join Σ per branch, session-state cmdlets (Set-Location,
    Set-Variable, Clear-Variable, …) update Σ, @{…} splat literals expand
    to their parameter bindings, and lowering is bounded by a deterministic step
    counter that unwinds to ⊤. See
    ADR-0014.