恶意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 技术细节
-
恶意URL构造:
- 攻击者可构造形如
ssh://-oProxyCommand=恶意命令/的URL - 示例:
ssh://-oProxyCommand=gnome-calculator/cert
- 攻击者可构造形如
-
Git处理流程:
git clone操作会调用git/connect.c中的git_connect()函数- 该函数解析URL并提取协议部分
- 对于SSH协议,会拼接本地SSH路径和host部分
- 最终通过
start_command()执行命令
-
命令执行点:
int start_command(struct child_process *cmd)- 将传入的cmd参数处理后赋值给argv
- 通过
execve执行命令 - 执行内容为
/usr/bin/sshssh_hostpath
-
SSH选项注入:
- SSH的
-oProxyCommand选项可执行任意命令 - 例如:
ssh -oProxyCommand=gnome-calculator xxx会执行计算器
- SSH的
2.3 典型利用场景
-
通过.gitmodules文件:
[submodule "git"] path = git url = ssh://-oProxyCommand=sh<payload/wat- 当执行
git clone --recurse-submodules时会触发漏洞
- 当执行
-
直接克隆恶意仓库:
git clone ssh://-oProxyCommand=恶意命令/cert
三、漏洞验证与复现
3.1 实验环境准备
-
确认Git版本:
git --version确认版本在受影响范围内
-
创建验证目录:
mkdir -p /var/www/html
3.2 漏洞复现步骤
-
克隆恶意仓库:
git clone --recurse-submodules "http://172.16.12.2:8080/root/CVE-2017-1000117.git"- 仓库中包含恶意
.gitmodules文件
- 仓库中包含恶意
-
验证命令执行:
- 恶意命令示例:
id > /var/www/html/vuls - 检查命令执行结果:
ls -al /var/www/html/vuls cat /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在受害者机器上执行任意命令,危害严重。各组织应及时升级受影响软件,同时加强开发环境的安全防护措施,防范此类攻击。