Skip to content

Commit 05480a3

Browse files
soc1024claude
andcommitted
Add env confinement: allowed-env reference + guard check
Baseline of 95 env vars captured from a clean ubuntu-24.04 runner (image 20260209.23.1, runner 2.331.0). The guard step rejects the job if any unexpected vars are present — defends against LD_PRELOAD, NODE_OPTIONS, BASH_ENV, etc. injection without relying on a blocklist. Inspired by dstack's allowed_envs model. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e2dabe8 commit 05480a3

File tree

2 files changed

+162
-2
lines changed

2 files changed

+162
-2
lines changed

.github/allowed-env-reference.txt

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Allowed environment variables for GitHub Actions ubuntu-latest runner
2+
# Captured 2026-02-13 from ubuntu-24.04 image version 20260209.23.1
3+
# Runner version: 2.331.0
4+
#
5+
# Any env var NOT in this list (or the workflow's ALLOWED_EXTRA) should
6+
# cause the job to abort immediately. This defends against env injection
7+
# attacks (LD_PRELOAD, NODE_OPTIONS, BASH_ENV, etc.) that can hijack
8+
# execution without changing the workflow YAML.
9+
#
10+
# See: https://www.elttam.com/blog/env/
11+
# See: https://www.synacktiv.com/en/publications/github-actions-exploitation-repo-jacking-and-environment-manipulation
12+
13+
# System/OS
14+
_
15+
HOME
16+
INVOCATION_ID
17+
JOURNAL_STREAM
18+
LANG
19+
LOGNAME
20+
MEMORY_PRESSURE_WATCH
21+
MEMORY_PRESSURE_WRITE
22+
PATH
23+
PWD
24+
SHELL
25+
SHLVL
26+
SYSTEMD_EXEC_PID
27+
USER
28+
XDG_CONFIG_HOME
29+
XDG_RUNTIME_DIR
30+
31+
# GitHub Actions runner
32+
ACTIONS_ORCHESTRATION_ID
33+
ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE
34+
CI
35+
ENABLE_RUNNER_TRACING
36+
GITHUB_ACTION
37+
GITHUB_ACTION_REF
38+
GITHUB_ACTION_REPOSITORY
39+
GITHUB_ACTIONS
40+
GITHUB_ACTOR
41+
GITHUB_ACTOR_ID
42+
GITHUB_API_URL
43+
GITHUB_BASE_REF
44+
GITHUB_ENV
45+
GITHUB_EVENT_NAME
46+
GITHUB_EVENT_PATH
47+
GITHUB_GRAPHQL_URL
48+
GITHUB_HEAD_REF
49+
GITHUB_JOB
50+
GITHUB_OUTPUT
51+
GITHUB_PATH
52+
GITHUB_REF
53+
GITHUB_REF_NAME
54+
GITHUB_REF_PROTECTED
55+
GITHUB_REF_TYPE
56+
GITHUB_REPOSITORY
57+
GITHUB_REPOSITORY_ID
58+
GITHUB_REPOSITORY_OWNER
59+
GITHUB_REPOSITORY_OWNER_ID
60+
GITHUB_RETENTION_DAYS
61+
GITHUB_RUN_ATTEMPT
62+
GITHUB_RUN_ID
63+
GITHUB_RUN_NUMBER
64+
GITHUB_SERVER_URL
65+
GITHUB_SHA
66+
GITHUB_STATE
67+
GITHUB_STEP_SUMMARY
68+
GITHUB_TRIGGERING_ACTOR
69+
GITHUB_WORKFLOW
70+
GITHUB_WORKFLOW_REF
71+
GITHUB_WORKFLOW_SHA
72+
GITHUB_WORKSPACE
73+
RUNNER_ARCH
74+
RUNNER_ENVIRONMENT
75+
RUNNER_NAME
76+
RUNNER_OS
77+
RUNNER_TEMP
78+
RUNNER_TOOL_CACHE
79+
RUNNER_TRACKING_ID
80+
RUNNER_WORKSPACE
81+
82+
# Runner image: toolchains and SDKs
83+
ACCEPT_EULA
84+
AGENT_TOOLSDIRECTORY
85+
ANDROID_HOME
86+
ANDROID_NDK
87+
ANDROID_NDK_HOME
88+
ANDROID_NDK_LATEST_HOME
89+
ANDROID_NDK_ROOT
90+
ANDROID_SDK_ROOT
91+
ANT_HOME
92+
AZURE_EXTENSION_DIR
93+
BOOTSTRAP_HASKELL_NONINTERACTIVE
94+
CHROME_BIN
95+
CHROMEWEBDRIVER
96+
CONDA
97+
DEBIAN_FRONTEND
98+
DOTNET_MULTILEVEL_LOOKUP
99+
DOTNET_NOLOGO
100+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE
101+
EDGEWEBDRIVER
102+
GECKOWEBDRIVER
103+
GHCUP_INSTALL_BASE_PREFIX
104+
GOROOT_1_22_X64
105+
GOROOT_1_23_X64
106+
GOROOT_1_24_X64
107+
GOROOT_1_25_X64
108+
GRADLE_HOME
109+
HOMEBREW_CLEANUP_PERIODIC_FULL_DAYS
110+
HOMEBREW_NO_AUTO_UPDATE
111+
ImageOS
112+
ImageVersion
113+
JAVA_HOME
114+
JAVA_HOME_11_X64
115+
JAVA_HOME_17_X64
116+
JAVA_HOME_21_X64
117+
JAVA_HOME_25_X64
118+
JAVA_HOME_8_X64
119+
NVM_DIR
120+
PIPX_BIN_DIR
121+
PIPX_HOME
122+
POWERSHELL_DISTRIBUTION_CHANNEL
123+
PSModulePath
124+
SELENIUM_JAR_PATH
125+
SGX_AESM_ADDR
126+
SWIFT_PATH
127+
USE_BAZEL_FALLBACK_VERSION
128+
VCPKG_INSTALLATION_ROOT

.github/workflows/dump-env.yml

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,43 @@ name: Dump Runner Environment
22
on: workflow_dispatch
33

44
jobs:
5-
dump-env:
5+
dump-clean:
6+
name: Clean runner baseline
67
runs-on: ubuntu-latest
78
steps:
89
- name: Env var names (sorted)
910
run: env | cut -d= -f1 | sort
10-
1111
- name: Full env dump
1212
run: env | sort
13+
14+
test-guard:
15+
name: Test env confinement guard
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Environment confinement check
21+
run: |
22+
REF=".github/allowed-env-reference.txt"
23+
24+
# Strip comments and blank lines from reference
25+
grep -v '^#' "$REF" | grep -v '^$' | sort -u > /tmp/allowed.txt
26+
27+
# Current env var names
28+
env | cut -d= -f1 | sort -u > /tmp/current.txt
29+
30+
# Anything present that's not in the allowed list?
31+
UNEXPECTED=$(comm -23 /tmp/current.txt /tmp/allowed.txt || true)
32+
33+
if [ -n "$UNEXPECTED" ]; then
34+
echo "::error::Unexpected environment variables detected!"
35+
echo "The following vars are NOT in .github/allowed-env-reference.txt:"
36+
echo "$UNEXPECTED"
37+
echo ""
38+
echo "This could indicate env injection (LD_PRELOAD, NODE_OPTIONS, etc)."
39+
echo "If these are legitimate, add them to allowed-env-reference.txt."
40+
exit 1
41+
fi
42+
43+
echo "Environment confinement check passed."
44+
echo "$(wc -l < /tmp/current.txt) vars present, all in allowed list."

0 commit comments

Comments
 (0)