恶意SSH链接导致的命令执行漏洞分析
字数 1844 2025-08-18 11:36:57

SSH协议URL命令执行漏洞分析与防护指南

一、漏洞概述

1.1 漏洞基本信息

  • 漏洞类型:客户端命令执行漏洞
  • 影响协议:SSH协议URL处理
  • 漏洞编号
    • Git: CVE-2017-1000117
    • Apache Subversion: CVE-2017-9800
    • Mercurial: CVE-2017-1000116
  • 发现者:GitLab的Brian Neel、Recurity Labs的Joan Schneeweiss和GitHub的Jeff King

1.2 漏洞影响范围

  • Git

    • Git < v2.7.6
    • Git v2.8.6
    • Git v2.9.5
    • Git v2.10.4
    • Git v2.11.3
    • Git v2.12.4
    • Git v2.13.5
  • Apache Subversion

    • 1.0.0 through 1.8.18 (inclusive)
    • 1.9.0 through 1.9.6 (inclusive)
    • 1.10.0-alpha3
  • Mercurial

    • Mercurial < 4.3

1.3 漏洞利用条件

  • 攻击者构造恶意SSH URL
  • 受害者访问该URL或执行相关操作
  • 通常结合社会工程学进行远程钓鱼攻击

二、漏洞原理深度分析

2.1 漏洞核心机制

该漏洞源于SSH客户端对URL中hostname部分的解析缺陷。当hostname以"-"开头时,SSH客户端会将其误认为命令行选项而非主机名。

2.2 技术细节

  1. 恶意URL构造

    • 攻击者可构造形如ssh://-oProxyCommand=恶意命令/的URL
    • 示例:ssh://-oProxyCommand=gnome-calculator/cert
  2. Git处理流程

    • git clone操作会调用git/connect.c中的git_connect()函数
    • 该函数解析URL并提取协议部分
    • 对于SSH协议,会拼接本地SSH路径和host部分
    • 最终通过start_command()执行命令
  3. 命令执行点

    int start_command(struct child_process *cmd)
    
    • 将传入的cmd参数处理后赋值给argv
    • 通过execve执行命令
    • 执行内容为/usr/bin/ssh ssh_host path
  4. SSH选项注入

    • SSH的-oProxyCommand选项可执行任意命令
    • 例如:ssh -oProxyCommand=gnome-calculator xxx会执行计算器

2.3 典型利用场景

  1. 通过.gitmodules文件

    [submodule "git"]
    path = git
    url = ssh://-oProxyCommand=sh<payload/wat
    
    • 当执行git clone --recurse-submodules时会触发漏洞
  2. 直接克隆恶意仓库

    git clone ssh://-oProxyCommand=恶意命令/cert
    

三、漏洞验证与复现

3.1 实验环境准备

  1. 确认Git版本:

    git --version
    

    确认版本在受影响范围内

  2. 创建验证目录:

    mkdir -p /var/www/html
    

3.2 漏洞复现步骤

  1. 克隆恶意仓库:

    git clone --recurse-submodules "http://172.16.12.2:8080/root/CVE-2017-1000117.git"
    
    • 仓库中包含恶意.gitmodules文件
  2. 验证命令执行:

    • 恶意命令示例:id > /var/www/html/vuls
    • 检查命令执行结果:
      ls -al /var/www/html/vuls
      cat /var/www/html/vuls
      

四、漏洞修复方案

4.1 官方修复措施

Git在v2.14.1版本中进行了修复:

  1. git_connect()函数中添加了对ssh_host的验证
  2. 新增验证函数检查host第一个字符是否为"-"
  3. 对传入的host和port进行了全面过滤

4.2 升级建议

  • Git:升级到v2.14.1或更高版本
  • Apache Subversion
    • 升级到1.8.19
    • 或1.9.7版本
  • Mercurial
    • 升级到4.3
    • 或4.2.3版本

4.3 临时缓解措施

  1. 避免使用--recurse-submodules选项
  2. 谨慎处理来源不明的SSH URL
  3. 对开发团队进行安全意识培训

五、安全建议

  1. 版本管理

    • 定期检查并更新版本控制系统
    • 建立软件资产清单,跟踪所有开发工具版本
  2. 代码审查

    • 审查所有.gitmodules文件内容
    • 特别关注SSH URL格式
  3. 权限控制

    • 限制开发环境的命令执行权限
    • 使用最小权限原则运行Git客户端
  4. 监控措施

    • 监控异常的命令执行行为
    • 记录和分析Git操作日志
  5. 安全意识

    • 培训开发人员识别恶意URL
    • 建立安全的代码获取流程

六、总结

该SSH协议URL命令执行漏洞影响广泛,涉及多个主流版本控制系统。攻击者可通过精心构造的SSH URL在受害者机器上执行任意命令,危害严重。各组织应及时升级受影响软件,同时加强开发环境的安全防护措施,防范此类攻击。

SSH协议URL命令执行漏洞分析与防护指南 一、漏洞概述 1.1 漏洞基本信息 漏洞类型 :客户端命令执行漏洞 影响协议 :SSH协议URL处理 漏洞编号 : Git: CVE-2017-1000117 Apache Subversion: CVE-2017-9800 Mercurial: CVE-2017-1000116 发现者 :GitLab的Brian Neel、Recurity Labs的Joan Schneeweiss和GitHub的Jeff King 1.2 漏洞影响范围 Git : Git < v2.7.6 Git v2.8.6 Git v2.9.5 Git v2.10.4 Git v2.11.3 Git v2.12.4 Git v2.13.5 Apache Subversion : 1.0.0 through 1.8.18 (inclusive) 1.9.0 through 1.9.6 (inclusive) 1.10.0-alpha3 Mercurial : Mercurial < 4.3 1.3 漏洞利用条件 攻击者构造恶意SSH URL 受害者访问该URL或执行相关操作 通常结合社会工程学进行远程钓鱼攻击 二、漏洞原理深度分析 2.1 漏洞核心机制 该漏洞源于SSH客户端对URL中hostname部分的解析缺陷。当hostname以"-"开头时,SSH客户端会将其误认为命令行选项而非主机名。 2.2 技术细节 恶意URL构造 : 攻击者可构造形如 ssh://-oProxyCommand=恶意命令/ 的URL 示例: ssh://-oProxyCommand=gnome-calculator/cert Git处理流程 : git clone 操作会调用 git/connect.c 中的 git_connect() 函数 该函数解析URL并提取协议部分 对于SSH协议,会拼接本地SSH路径和host部分 最终通过 start_command() 执行命令 命令执行点 : 将传入的cmd参数处理后赋值给argv 通过 execve 执行命令 执行内容为 /usr/bin/ssh ssh_ host path SSH选项注入 : SSH的 -oProxyCommand 选项可执行任意命令 例如: ssh -oProxyCommand=gnome-calculator xxx 会执行计算器 2.3 典型利用场景 通过.gitmodules文件 : 当执行 git clone --recurse-submodules 时会触发漏洞 直接克隆恶意仓库 : 三、漏洞验证与复现 3.1 实验环境准备 确认Git版本: 确认版本在受影响范围内 创建验证目录: 3.2 漏洞复现步骤 克隆恶意仓库: 仓库中包含恶意 .gitmodules 文件 验证命令执行: 恶意命令示例: id > /var/www/html/vuls 检查命令执行结果: 四、漏洞修复方案 4.1 官方修复措施 Git在v2.14.1版本中进行了修复: 在 git_connect() 函数中添加了对 ssh_host 的验证 新增验证函数检查host第一个字符是否为"-" 对传入的host和port进行了全面过滤 4.2 升级建议 Git :升级到v2.14.1或更高版本 Apache Subversion : 升级到1.8.19 或1.9.7版本 Mercurial : 升级到4.3 或4.2.3版本 4.3 临时缓解措施 避免使用 --recurse-submodules 选项 谨慎处理来源不明的SSH URL 对开发团队进行安全意识培训 五、安全建议 版本管理 : 定期检查并更新版本控制系统 建立软件资产清单,跟踪所有开发工具版本 代码审查 : 审查所有.gitmodules文件内容 特别关注SSH URL格式 权限控制 : 限制开发环境的命令执行权限 使用最小权限原则运行Git客户端 监控措施 : 监控异常的命令执行行为 记录和分析Git操作日志 安全意识 : 培训开发人员识别恶意URL 建立安全的代码获取流程 六、总结 该SSH协议URL命令执行漏洞影响广泛,涉及多个主流版本控制系统。攻击者可通过精心构造的SSH URL在受害者机器上执行任意命令,危害严重。各组织应及时升级受影响软件,同时加强开发环境的安全防护措施,防范此类攻击。