From c77a6e3faaf3d400f639213ba3af02a3891ad05a Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Mon, 4 May 2026 20:58:21 -0700 Subject: [PATCH] chore(security): add OSV-Scanner CI + Dependabot for github-actions only (#20037) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds two supply-chain controls that complement our existing pinning strategy (full-SHA action pins, exact-version source dep pins via uv.lock / package-lock.json) without undermining it. .github/workflows/osv-scanner.yml Detection-only scan of uv.lock and the ui-tui/website package-locks against the OSV vulnerability database. Runs on PRs that touch lockfiles, on push to main, and weekly against main so CVEs published after merge still surface. Uses Google's officially- recommended reusable workflow pinned by full SHA (v2.3.5). Findings upload to the Security tab; fail-on-vuln is disabled so pre-existing vulns in pinned deps do not block merges — we move pins deliberately, not under CI pressure. .github/dependabot.yml Scoped to github-actions only. Action pins must be moved when upstream publishes patches (often themselves security fixes); Dependabot opens a PR with the new SHA + release notes for normal review. Source-dependency ecosystems (pip, npm) are deliberately NOT enabled — automatic version-bump PRs against uv.lock / package-lock.json would fight our pinning strategy. CVE-driven security updates for source deps are enabled separately via the repo's Dependabot security updates setting (GitHub UI), which fires only when a pinned version becomes known-vulnerable. --- .github/dependabot.yml | 44 ++++++++++++++++++++ .github/workflows/osv-scanner.yml | 67 +++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/osv-scanner.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..3854c8f930 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,44 @@ +# Dependabot configuration for hermes-agent. +# +# Deliberately scoped to github-actions only. +# +# We do NOT enable Dependabot for pip / npm / any source-dependency ecosystem +# because we pin source dependencies exactly (uv.lock, package-lock.json) as +# part of our supply-chain posture. Automatic version-bump PRs against those +# pins would undermine the strategy — pins are moved deliberately, after +# review, not on a schedule. +# +# github-actions is the exception: action pins (we use full commit SHAs per +# supply-chain policy) must be updated when upstream actions publish +# patches — usually themselves security fixes. Dependabot opens a PR with +# the new SHA and release notes; we review and merge like any other PR. +# +# Security-update PRs for source dependencies (opened ONLY when a CVE is +# published affecting a currently-pinned version) are enabled separately +# via the repo's Dependabot security updates setting +# (Settings → Code security → Dependabot → Dependabot security updates). +# Those are CVE-only, not schedule-driven, and do not conflict with our +# pinning strategy — they fire when a pinned version becomes known-bad, +# which is exactly when we want to move the pin. + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + open-pull-requests-limit: 5 + labels: + - "dependencies" + - "github-actions" + commit-message: + prefix: "chore(actions)" + include: "scope" + groups: + # Batch routine action bumps into one PR per week to reduce noise. + # Security updates still open individually and bypass grouping. + actions-minor-patch: + update-types: + - "minor" + - "patch" diff --git a/.github/workflows/osv-scanner.yml b/.github/workflows/osv-scanner.yml new file mode 100644 index 0000000000..db8c3d75ce --- /dev/null +++ b/.github/workflows/osv-scanner.yml @@ -0,0 +1,67 @@ +name: OSV-Scanner + +# Scans lockfiles (uv.lock, package-lock.json) against the OSV vulnerability +# database. Runs on every PR that touches a lockfile and on a weekly schedule +# against main. +# +# This is detection-only — OSV-Scanner does NOT open PRs or modify pins. +# It reports known CVEs in currently-pinned dependency versions so we can +# decide when and how to patch on our own schedule. Our pinning strategy +# (full SHA / exact version) is preserved; only the notification signal +# is added. +# +# Complements the existing supply-chain-audit.yml workflow (which scans +# for malicious code patterns in PR diffs) by covering the orthogonal +# "currently-pinned dep became known-vulnerable" case. +# +# Uses Google's officially-recommended reusable workflow, pinned by SHA. +# Findings land in the repo's Security tab (Code Scanning > OSV-Scanner). +# fail-on-vuln is disabled so the job does not block merges on pre-existing +# vulnerabilities in pinned deps that we may need to patch deliberately. + +on: + pull_request: + branches: [main] + paths: + - 'uv.lock' + - 'pyproject.toml' + - 'package.json' + - 'package-lock.json' + - 'ui-tui/package.json' + - 'ui-tui/package-lock.json' + - 'website/package.json' + - 'website/package-lock.json' + - '.github/workflows/osv-scanner.yml' + push: + branches: [main] + paths: + - 'uv.lock' + - 'pyproject.toml' + - 'package.json' + - 'package-lock.json' + - 'ui-tui/package-lock.json' + - 'website/package-lock.json' + schedule: + # Weekly scan against main — catches CVEs published after merge for + # deps that haven't changed since. + - cron: '0 9 * * 1' + workflow_dispatch: + +permissions: + # Required by the reusable workflow to upload SARIF to the Security tab. + actions: read + contents: read + security-events: write + +jobs: + scan: + name: Scan lockfiles + uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@c51854704019a247608d928f370c98740469d4b5 # v2.3.5 + with: + # Scan explicit lockfiles rather than recursing, so we only look at + # the three sources of truth and skip vendored / test / worktree dirs. + scan-args: |- + --lockfile=uv.lock + --lockfile=ui-tui/package-lock.json + --lockfile=website/package-lock.json + fail-on-vuln: false