Lobsters | 📄 原文链接 | 2026-07-22 collected

Git 的 --end-of-options:参数注入攻击的终极防线

source: nesbitt.io — 2026-07-21

概述

Git 在 2019 年的 2.24 版本引入了 --end-of-options 标志,用于安全地终止选项解析。与 POSIX 惯例不同,Git 早已将 -- 用于分隔 revisions 和 pathspecs,因此需要一个独立的选项终止符。文章梳理了 Git、Mercurial、SSH 等工具的 CWE-88 参数注入漏洞历史,并分析了 19 个包管理器如何处理不可信 Git URL——其中 17 个直接 fork git 二进制,面临同样的攻击面。即使 argv 数组无 shell 参与,--upload-pack 等选项仍可被恶意 URL 注入利用。

核心要点

  • Git 的 --end-of-options 是 CWE-88 参数注入的防护手段:在 git log --end-of-options "$rev" -- "$path" 中安全终止选项解析。
  • 与 POSIX 惯例不同,Git 的 -- 用于分隔 revisions 和 pathspecs,因此需要独立的 --end-of-options 作为选项终止符。
  • 19 个包管理器中 17 个直接 fork git 二进制处理 URL,仅 Cargo (libgit2) 和 Poetry (dulwich) 默认使用库,其余均面临参数注入风险。
  • CVE-2017-1000117 等漏洞表明:URL hostname 经过 SSH 传递时,-oProxyCommand= 可被注入为 SSH 选项,即使没有 shell 参与。
  • Phabricator 事后分析指出:-- 机制本身不安全——代码看起来正确且能正常工作,直到某个参数以破折号开头。

金句

The failure mode has its own CWE, CWE-88, and it is distinct from command injection because there is no shell involved.
back to Lobsters