Skip to content

Commit 6e99b29

Browse files
tashianclaude
andcommitted
Harden GitHub Actions workflows against expression injection and secret leakage
- Replace direct ${{ inputs.* }} interpolation in run: blocks with env: vars to prevent shell injection (goBuild, goTest, goLint, govulncheck, codeql, goreleaser) - Replace secrets: inherit with explicit per-workflow secret forwarding in goCI.yml - Remove unnecessary secrets: inherit from actionlint call in ci.yml - Add least-privilege permissions: block to triage.yml reusable workflow - Move permissions from workflow-level to job-level in dependabot-auto-merge.yml Ref: https://www.stepsecurity.io/blog/hackerbot-claw-github-actions-exploitation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent fc6cf54 commit 6e99b29

10 files changed

Lines changed: 53 additions & 19 deletions

File tree

.github/workflows/ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ jobs:
1919
actionlint:
2020
name: Lint GitHub workflows
2121
uses: ./.github/workflows/actionlint.yml
22-
secrets: inherit
2322

2423
lint-dummy-app: # NOTE(@azazeal): this check is here to verify that .golangci.yml is valid
2524
name: Lint dummy app

.github/workflows/codeql-analysis.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ jobs:
4343
-
4444
name: Install Dependencies
4545
if: ${{ inputs.os-dependencies != '' }}
46+
env:
47+
OS_DEPS: ${{ inputs.os-dependencies }}
4648
run: |
4749
sudo apt-get update
48-
sudo apt-get install ${{ inputs.os-dependencies }}
50+
sudo apt-get install ${OS_DEPS}
4951
-
5052
name: Checkout
5153
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -109,8 +111,10 @@ jobs:
109111
make bootstrap
110112
-
111113
name: Build
114+
env:
115+
CODEQL_BUILD_CMD: ${{ inputs.codeql-build-cmd }}
112116
run: |
113-
${{ inputs.codeql-build-cmd }}
117+
${CODEQL_BUILD_CMD}
114118
-
115119
name: Perform CodeQL Analysis
116120
uses: github/codeql-action/analyze@89a39a4e59826350b863aa6b6252a07ad50cf83e # v4.32.4

.github/workflows/dependabot-auto-merge.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ on:
66
DEPENDABOT_TOKEN:
77
required: true
88

9-
permissions:
10-
contents: write
11-
pull-requests: write
9+
permissions: {}
1210

1311
jobs:
1412
dependabot:
1513
runs-on: ubuntu-latest
1614
if: ${{ github.actor == 'dependabot[bot]' }}
15+
permissions:
16+
contents: write
17+
pull-requests: write
1718
steps:
1819
- name: Dependabot metadata
1920
id: metadata

.github/workflows/goBuild.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ jobs:
5353
-
5454
name: Install Dependencies # Some dependencies require this package
5555
if: ${{ inputs.os-dependencies != '' }}
56+
env:
57+
OS_DEPS: ${{ inputs.os-dependencies }}
5658
run: |
5759
sudo apt-get update
58-
sudo apt-get install ${{ inputs.os-dependencies }}
60+
sudo apt-get install ${OS_DEPS}
5961
-
6062
name: Checkout
6163
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -88,4 +90,6 @@ jobs:
8890
${{ secrets.SSH_PRIVATE_KEY }}
8991
-
9092
name: Build
91-
run: ${{ inputs.build-command }}
93+
env:
94+
BUILD_CMD: ${{ inputs.build-command }}
95+
run: ${BUILD_CMD}

.github/workflows/goCI.yml

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,19 @@ jobs:
104104
os-dependencies: ${{ inputs.os-dependencies }}
105105
skip-go-generate: ${{ inputs.lint-skip-go-generate }}
106106
skip-go-mod-tidy: ${{ inputs.lint-skip-go-mod-tidy }}
107-
secrets: inherit
107+
secrets:
108+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
109+
PAT: ${{ secrets.PAT }}
108110

109111
govulncheck:
110112
uses: ./.github/workflows/govulncheck.yml
111113
if: inputs.run-govulncheck
112114
with:
113115
os-dependencies: ${{ inputs.os-dependencies }}
114116
goprivate: ${{ inputs.goprivate }}
115-
secrets: inherit
117+
secrets:
118+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
119+
PAT: ${{ secrets.PAT }}
116120

117121
codeql:
118122
if: inputs.run-codeql
@@ -122,7 +126,9 @@ jobs:
122126
os-dependencies: ${{ inputs.os-dependencies }}
123127
codeql-make-bootstrap: ${{ inputs.codeql-make-bootstrap }}
124128
codeql-build-cmd: ${{ inputs.codeql-build-cmd }}
125-
secrets: inherit
129+
secrets:
130+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
131+
PAT: ${{ secrets.PAT }}
126132

127133
test:
128134
uses: ./.github/workflows/goTest.yml
@@ -134,7 +140,10 @@ jobs:
134140
run-codecov: ${{ inputs.run-codecov }}
135141
setup-bats: ${{ inputs.setup-bats }}
136142
test-command: ${{ inputs.test-command }}
137-
secrets: inherit
143+
secrets:
144+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
145+
PAT: ${{ secrets.PAT }}
146+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
138147

139148
build:
140149
uses: ./.github/workflows/goBuild.yml
@@ -144,4 +153,6 @@ jobs:
144153
goprivate: ${{ inputs.goprivate }}
145154
only-latest-golang: ${{ inputs.only-latest-golang }}
146155
os-dependencies: ${{ inputs.os-dependencies }}
147-
secrets: inherit
156+
secrets:
157+
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
158+
PAT: ${{ secrets.PAT }}

.github/workflows/goLint.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ jobs:
3939
-
4040
name: Install Dependencies # Some dependencies require this package
4141
if: ${{ inputs.os-dependencies != '' }}
42+
env:
43+
OS_DEPS: ${{ inputs.os-dependencies }}
4244
run: |
4345
sudo apt-get update
44-
sudo apt-get install ${{ inputs.os-dependencies }}
46+
sudo apt-get install ${OS_DEPS}
4547
-
4648
name: Checkout
4749
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

.github/workflows/goTest.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,11 @@ jobs:
7070
-
7171
name: Install Dependencies
7272
if: inputs.os-dependencies != ''
73+
env:
74+
OS_DEPS: ${{ inputs.os-dependencies }}
7375
run: |
7476
sudo apt-get update
75-
sudo apt-get install ${{ inputs.os-dependencies }}
77+
sudo apt-get install ${OS_DEPS}
7678
-
7779
name: Checkout
7880
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -123,8 +125,10 @@ jobs:
123125
${{ secrets.SSH_PRIVATE_KEY }}
124126
-
125127
name: Install gotestsum
128+
env:
129+
GOTESTSUM_VERSION: ${{ inputs.gotestsum-version }}
126130
run: |
127-
go install gotest.tools/gotestsum@v${{ inputs.gotestsum-version }}
131+
go install gotest.tools/gotestsum@v${GOTESTSUM_VERSION}
128132
-
129133
name: Setup BATS
130134
if: inputs.setup-bats
@@ -133,9 +137,10 @@ jobs:
133137
bats-version: 1.9.0
134138
-
135139
name: Run Test Suite
136-
run: ${{ inputs.test-command }}
137140
env:
141+
TEST_CMD: ${{ inputs.test-command }}
138142
GOTESTSUM_JSONFILE: gotestsum.json
143+
run: ${TEST_CMD}
139144

140145
-
141146
name: Annotate Test Suite Results

.github/workflows/goreleaser.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ jobs:
7979
-
8080
name: Install Dependencies # Some dependencies require this package
8181
if: ${{ inputs.os-dependencies != '' }}
82+
env:
83+
OS_DEPS: ${{ inputs.os-dependencies }}
8284
run: |
8385
sudo apt-get update
84-
sudo apt-get install ${{ inputs.os-dependencies }}
86+
sudo apt-get install ${OS_DEPS}
8587
-
8688
name: Checkout
8789
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

.github/workflows/govulncheck.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ jobs:
2323
-
2424
name: Install Dependencies # Some dependencies require this package
2525
if: ${{ inputs.os-dependencies != '' }}
26+
env:
27+
OS_DEPS: ${{ inputs.os-dependencies }}
2628
run: |
2729
sudo apt-get update
28-
sudo apt-get install ${{ inputs.os-dependencies }}
30+
sudo apt-get install ${OS_DEPS}
2931
-
3032
name: Checkout
3133
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

.github/workflows/triage.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ on:
1515
type: boolean
1616
default: true
1717

18+
permissions:
19+
pull-requests: write
20+
issues: write
21+
1822
jobs:
1923
label-pr:
2024
name: Label PR

0 commit comments

Comments
 (0)