Skip to content

security: make central dependency-review unavailability fail closed #810

Description

@seonghobae

Current state — 2026-09-01

The original fail-open source defect is repaired. Merged PR #897 changed the central required .github/workflows/security-scan.yml so Dependency Review support is accepted only when the exact BASE_SHA...HEAD_SHA comparison completes with transport success and HTTP 200; every non-200/malformed/empty/transport-failed result now fails the required workflow visibly and skips the pinned action only because authoritative dependency-diff evidence could not be established. Do not reopen the old 403/404 => supported=false => success behavior and do not substitute OSV/Trivy/Scorecard for Dependency Review.

The issue remains open for a separate current availability/operations incident: public, non-fork ContextualWisdomLab consumers (including repeated Orgmetra canaries) still receive HTTP 403 with curl_exit=0 from GET /repos/{repo}/dependency-graph/compare/{base}...{head}. The fail-closed workflow therefore correctly blocks those PRs before actions/dependency-review-action can execute.

GitHub's current public documentation states that dependency graph and dependency review are enabled by default for public repositories and cannot be disabled, and the dependency-review REST comparison can be used without authentication for public resources; documented 403 semantics do not describe a normal public non-fork result. Treat the current 403 as missing authoritative evidence, not as a clean dependency review and not as a downstream application-source defect.

Primary references:

Current incident boundary

  • Central source behavior on protected main: fail closed unless the exact dependency comparison returns HTTP 200 with curl exit 0.
  • Repeated public Orgmetra canaries: exact checkout succeeds; comparison returns HTTP 403; pinned Dependency Review step does not execute; Security Scan is correctly FAILURE; sibling OSV/Trivy/Scorecard results may be GREEN but are not semantic substitutes.
  • No Orgmetra-local workflow shim or branch change can convert a GitHub 403 into authoritative dependency-review evidence.
  • The currently exposed GitHub mutation surface does not provide a repository dependency-graph/security-setting write operation. Do not claim such a setting was changed, and do not weaken the central gate to compensate.

Acceptance criteria

  • Immutable RED/GREEN contract forbids the former 403/404 success-skip behavior.
  • Exact PR-head repository/SHA checkout and exact base/head comparison binding are preserved.
  • Only transport-success + HTTP 200 reaches the immutable pinned Dependency Review action.
  • 403/404/malformed/empty status, transport failure, timeout, truncated response and unexpected status fail closed without leaking response bodies.
  • Least privilege and independent OSV/Trivy/Scorecard/CodeQL/SAST/secret surfaces are preserved.
  • Determine and repair the remaining GitHub/dependency-review availability or account/repository configuration cause through an authorized owner surface; do not guess the 403 root cause from status alone.
  • After that repair, perform a fresh unchanged-head public non-fork canary (Orgmetra is acceptable) where the exact comparison returns HTTP 200 and the pinned actions/dependency-review-action actually executes to a terminal authoritative result.
  • Re-read the then-current central workflow and downstream exact-head run to prove no fail-open regression or substitute-scanner promotion occurred.

Keep this issue open for the remaining availability incident; do not create another central fail-closed writer unless protected main regresses. Existing historical PRs #799/#821/#897/#1050 remain evidence/history, not permission to weaken the current hard gate.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dependenciesDependency or lockfile maintenancearea: securitySecurity boundary, hardening, or vulnerability preventionbugSomething isn't workingpriority: highHigh-priority or P1 workstatus: blockedBlocked by conflict, dependency, or required prerequisitetype: securitySecurity vulnerability or security-specific remediation

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions