Skip to content

fix: avoid shell injection via PR body containing backticks#784

Merged
BLumia merged 1 commit into
linuxdeepin:masterfrom
hudeng-go:master
May 15, 2026
Merged

fix: avoid shell injection via PR body containing backticks#784
BLumia merged 1 commit into
linuxdeepin:masterfrom
hudeng-go:master

Conversation

@hudeng-go
Copy link
Copy Markdown
Contributor

Move PR_BODY to an env variable instead of inline shell assignment to prevent backticks from being interpreted as command substitution.

Log:

Move PR_BODY to an env variable instead of inline shell
assignment to prevent backticks from being interpreted as
command substitution.

Log:
@deepin-ci-robot
Copy link
Copy Markdown
Contributor

deepin pr auto review

你好!我是CodeGeeX。我已经仔细审查了你提供的 Git Diff,这次修改主要是对 GitHub Actions 工作流中环境变量的使用方式进行了重构,将内联的变量赋值改为了 env 块声明。

以下是针对这段代码的详细审查意见,涵盖语法逻辑、代码质量、代码性能和代码安全四个方面:

1. 语法逻辑

  • 改进点:本次修改在逻辑上是正确的,且是一个极佳的改进。原代码 PR_BODY="${{ github.event.pull_request.body }}" 直接将 GitHub 上下文变量通过模板插值嵌入到 shell 脚本中,如果 PR body 中包含特殊字符(如引号、反引号、$ 符号等),会导致 shell 脚本解析错误甚至提前中断。将其移至 env 块中,GitHub Actions 会自动处理环境变量的转义,确保多行文本和特殊字符能够原样传递给脚本,增强了代码的健壮性。

2. 代码质量

  • 优点:将环境变量声明与脚本逻辑分离,符合基础设施即代码的最佳实践,使得 YAML 文件结构更清晰,职责划分更明确。
  • 改进建议
    • 正则表达式可读性BLOCKED_PATTERN 的正则表达式较长,且在脚本内直接硬编码。建议将其也移至 env 块中,或者拆分为多个变量,以提高可读性和后续维护性。
    • 正则表达式严谨性:当前正则 Co-authored-by:.*ai 会匹配任何包含 "ai" 的单词(例如 Co-authored-by: KaiCo-authored-by: Baird),这可能会产生误报。建议使用单词边界 \b 或更严格的匹配规则。

3. 代码性能

  • 改进建议
    • 避免无谓的子进程创建:当前使用 echo "${PR_BODY}" | grep -Eiq ...,这会创建一个 echo 子进程并通过管道连接 grep。对于可能很长的 PR Body,这存在一定的性能开销。建议直接使用 grep 读取环境变量,省去管道和额外的进程创建:grep -Eiq "${BLOCKED_PATTERN}" <<< "${PR_BODY}"

4. 代码安全

  • 风险分析:原代码的写法存在严重的 代码注入 风险。如果攻击者提交一个标题或正文为 ; rm -rf / # 的 PR,原写法会将其作为 shell 命令执行。
  • 当前状态:你的修改通过使用 env 块,完美地修复了这个安全漏洞。环境变量在传递时不会经过 shell 的二次解析,因此即使 PR Body 包含恶意 shell 命令,也只会被当作普通字符串处理,安全性得到了极大提升。
  • 进一步建议:虽然当前修改已足够安全,但在编写 Shell 脚本时,始终建议为变量加上双引号(你的代码中已经做了 echo "${PR_BODY}",这点非常好),以防止变量展开后发生词法分割和通配符扩展。

综合改进后的代码建议

结合以上分析,我为你提供一份优化后的代码版本,修复了潜在的误报问题,并提升了性能与可读性:

      - name: check PR description for AI co-author pattern
        shell: bash
        env:
          PR_BODY: ${{ github.event.pull_request.body }}
          # 增加单词边界 \b 防止误匹配如 "Kai", "Baird" 等包含 ai/gpt 的名字
          # 移至 env 块方便集中管理和修改
          BLOCKED_PATTERN: 'Co-authored-by:.*\b(ai|agent|copilot|llm|gpt)\b'
        run: |
          # 使用 <<< (here-string) 替代管道,避免创建多余的 echo 子进程,提升性能
          if grep -Eiq "${BLOCKED_PATTERN}" <<< "${PR_BODY}"; then
            echo "FAIL: PR description contains blocked co-author AI pattern." >&2
            echo "Blocked pattern: ${BLOCKED_PATTERN}" >&2
            exit 1
          fi

主要变更说明:

  1. BLOCKED_PATTERN 移至 env 块,与 PR_BODY 保持一致的管理风格。
  2. 在正则表达式中加入了 \b 单词边界,大幅降低误报率。
  3. 使用 grep ... <<< "${PR_BODY}" 替代了 echo ... | grep ...,减少了进程创建开销。
  4. 补充了 exit 1(如果你的原代码在后续步骤才处理退出状态,可忽略此条,但通常检测到阻塞模式后应立即失败),确保 CI 流水线在匹配到违规 PR 时正确中断。

@BLumia BLumia merged commit f279f27 into linuxdeepin:master May 15, 2026
4 checks passed
@deepin-ci-robot
Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: BLumia, hudeng-go, wineee

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants