当前位置:安全客 >> 知识详情

【漏洞分析】SSH 命令注入漏洞(CVE-2017-1000117)分析

2017-08-11 20:22:37 阅读:32848次 收藏 来源: 安全客 作者:360CERT

http://p1.qhimg.com/t018cb63d23cd3ede47.png


作者:RickyHao & C1tas@360CERT


0x00 背景介绍


A malicious third-party can give a crafted "ssh://..." URL to an unsuspecting victim, and an attempt to visit the URL can result in any program that exists on the victim's machine being executed. Such a URL could be placed in the .gitmodules file of a malicious project, and an unsuspecting victim could be tricked into running "git clone --recurse-submodules" to trigger the vulnerability.

-- https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1466490.html  

在2017年8月10日Junio C Hamano发布了这一问题。


0x01 漏洞概述


恶意人员可以通过巧妙构造“ssh://…”链接,让受害人在执行程序等情况下访问该恶意链接,从而达到命令执行的目的。该链接可以被放在 git项目的 .gitmodules 文件下,这样当受害人对一个项目进行

git clone --recurse-submodules

操作时,就会引发安全问题。

360CERT进行了紧急分析,目前该分析报告仅以Git为例,但漏洞影响包括但不限于Git,SVN,CVS,HG,Gitlab,GithubDesktop,SourceTree等。


0x02 漏洞攻击面影响


影响面

该漏洞主要由“ssh://…”链接造成,如Git,SVN,CVS,HG等工具,在解析SSH链接的时候都会触发这个漏洞。此外,若是其他程序在解析SSH链接的时候,不做相应的处理,就会触发该漏洞。

经过360CERT研判后确认,漏洞风险等级高,影响范围广

影响版本

Versions prior to 2.14.1 of the Git

修复版本

Git v2.14.1


0x03 漏洞详情


技术细节

该漏洞主要由于SSH链接在hostname部分,若是用“-”开头,那么会导致ssh命令将hostname误认为这是一个选项。因此,我们可以利用“-oProxyCommand”选项来达到命令执行的目的。

在进行git clone 时候会调用到git/connect.c

struct child_process *git_connect(int fd[2], const char *url,const char *prog, int flags)

函数。其接受到的参数url为命令中“git clone xxx://xxxxxxxxxx/xx(.git)”的xxx://xxxxxxxxxx/xx(.git)部分。在该函数中会对传入的这个字符串进行parse,提取其协议部分。在满足协议为ssh://的时候会进入该函数的else部分。

http://p1.qhimg.com/t0143ff77814ec26be8.png

然后根据下面的流程调用本地的ssh

http://p4.qhimg.com/t01063cd08341efaf10.png

首先获得本地的ssh路径,然后push进conn->args

然后获得url中ssh_host部分再拼接路径

最后调用start_command函数进行命令执行

start_command的定义在git/run-command.c

int start_command(struct child_process *cmd)

http://p7.qhimg.com/t01805b0a9cd9bbbad1.png

将传入的cmd经过处理赋值给argv

 http://p6.qhimg.com/t013d49a4921a828d36.png

经过execve这个函数进行命令执行。但是在这个这个命令执行的内容是 “/usr/bin/ssh `ssh_host` path”而ssh命令的-o参数在一定程度上是可以执行命令的

例如

ssh -oProxyCommand=gnome-calculator xxx

将会在本地打开gnome的计算器

所以如果我们在clone 操作的时候将连接指定为

git clone ssh://-oProxyCommand=gnome-calculator/cert

将取得同样的命令执行的效果

漏洞修复

在v2.14.1的commit中,可以看到git_connect函数中执行之前对ssh_host进行了验证

 http://p2.qhimg.com/t019a6d4aa0bbf7076a.png

验证内容为新增的这个函数

 http://p9.qhimg.com/t0156f0f3adc9af35a6.png

该函数对ssh_host的第一个字符进行了校验防止为"-"的情况抑制了向ssh传递参数的情况

并且在多处对传入的host,port都做了该函数的过滤


0x04 漏洞利用验证


http://p8.qhimg.com/t01c77666156ba1a819.png

http://p3.qhimg.com/t014e6e48ca16a9645d.png

注:利用演示 https://asciinema.org/a/v88k2fTHB3CXPnadOrM62pcAr


0x05 修复建议


a) 官方更新公告(非正式版本呢,需自行更新)

https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1466490.html

b) 目前各个发行版源还未更新修复版本v2.14.1,用户可以在 https://github.com/gitster/git上自行下载编译。

c) 未更新的用户,在clone项目的时候,请尽量注意 .gitmodules 等文件中有无恶意链接来预防安全问题。


0x06 时间线


2017-8-10  官方首次发布安全通告

2017-8-11  360CERT完成对漏洞的分析并形成报告


0x07 参考文档


https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1466490.html

https://github.com/gitster/git/commit/4274c698f46a9bc45834c4904e7e113450c042fb


本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4244.html

参与讨论,请先 | 注册 | 匿名评论
发布
用户评论
其名麻烦 2017-08-15 08:38:03
回复 |  点赞

这个漏洞编号,你……

77ca1k1k1 2017-08-11 23:21:57
回复 |  点赞

文章中带asciinema命令行演示

安全客官方微博 2017-08-11 21:02:40
回复 |  点赞

@樱花今天没有花瓣

樱花今天没有花瓣 2017-08-11 20:41:54
回复 |  点赞

mark

77ca1k1k1 2017-08-11 20:41:53
回复 |  点赞

six six six

查看更多