GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。近日研究者发现在其多个版本中存在文件读取漏洞 (CVE-2016-9086) 和 任意用户 authentication_token 泄漏漏洞,攻击者可以通过这两个漏洞来获取管理员的权限,进而控制所有 gitlab 项目。
影响版本:
任意文件读取漏洞 (CVE-2016-9086):GitLab CE/EEversions 8.9, 8.10, 8.11, 8.12, and 8.13
任意用户 authentication_token 泄露漏洞:Gitlab CE/EE versions 8.10.3-8.10.5
本文在前辈研究基础上只分析任意斍读取漏洞。
从 8.9.0 版本开始,GitLab 新增了导入导出项目的功能。一个空的 gitlab 项目导出后结构如下:
VERSION ? ? ? ? # GitLab 的导出模块的版本
project.json ? ? # 包含了项目的配置文件
当我们导入 GitLab 的导出文件的时候,GitLab 会按照如下步骤处理:
服务器根据 VERSION 文件内容检测导出文件版本,如果版本符合,则导入。
服务器根据 Project.json 文件创建一个新的项目,并将对应的项目文件拷贝到服务器上对应的位置。
检测 VERSION 文件的代码位于:中:
... def check! version=File.open(version_file, &:readline) verify_version!(version) rescue=> e shared.error(e) false end ... def verify_version!(version) if Gem::Version.new(version) !=Gem::Version.new(Gitlab::ImportExport.version) raise Gitlab::ImportExport::Error.new("Import version mi *** atch: Required #{Gitlab::ImportExport.version} but was #{version}") else true end end ...
我们可以看到这里的逻辑是读取 VERSION 文件的之一行赋值给变量 version,然后检测 verison 与当前版本是否相同,相同返回 true,不相同则返回错误信息 (错误信息中包括变量 version 的值). 于是漏洞发现者 Jobert Abma 巧妙的使用了软链接来达到读取任意文件的目的。首先,我们给 VERSION 文件加上软链接并重新打包。
ln -sf /etc/passwd VERSION tar zcf change_version.tar.gz https://www.freebuf.com/articles/web/
这样,读取 VERSION 文件的时候服务器就会根据软链接读取到 /etc/passwd 的之一行内容并赋值给 version。但是由于 version 与当前版本不相同,所以会输出 version 的值,也就是 /etc/passwd 之一行的内容。
但是,如果只读取任意文件的之一行,能做的事情还是太少了。漏洞发现者显然不满足这一结果,他继续找了下去.读取 Project.json 这一配置文件的代码位于:/lib/gitlab/import_export/project_tree_restorer.rb 中:
... def restore json=IO.read(@path) tree_hash=ActiveSupport:: *** ON.decode(json) project_members=tree_hash.delete('project_members') ActiveRecord::Base.no_touching do create_relations end rescue=> e shared.error(e) false end ...
在这里,我们可以再次使用软链接使变量 json 获取到任意文件的内容,但是由于获取的文件不是 json 格式,无法 decode,导致异常抛出,最终在前端显示出任意文件的内容。 添加软链接并打包:
ln -sf /etc/passwd project.json tar zcf change_version.tar.gz https://www.freebuf.com/articles/web/
如下测试环境借助 vulhub 的 docker 镜像,附上 P 师傅的链接:https://github.com/vulhub/vulhub
编译及运行环境:
docker-compose up -d
请使用 2G 及以上内存的 VPS 或虚拟机运行该环境,实测 1G 内存的机器无法正常运行 Gitlab(运行后 502 错误)。
环境运行后,Web 端口为 10080,ssh 端口为 10022。访问 ,设置管理员(用户名 )密码,登录。
新建一个项目,点击 :
将 test.tar.gz上传,将会读取到 文件内容:
漏洞修复
官方先移除了导入包里的软连接,其次,读取 VERSION 的内容和 project.json 的内容出错后将内容输出到日志里而非返回到前端。
https://github.com/gitlabhq/gitlabhq/commit/912e1ff4284eb39fe020b8e823085a2cb7f244fb
http://paper.seebug.org/104/
补血的食物有哪些(补血的食物有哪些)很多人一说到补血,就会想到用红枣和阿胶以及红糖水等食物补血。但是最近听说这些补血食物并不是很靠谱,更不能达到很好的补血效果,这到底是怎么回事呢?红枣和红糖以及阿胶真...
很多圆脸的小可爱们在发型方面都会很烦恼,就会问圆脸适合长发还是短发?直发还是卷发?其实圆脸主要是会显得人胖嘟嘟的,哪怕是瘦了脸也依旧胖胖的,有时候发型没选好就会显得脸又圆又大。补救圆脸主要就是拉长脸型...
少女大人裴昭是谁演的 揭扮演者张凌赫资料颜值超高 陈瑶出演的《少女大人》开播后引起了大家的关注,陈瑶在《少女大人》里扮演聪慧简直无敌的恋爱新手苏瓷,都很好奇苏瓷的官配裴昭到底是谁演的,裴昭扮演者张凌赫...
小程序【西南西北特色旅游】已全新上线 世界那么大,总得去看看 “想要带你去浪漫的土耳其,然后一起去东京和巴黎……”正如歌词中说的一样,旅游,一直以来都是大众所追求的乐趣。有人...
H5如此势头,不得不让营销人对H5页面的未来充满了期待,越来越多的人开始在营销中运用H5页面。其实H5的叫法有很多,像什么手机微杂志,场景应用,微海报等等。如果你不怕咬到舌头还可以叫它HTML5。...
黑客教你定位微信地址 最近,通过微信发送照片时,选择“发送原图”可能会泄露拍摄地点。有专家表示,确实如此,但必须同时满足三个条件:1手机GPS定位开...