From 6f37eefdfff5e68c6996365f659f83c2b490da35 Mon Sep 17 00:00:00 2001 From: Matt Sutkus <97645156+msuitcase@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:29:39 -0700 Subject: [PATCH 1/2] ci: don't persist GITHUB_TOKEN in checkout actions/checkout writes the job token into .git/config by default, where any later step (composer install, phpunit, third-party actions) can read it. Nothing in this workflow needs git credentials after checkout; the gh-pages deploy authenticates with its own github_token input. Refs SEC-843 --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71cf3152..0de4a6a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - uses: extractions/setup-just@v3 - uses: shivammathur/setup-php@v2 with: @@ -26,6 +28,8 @@ jobs: phpversion: ['8.1', '8.2', '8.3', '8.4', '8.5'] steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - uses: extractions/setup-just@v3 - uses: shivammathur/setup-php@v2 with: @@ -54,6 +58,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - uses: extractions/setup-just@v3 - uses: shivammathur/setup-php@v2 with: From c229af3c3d0c18d17872f73941857dd0e20295df Mon Sep 17 00:00:00 2001 From: Matt Sutkus <97645156+msuitcase@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:30:47 -0700 Subject: [PATCH 2/2] ci: set least-privilege GITHUB_TOKEN permissions Default the workflow token to read-only. Only the docs job writes to the repo (gh-pages deploy), so it alone gets contents: write. Refs SEC-843 --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0de4a6a4..6da9fc50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,9 @@ on: pull_request: ~ workflow_dispatch: ~ +permissions: + contents: read + jobs: lint: runs-on: ubuntu-latest @@ -56,6 +59,8 @@ jobs: docs: if: github.ref == 'refs/heads/master' runs-on: ubuntu-latest + permissions: + contents: write # peaceiris/actions-gh-pages pushes to gh-pages steps: - uses: actions/checkout@v6 with: