security: pin GitHub Actions to commit SHAs, add Dependabot

Pin all 22 action references across ci.yml, publish.yml, and
attest-release.yml to immutable commit SHAs. Mutable tags can be
force-pushed by attackers (cf. TeamPCP supply chain campaign).

Add Dependabot for github-actions to get weekly PRs when pinned
actions have new versions.
This commit is contained in:
CloakHQ
2026-03-27 21:20:08 +01:00
parent 2813b3dc4c
commit 49d80d3b57
4 changed files with 28 additions and 22 deletions
+6
View File
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
- name: Attest build provenance - name: Attest build provenance
uses: actions/attest-build-provenance@v2 uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2
with: with:
subject-path: | subject-path: |
cloakbrowser-*.tar.gz cloakbrowser-*.tar.gz
+4 -4
View File
@@ -10,8 +10,8 @@ jobs:
python: python:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with: with:
python-version: "3.12" python-version: "3.12"
- name: Install dependencies - name: Install dependencies
@@ -22,8 +22,8 @@ jobs:
javascript: javascript:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with: with:
node-version: 20 node-version: 20
- name: Install and build - name: Install and build
+17 -17
View File
@@ -24,15 +24,15 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with: with:
python-version: "3.12" python-version: "3.12"
- name: Python tests - name: Python tests
run: | run: |
pip install -e ".[dev]" pytest pytest-asyncio pip install -e ".[dev]" pytest pytest-asyncio
pytest tests/ -v -m "not slow" pytest tests/ -v -m "not slow"
- uses: actions/setup-node@v4 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with: with:
node-version: 22 node-version: 22
- name: JavaScript tests - name: JavaScript tests
@@ -42,8 +42,8 @@ jobs:
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with: with:
python-version: "3.12" python-version: "3.12"
- name: Check tag matches package versions - name: Check tag matches package versions
@@ -62,8 +62,8 @@ jobs:
permissions: permissions:
id-token: write # OIDC trusted publishing — no PYPI_TOKEN needed id-token: write # OIDC trusted publishing — no PYPI_TOKEN needed
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with: with:
python-version: "3.12" python-version: "3.12"
- name: Build - name: Build
@@ -71,7 +71,7 @@ jobs:
pip install build pip install build
python -m build python -m build
- name: Publish to PyPI - name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1 uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1
publish-npm: publish-npm:
needs: [test, validate-version] needs: [test, validate-version]
@@ -80,8 +80,8 @@ jobs:
permissions: permissions:
id-token: write # OIDC trusted publishing + provenance — no NPM_TOKEN needed id-token: write # OIDC trusted publishing + provenance — no NPM_TOKEN needed
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with: with:
node-version: 22 node-version: 22
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
@@ -102,20 +102,20 @@ jobs:
attestations: write attestations: write
packages: write packages: write
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Extract version - name: Extract version
run: | run: |
VERSION=$(python -c 'import re; print(re.search(r"__version__\s*=\s*[\"'\'']([^\"'\'']+)", open("cloakbrowser/_version.py").read()).group(1))') VERSION=$(python -c 'import re; print(re.search(r"__version__\s*=\s*[\"'\'']([^\"'\'']+)", open("cloakbrowser/_version.py").read()).group(1))')
echo "VERSION=$VERSION" >> $GITHUB_ENV echo "VERSION=$VERSION" >> $GITHUB_ENV
- uses: docker/setup-qemu-action@v3 - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
- uses: docker/setup-buildx-action@v3 - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- uses: docker/login-action@v3 - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with: with:
username: ${{ secrets.DOCKER_USER }} username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PAT }} password: ${{ secrets.DOCKER_PAT }}
- name: Build and push - name: Build and push
id: build id: build
uses: docker/build-push-action@v6 uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
@@ -125,11 +125,11 @@ jobs:
cloakhq/cloakbrowser:latest cloakhq/cloakbrowser:latest
provenance: true provenance: true
sbom: true sbom: true
- uses: sigstore/cosign-installer@v3 - uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3
- name: Sign image - name: Sign image
run: cosign sign --yes cloakhq/cloakbrowser@${{ steps.build.outputs.digest }} run: cosign sign --yes cloakhq/cloakbrowser@${{ steps.build.outputs.digest }}
- name: Attest build provenance - name: Attest build provenance
uses: actions/attest-build-provenance@v2 uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2
with: with:
subject-name: index.docker.io/cloakhq/cloakbrowser subject-name: index.docker.io/cloakhq/cloakbrowser
subject-digest: ${{ steps.build.outputs.digest }} subject-digest: ${{ steps.build.outputs.digest }}