精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

當git遇上ssh——CVE-2017-1000117漏洞淺析

安全 應用安全
Git是一個開源的分布式版本控制系統,主要用于項目管理。而SSH是一種應用層的安全通信協議,最常用的就是為通信雙方在在不安全網絡上提供安全的遠程登錄。當他們二者相遇會發生什么有趣的事呢?這里以CVE-2017-1000117漏洞為例,簡要剖析該漏洞的成因及防護方法。

Git是一個開源的分布式版本控制系統,主要用于項目管理。

而SSH是一種應用層的安全通信協議,最常用的就是為通信雙方在在不安全網絡上提供安全的遠程登錄。

當他們二者相遇會發生什么有趣的事呢?這里以CVE-2017-1000117漏洞為例,簡要剖析該漏洞的成因及防護方法。

Git

漏洞相關信息:

版本控制軟件爆出遠程命令執行漏洞 涉及Git、SVN、Mercurial、CVS版本控制

簡述:幾個流行的版本控制系統受到可能嚴重的遠程命令執行漏洞的影響。受影響產品的開發人員本周發布了更新補丁來修補安全漏洞。該缺陷影響版本控制軟件, 如 Git (CVE-2017-1000117)、Apache Subversion (CVE-2017-9800)、Mercurial (CVE-2017-1000116) 和 CVS。由于CVS 系統上次更新已經是9年前的事情了, 因此沒有為它分配 CVE 標識符。

背景知識

ssh客戶端登錄時,有一個ProxyCommand選項,該選項的指定鏈接服務器時執行的命令。

  1. ProxyCommand 
  2.  
  3.    Specifies the command to use to connect to the server.  The 
  4.  
  5.    command string extends to the end of the line, and is executed 
  6.  
  7.    with the user’s shell.  In the command string, any occurrence 
  8.  
  9.    of ‘%h’ will be substituted by the host name to connect,‘%p’ 
  10.  
  11.    by the port, and ‘%r’ by the remote user name. 

該選項常用的場景是通過代理服務器與目標機器相連,因此被稱作ProxyCommand,如下圖。

本地的機器(Local)無法直接與目標機器(Target)相連,必須通過一個代理機器(Proxy)才能和目標機器建立連接。此場景多見于企業或有較強訪問控制的需求的地方。

因此在這種情況下,ssh客戶端可以采用ProxyCommand選項,通過下面命令最終和目標機器建立連接。

  1. ssh -o ProxyCommand=’ssh user@proxy nc %h 22′ user@Target 

加上ProxyCommand選項后。ssh客戶端會先用當前用戶的shell執行ProxyCommand中的內容。

例如下面的命令,在Linux桌面環境中執行,就會彈出gedit文本編輯器。

  1. ssh -oProxyCommand=gedit user@Target 

即便最后的user@hostname不合法,也不會影響ProxyCommand中先執行的命令,照樣可以彈出gedit。

好了介紹完了ProxyCommand,可以理解為這個選項如處理不當,是可以進行命令注入的!

CVE-2017-1000117漏洞

CVE-2017-1000117這個漏洞就是沒有正確處理ssh鏈接的請求,導致受害人通過Git版本控制系統,訪問惡意鏈接時,存在安全隱患,一旦黑客攻擊成功,可在受害人機器上執行任意命令。

git clone是Git版本控制系統中常用的將遠程倉庫克隆到本地的命令。當使用git clone訪問下面的惡意ssh鏈接時,會在本地執行命令,彈出gedit。

  1. git clone ssh://-oProxyCommand=”gedit /tmp/xxx” 

下面我們來詳細看一看其中的過程,當git遇上ssh后,最終是如何觸發這個漏洞執行的。

 

git客戶端在執行上面的命令后,通過一系列的參數解析后,進入git_connect函數,向git的服務端建立連接。

  1. struct child_process *git_connect(int fd[2], const char *url, 
  2. const char *prog, int flags) 
  3.  
  4.  
  5. char *hostandport, *path; 
  6.  
  7. struct child_process *conn = &no_fork; 
  8.  
  9. enum protocol protocol; 
  10.  
  11. struct strbuf cmd = STRBUF_INIT
  12.  
  13.   
  14.  
  15. /* Without this we cannot rely on waitpid() to tell 
  16.  
  17. * what happened to our children. 
  18.  
  19. */ 
  20.  
  21. signal(SIGCHLD, SIG_DFL); 
  22.  
  23.   
  24.  
  25. protocol = parse_connect_url(url, &hostandport, &path); 
  26.  
  27. if ((flags & CONNECT_DIAG_URL) && (protocol != PROTO_SSH)) { 
  28.  
  29. printf(“Diag: url=%s\n”, url ? url : “NULL”); 
  30.  
  31. printf(“Diag: protocol=%s\n”, prot_name(protocol)); 
  32.  
  33. printf(“Diag: hostandport=%s\n”, hostandport ? hostandport : “NULL”); 
  34.  
  35. printf(“Diag: path=%s\n”, path ? path : “NULL”); 
  36.  
  37. conn = NULL
  38.  
  39. } else if (protocol == PROTO_GIT) { 
  40.  
  41. ….. 
  42.  
  43. } else { 
  44.  
  45. conn = xmalloc(sizeof(*conn)); 
  46.  
  47. child_process_init(conn); 
  48.  
  49.   
  50.  
  51. strbuf_addstr(&cmd, prog); 
  52.  
  53. strbuf_addch(&cmd, ‘ ‘); 
  54.  
  55. sq_quote_buf(&cmd, path); 
  56.  
  57.   
  58.  
  59. /* remove repo-local variables from the environment */ 
  60.  
  61. conn->env = local_repo_env
  62.  
  63. conn->use_shell = 1
  64.  
  65. conn->in = conn->out = -1; 
  66.  
  67. if (protocol == PROTO_SSH) { 
  68.  
  69. const char *ssh; 
  70.  
  71. int putty = 0tortoiseplink = 0
  72.  
  73. char *ssh_host = hostandport
  74.  
  75. const char *port = NULL
  76.  
  77. transport_check_allowed(“ssh”); 
  78.  
  79. get_host_and_port(&ssh_host, &port); 
  80.  
  81.   
  82.  
  83. if (!port) 
  84.  
  85. port = get_port(ssh_host); 
  86.  
  87.   
  88.  
  89. ssh = getenv(“GIT_SSH_COMMAND”); 
  90.  
  91. if (!ssh) { 
  92.  
  93. const char *base; 
  94.  
  95. char *ssh_dup; 
  96.  
  97. /* 
  98.  
  99. * GIT_SSH is the no-shell version of 
  100.  
  101. * GIT_SSH_COMMAND (and must remain so for 
  102.  
  103. * historical compatibility). 
  104.  
  105. */ 
  106.  
  107. conn->use_shell = 0
  108.  
  109.   
  110.  
  111. ssh = getenv(“GIT_SSH”); 
  112.  
  113. if (!ssh) 
  114.  
  115. ssh = “ssh”; 
  116.  
  117.   
  118.  
  119. ssh_dup = xstrdup(ssh); 
  120.  
  121. base = basename(ssh_dup); 
  122.  
  123.   
  124.  
  125. free(ssh_dup); 
  126.  
  127.  
  128.   
  129.  
  130. argv_array_push(&conn->args, ssh); 
  131.  
  132.   
  133.  
  134. if (port) { 
  135.  
  136. /* P is for PuTTY, p is for OpenSSH */ 
  137.  
  138. argv_array_push(&conn->args, putty ? “-P” : “-p”); 
  139.  
  140. argv_array_push(&conn->args, port); 
  141.  
  142.  
  143. argv_array_push(&conn->args, ssh_host); 
  144.  
  145. } else { 
  146.  
  147. transport_check_allowed(“file”); 
  148.  
  149.  
  150. argv_array_push(&conn->args, cmd.buf); 
  151.  
  152.   
  153.  
  154. if (start_command(conn)) 
  155.  
  156. die(“unable to fork”); 
  157.  
  158.   
  159.  
  160. ….. 
  161.  
  162.  
  163.   
  164.  

git_connect函數的第二個參數url,即為傳入的ssh鏈接,在此例中為 “ssh://-oProxyCommand=gedit /tmp/xxx”。

在git_connect函數中通過parse_connect_url函數將待連接的url解析出來,返回url的主機名、相對路徑及url采用的協議。

 

https://github.com/git/git/blob/master/connect.c#L620

  1. /* 
  2.  
  3. * Extract protocol and relevant parts from the specified connection URL. 
  4.  
  5. * The caller must free() the returned strings. 
  6.  
  7. */ 
  8.  
  9. static enum protocol parse_connect_url(const char *url_orig, char **ret_host,  char **ret_path) 

對于正常的ssh鏈接,如 ssh://user@host.xzy/path/to/repo.git/,經parse_connect_url解析后,其返回的ret_host和ret_path的值應該為 user@host.xzy 和 /path/to/repo.git/ 。

但由于沒有對ssh做正確過濾及識別,對于惡意的ssh鏈接,返回的ret_host和ret_path的值則是 -oProxyCommand=gedit 和 /tmp/xxx ,誤將 -oProxyCommand=gedit 作為了主機名ret_host。

在后續處理中,git_connect得到本地ssh的路徑,將上面獲取的ssh host和path填充到struct child_process *conn中,再通過start_command調用本地ssh執行。

在start_command函數中,最終調用exec系列函數執行ssh,由于錯誤的把 -oProxyCommand=gedit 作為遠程待連接的host,最終引發了命令執行。

但像上面ssh://-oProxyCommand=”gedit /tmp/xxx”的鏈接比較暴露,直接在鏈接中就出現命令。比較隱蔽的方法是,在正常倉庫的目錄下建立一個子模塊submodule,而將惡意的ssh鏈接藏在.gitmodule文件中。

修復防護方法

看完上面漏洞發生的成因,其實可以發現這個過程就是git處理ssh這類智能協議的傳輸過程:ssh遠程登錄git服務器后,通過執行git-upload-pack處理下載的數據,這種處理方式較http啞協議傳輸更高效。

但是在這過程中,對一些惡意的ssh鏈接,沒有正確識別,在解析時誤將 -oProxyCommand 這類參數當做了遠程主機名host,從而產生了漏洞。

在新版本中,我們看到增加了對host和path的識別過濾。

對包含疑似命令的host和path及時進行了阻止,阻斷了漏洞的發生。

 

建議用戶及時排查,更新系統存在漏洞的Git版本,在日常通過Git進行項目管理時,仔細檢查項目中是否存在一些惡意ssh鏈接來預防安全問題。

原文鏈接:http://blog.nsfocus.net/git-ssh-cve-2017-1000117/

【本文是51CTO專欄作者“綠盟科技博客”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2013-05-22 09:33:09

交互設計設計時間

2016-10-21 15:57:39

Rust編輯語言Fedora

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2017-06-12 15:50:16

2017-05-25 22:20:05

2015-01-07 15:49:21

大數據SSD

2017-08-18 14:47:31

DDD微服務架構

2025-09-04 07:52:16

2017-06-28 11:34:55

銳捷 醫療 物聯網

2017-05-27 10:22:37

2017-05-08 07:07:50

2011-03-16 14:51:35

2017-09-11 13:55:30

前端JavaScript物聯網

2016-10-21 09:45:20

RustFedoraJava

2009-03-21 16:43:29

SOA虛擬化IT

2013-11-08 09:15:32

大數據平板電腦

2013-08-22 11:08:27

大數據商業只能Hadoop

2025-08-07 08:35:06

2022-06-27 13:56:10

設計模式緩存分布式系統

2017-05-16 14:38:25

點贊
收藏

51CTO技術棧公眾號

日韩手机在线观看视频| 亚洲综合自拍一区| 玖玖爱在线观看| 欧美日韩不卡| 日本一区二区三区久久久久久久久不| 国产精品午夜一区二区欲梦| 欧美成人一二三区| 尤物tv在线精品| 欧美日韩一级视频| 国产aaa免费视频| 国产精品久久一区二区三区不卡 | 狠狠操精品视频| 欧美极品视频| 2023国产精品| 2022国产精品| 中文在线免费观看| 99在线观看免费视频精品观看| 国产亚洲综合久久| 国产人妻精品午夜福利免费| 不卡亚洲精品| 黑人巨大精品欧美一区二区| 热这里只有精品| 青青青草原在线| 国产成人在线影院 | 欧美狂野激情性xxxx在线观| 国产一区二区影视| av一区二区不卡| 91久久爱成人| 91中文字幕在线播放| 久久国产高清| 性欧美亚洲xxxx乳在线观看| 国产美女久久久久久| 免费视频一区三区| 亚洲精品国产精品久久清纯直播 | av在线播放亚洲| 五月天婷婷在线视频| 久久久精品日韩欧美| 国产精品免费视频一区二区| 一级黄色a毛片| 免费在线播放第一区高清av| 久久青草精品视频免费观看| www青青草原| 99久久www免费| 色婷婷综合久久久久| 免费看污黄网站在线观看| 亚洲一区二区三区日本久久九| 欧美日韩亚洲不卡| wwww.国产| 91福利精品在线观看| 色欧美日韩亚洲| 久久久久久久久久久视频| 国产黄在线观看免费观看不卡| bt7086福利一区国产| 91久久国产综合久久蜜月精品 | 日精品一区二区三区| 91国语精品自产拍在线观看性色| 老妇女50岁三级| 97精品国产福利一区二区三区| 亚洲视频在线视频| 女人被狂躁c到高潮| 亚洲一区二区三区日本久久九| 日韩美女在线视频 | 欧美成人三级视频| 国产精品久久观看| 久久精品国产综合| 亚洲永久精品ww.7491进入| 老牛精品亚洲成av人片| 精品久久久三级丝袜| 99视频在线视频| 刘亦菲一区二区三区免费看| 一本一本大道香蕉久在线精品| 国产一线二线三线女| 男女在线观看视频| 亚洲午夜精品网| 日本人妻伦在线中文字幕| 在线中文字幕-区二区三区四区| 亚洲丝袜自拍清纯另类| 做爰高潮hd色即是空| 免费av毛片在线看| 亚洲免费观看高清完整版在线| 强开小嫩苞一区二区三区网站| 动漫一区在线| 亚洲午夜精品网| 日韩激情免费视频| 日韩精品三区| 欧美肥胖老妇做爰| 人妻少妇偷人精品久久久任期| 亚洲专区**| 亚洲电影免费观看高清完整版在线观看 | 麻豆视频在线免费观看| 亚洲欧美日韩国产综合| 99中文字幕在线观看| 美女精品导航| 丁香五六月婷婷久久激情| 日韩av片在线看| 婷婷午夜社区一区| 欧美性三三影院| 久久精品一二三四| 成人午夜网址| 亚洲欧美国产日韩天堂区| 91成人精品一区二区| 午夜精品毛片| 国模视频一区二区三区| 国产伦精品一区二区三区视频我| 美女性感视频久久| 99免费在线观看视频| 亚洲三区在线播放| 成人欧美一区二区三区黑人麻豆 | 国产成人精品一区二区在线| 波多野结衣影片| 国产精品影视天天线| 久久久久久久有限公司| 天堂地址在线www| 亚洲mv在线观看| 中文字幕天天干| 成人h动漫精品一区二区器材| 亚洲欧美日韩中文在线| 91九色丨porny丨极品女神| 亚洲欧美日韩视频二区| 国产精品自拍网| 亚洲aaa在线观看| 国产三级欧美三级| 久草热视频在线观看| 亚洲精品777| 日韩精品免费在线观看| 天天做夜夜爱爱爱| 麻豆精品网站| 99re在线观看| 国产精品一级伦理| 精品久久久免费| 99中文字幕在线| 免费看成人吃奶视频在线| 欧美黄色性视频| 91国在线视频| 久久午夜色播影院免费高清| 99久久99久久精品| 老司机2019福利精品视频导航| 欧美一区二区三区播放老司机| 中文字幕第4页| 国产欧美在线| 国产精品一区视频网站| 91中文在线| 欧美久久婷婷综合色| 亚洲天堂久久新| 国产精品亚洲综合色区韩国| 97国产超碰| 国产在线观看免费麻豆| 欧美性猛xxx| 欧美午夜精品一区二区| 99欧美视频| 国产精品影院在线观看| 国产日本在线| 日本久久精品电影| 人妻熟女aⅴ一区二区三区汇编| 好看的亚洲午夜视频在线| 成人h视频在线| 69久久精品| 欧美日韩日本视频| 香蕉网在线播放| 翔田千里一区二区| 噜噜噜噜噜久久久久久91| 九九色在线视频| 欧美一激情一区二区三区| 天堂а√在线中文在线鲁大师| 久久激情久久| 日韩中文一区二区三区| 婷婷午夜社区一区| 亚洲视频国产视频| 99成人精品视频| 国产精品家庭影院| 亚洲视频在线不卡| 欧美99在线视频观看| 99高清视频有精品视频| 国产丝袜在线观看视频| 亚洲精品一区二区精华| 日韩av免费网址| 91在线高清观看| 男人天堂网视频| av伊人久久| 国产激情视频一区| 国产精自产拍久久久久久蜜| 中文字幕在线观看你懂的| 日本一区二区综合亚洲| 亚洲欧美自偷自拍另类| 天天综合久久| 91精品久久香蕉国产线看观看| 亚洲www色| 亚洲第一视频网站| 精品人妻一区二区三区潮喷在线| 欧美国产日产图区| www.99在线| 国产精品7m凸凹视频分类| 91久久国产综合久久蜜月精品 | 国产精品久久久久久妇女6080| 日本人69视频| 韩国亚洲精品| 美女黄毛**国产精品啪啪| 福利一区视频| 久久99精品视频一区97| 亚洲三级黄色片| 欧美精品久久天天躁| 欧美一级特黄高清视频| 国产一区二区久久| 免费av观看网址| 青青草国产免费一区二区下载| 91精品在线观看视频| 7777kkk亚洲综合欧美网站| 亚洲色图第一页| 国产三级自拍视频| 欧美日韩国产麻豆| 亚洲综合久久av一区二区三区| av中文字幕亚洲| 天天影视色综合| 人人超碰91尤物精品国产| 丁香色欲久久久久久综合网| 欧美色图国产精品| 99精品99久久久久久宅男| 99久久久国产精品无码免费| 免费日韩一区二区三区| 136fldh精品导航福利| p色视频免费在线观看| 精品日韩av一区二区| 91在线看视频| 亚洲一区自拍偷拍| 九一在线免费观看| av电影天堂一区二区在线观看| 欧美女同在线观看| 性高湖久久久久久久久| 超级碰在线观看| 色88久久久久高潮综合影院| 精品九九九九| 欧美伊人亚洲伊人色综合动图| 热久久免费视频精品| 日韩少妇视频| 美女扒开尿口让男人操亚洲视频网站| 欧美18xxxxx| 精品国产青草久久久久福利| 97免费观看视频| 在线视频你懂得一区| www.国产成人| 中文字幕一区二区三区在线观看| 影音先锋制服丝袜| 99国产精品久| 国产人妻黑人一区二区三区| 国产一区在线看| 天天视频天天爽| 久久久久久久波多野高潮日日| 黄色一级大片免费| 加勒比久久综合| 久久涩涩网站| 欧美调教视频| 精品91免费| 久久精品色综合| 成人91视频| 日韩免费精品| 96久久精品| 亚洲国产精品免费视频| 91免费电影网站| 激情亚洲影院在线观看| 欧美中在线观看| 在线观看网站免费入口在线观看国内| 91禁外国网站| 性孕妇free特大另类| 992tv在线成人免费观看| caoporn视频在线| 97免费中文视频在线观看| аⅴ资源天堂资源库在线| 久久久久久久久久国产| 波多一区二区| 中文字幕日韩av资源站| 性刺激综合网| 成人午夜av| 亚洲乱码国产乱码精品天美传媒| 热久久天天拍国产| 在线观看日本一区| 欧美色综合网| 一区中文字幕在线观看| 欧美aa国产视频| 中文字幕无码精品亚洲资源网久久| 影音先锋中文字幕一区| av动漫在线看| 日韩国产高清影视| 亚洲欧洲日本精品| 国产不卡在线视频| 中文字幕在线播放视频| 久久九九久精品国产免费直播| 亚洲精品国产精品国自产网站| 国产精品网友自拍| 亚洲天堂黄色片| 精品动漫一区二区三区| 啦啦啦免费高清视频在线观看| 在线亚洲精品福利网址导航| 97av免费视频| 亚洲国产成人91精品| 久久精品国产亚洲a∨麻豆| 中文字幕一精品亚洲无线一区| 国精产品一区| 2019亚洲男人天堂| 成人全视频免费观看在线看| 国产九区一区在线| 最新国产一区| av磁力番号网| 嫩草成人www欧美| 亚洲一二三不卡| aaa欧美色吧激情视频| 天天躁日日躁aaaa视频| 夜夜嗨av一区二区三区| 久久国产乱子伦精品| 日韩一区二区免费在线电影| 日本五码在线| 久久国产精品首页| 成人影院入口| 亚洲一区二区三区sesese| 六月丁香久久丫| 樱花www成人免费视频| 99riav1国产精品视频| 爱豆国产剧免费观看大全剧苏畅| 成人爱爱电影网址| 91av手机在线| 欧美性猛交xxxx乱大交| 丰满人妻一区二区三区免费| 中文字幕久久精品| 性欧美18xxxhd| 97久久精品午夜一区二区| 日产精品一区二区| 日本a在线免费观看| 日本va欧美va瓶| 谁有免费的黄色网址| 亚洲va在线va天堂| 不卡视频免费在线观看| 最近2019中文字幕大全第二页| 国产在线精彩视频| 成人欧美一区二区三区在线| 色综合色综合| 久久精品午夜福利| 99久久亚洲一区二区三区青草| 亚洲色偷偷综合亚洲av伊人| 91福利国产成人精品照片| 色网站免费观看| 久久久在线免费观看| 国产成人久久精品一区二区三区| 日韩欧美视频一区二区| 国产欧美精品| 天天插天天射天天干| 亚洲一区二区在线免费观看视频| va视频在线观看| 日韩一级黄色av| 另类一区二区三区| 日本在线免费观看一区| 欧美综合二区| 成人免费av片| 欧美性感一类影片在线播放| 青青草观看免费视频在线| 26uuu国产精品视频| 欧美日韩导航| 国产亚洲黄色片| 国产精品一区二区久久不卡 | 激情小说亚洲色图| 在线观看污视频| 蜜臂av日日欢夜夜爽一区| 亚洲色图27p| 777a∨成人精品桃花网| 欧美a免费在线| 91久久久精品| 伊人青青综合网| 天天久久综合网| 亚洲一级电影视频| 亚洲免费成人在线| 91精品国产色综合| 亚洲都市激情| 中文字幕第36页| 国产女同互慰高潮91漫画| 丰满熟女人妻一区二区三| 中文字幕视频一区二区在线有码 | 男人的天堂在线视频免费观看 | 一区二区激情| 成人h动漫精品一区| 91久久线看在观草草青青| 成黄免费在线| 国产精品视频区| 99精品在线| 日韩精品人妻中文字幕有码 | 国产午夜精品视频一区二区三区| 国产成人自拍在线| 香蕉影院在线观看| 色综合伊人色综合网站| 亚洲青青久久| 久久人人爽人人爽人人av| 91在线小视频| 福利网址在线观看| 久久中文久久字幕| 久久综合社区| 五月天激情视频在线观看| 亚洲精品国产第一综合99久久| 欧美一区二不卡视频| 欧美在线视频一区二区| 亚洲有吗中文字幕| 人妻av一区二区| 欧美午夜影院一区| 免费影视亚洲|