Skip to content

0.33.0

Choose a tag to compare

@github-actions github-actions released this 26 Sep 04:42
· 2402 commits to main since this release

Added

  • ess verify bindings reads ess-observed-bindings/2, whose optional foreign_containers
    acknowledges, per bound workload, a container or native sidecar the service does not build (a
    mesh proxy, a vendor agent) by name and nonempty reason. OBS-BIND-008 counts it as
    accounted for instead of requiring a binding that would misstate it, and the report lists it
    under the binding's acknowledged, not as a binding. An acknowledged container running a
    binding's declared image or an implementation's artifact locator, or the same @sha256: digest
    under another repository or tag, or a container artifact's identity digest, violates
    OBS-BIND-008; tags alone are not compared. An
    acknowledgement naming no observed container or native sidecar leaves OBS-BIND-008
    unknown, naming it: the infrastructure model does not record plain init containers, so it
    may name one. One naming a bound container, a workload no binding binds, a duplicate or a
    blank reason is refused before collection. ess-observed-bindings/1 is read unchanged,
    acknowledges nothing and keeps its binding digest; a /1 document carrying the key, even as
    [], is refused, and older readers refuse /2. The report is now ess-observed-bindings-report/3: it adds acknowledged, and a
    satisfied OBS-BIND-008 no longer means every entry is bound.

Security

  • A full Kubernetes scan no longer writes a digest or length of any Secret value. It used to write
    each value's unsalted SHA-256 and exact byte length, so anyone holding the observation file could
    confirm a guess of a low-entropy secret such as hunter2. The scanner now writes
    infra-observation/3, where each Secret data/stringData value is {"present": true}: the
    key name and that a value exists. The observation reader refuses anything else beside the marker
    (INFRA-SECRET-003).
  • Compiling any full observation with a Secret key, infra-observation/1 included, writes
    infra-ir/3, whose Secret keys hold the same marker and nothing derived from the value. A
    legacy /1 observation is still read; its digests are checked for shape and discarded. An IR
    without a Secret key keeps infra-ir/1 and its bytes.
  • A legacy infra-ir/1 is read with its own digest checked and then returned with each Secret
    key reduced to presence, as infra-ir/3. ess infra import kubernetes --path <legacy> --out
    writes that IR/3, and every derived document — graph source_digest, drift from/to,
    the simulation snapshot, the projection snapshot_digest and SUMMARY.md, and the
    observed-bindings observation digest — names its model digest. None of them chains to the
    legacy file's own digest any more: that digest, computed over the unsalted Secret digests, would
    confirm a guessed value beside the IR/3 written from the same file.
  • A Secret item in an observation, or a Secret block in an IR document, that does not read as its
    shape is refused with fixed text (INFRA-OBJECT-001, INFRA-IR-003). The refusal used to be
    the parser's message, which quotes the value it could not read, such as
    invalid type: string "…".

Changed

  • ess infra diff writes infra-drift/3 for full scans and no longer detects a rotated Secret
    value. For a Secret, config_content_changed names added and removed keys, and changed_keys
    is always empty, including between two legacy infra-ir/1 documents, whose digests are
    dropped when they are read. An empty list therefore means "not known"
    where infra-drift/1 meant "not rotated", hence the new version; /2 stays the namespace
    topology profile. Detecting a rotation needs a record derived from the value, and an unsalted
    digest of a low-entropy secret is a guess oracle. Configmap content changes are detected as
    before.
  • A lowering targets Entity Runtime 0.24.1: entity-core moves from 0.23.0 and
    ENTITY_RUNTIME_REVISION names 4746bd7c, the locked commit. The new starts_with and
    ends_with conditions are not emitted, so lowered definitions are unchanged apart from the
    target revision they name.