Skip to content

security: fail closed when dependency review is unavailable #76

Description

@seonghobae

Buyer-visible supply-chain gate gap

EgressWeave exact-head evidence proves a fail-open dependency-review path: the dependency comparison can be unavailable while the immutable-pinned actions/dependency-review-action step is skipped and the aggregate Security Scan still appears green. For this public-repository canary, unavailable or indeterminate dependency-diff evidence is non-passing, not an inferred clean/not-applicable result.

This is an assurance/control-plane defect, not evidence that a particular EgressWeave PR introduced a vulnerable dependency. OSV, Trivy, Scorecard, CodeQL/GHAS, Semgrep, Secret Scan, Dependabot and model reviewers remain separate controls and are not semantic substitutes for Dependency Review.

Current read-only central owner / exact identity

The organization-owned repair remains ContextualWisdomLab/.github#897fix(security): fail closed on unavailable dependency review.

Fresh read-only state:

  • protected central main: 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba;
  • #897 exact current head: 714a19818ff35cce246b6b59b9d3969783037cb0;
  • #897 is open / Ready / unmerged;
  • current formal reviews on #897: none;
  • exact-head checks are mixed rather than uniformly passing: deterministic checks including coverage-evidence and opencode-review completed successfully, while current GHAS/code-scanning evidence includes neutral/skipped results. Those states are not promoted to passing under EgressWeave evidence policy.

Historical #897 heads, including 71947d..., 8fc17de..., and 59505c1..., remain RCA/TDD/check history only. Their checks or review state do not transfer to 714a198....

Root cause and selected central remedy

The original security gate modeled a hard evidence boundary as an optional capability probe. An unavailable/non-success comparison could therefore set support false, skip the pinned action, and still leave a false-green wrapper.

The accepted repair semantics remain:

  • require the support probe's transport operation itself to succeed and require exact HTTP 200 before the pinned Dependency Review action may run;
  • fail closed on non-200, malformed/empty status, transport/TLS/timeout/partial-transfer failure, or any indeterminate result;
  • discard the untrusted response body and use finite connection/total timeouts;
  • bind source checkout and comparison to explicit immutable PR/base/head identities;
  • keep read-only/least-privilege permissions and immutable third-party action pins; and
  • preserve a negative control where a probe reports 200 but the transport command exits nonzero and therefore must still fail closed.

No EgressWeave-local workflow fork, substitute scanner, extra credential, OIDC/model authority, publisher, branch mutation, release authority, or weakened gate is an acceptable remedy.

EgressWeave acceptance impact

Current EgressWeave PRs whose Security Scan wrapper is green while the actual pinned Dependency review step is skipped remain non-passing for this gate. Do not merge them on wrapper-green evidence and do not churn clean heads merely to recreate the same skipped result.

After #897, or a freshly verified successor preserving the same semantics, reaches protected central main, every otherwise accepted unchanged EgressWeave candidate must receive a fresh Security Scan bound to its exact current head and live-base context. Acceptance requires the real immutable-pinned Dependency review action itself to execute and succeed; predecessor, wrapper-only, support-only, queued, skipped, cancelled, neutral, stale, or synthetic evidence does not transfer.

Acceptance criteria

  • Preserve immutable RED evidence for the original fail-open unavailable/non-success behavior.
  • Define fail-closed support semantics requiring successful transport plus exact HTTP 200.
  • Preserve the nonzero-transport-with-200 negative control.
  • Bound probe resources and avoid response-body or credential disclosure.
  • Preserve exact source/base/head identity, read-only permissions, and immutable action pins in the central repair lineage.
  • Complete deterministic/security/current-source review on exact central head 714a19818ff35cce246b6b59b9d3969783037cb0 without treating neutral/skipped/failed/stale evidence as passing.
  • Satisfy every live central ruleset/review/approval requirement actually imposed and integrate the accepted repair into protected central main without bypass.
  • After protected-central integration, rerun unchanged EgressWeave accepted candidates and require the real pinned Dependency Review action to execute and succeed on each exact accepted tree.
  • Revalidate every other required EgressWeave workflow, finding, review/thread state, exact head/live base, and live rule immediately before each merge.
  • Close only after protected-central repair plus at least one protected EgressWeave consumer path proves the repaired fail-closed behavior end to end.

Required semantics

403, 404, malformed/empty status, nonzero transport exit even with stdout 200, timeout, partial transfer, TLS failure, or unexpected probe state is unavailable security evidence and must fail closed. Do not infer not-applicable from an unavailable support probe. Keep Dependency Review evidence separate from all other scanners and reviewers, preserve complete pagination where APIs enumerate state, and retain stale-head refusal, fork/read-only safety, least privilege, and immutable source identity.

Trust boundary / non-goals

The repair belongs to the organization-owned read-only security gate. EgressWeave must not create a competing central workflow, publisher, model-modified publication path, extra write authority, release/tag/package path, or local fail-open workaround. No dependency/package-version change is implied by this issue.

Primary references (APA 7th)

GitHub. (n.d.). Dependency review. GitHub Docs. Retrieved August 7, 2026.

GitHub. (n.d.). REST API endpoints for dependency review. GitHub Docs. Retrieved August 7, 2026.

GitHub. (n.d.). Customizing your dependency review action configuration. GitHub Docs. Retrieved August 7, 2026.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions