旧树开新花——再谈 GitHub 监控

作者:[Tencent Blade Team] 彦修

公众号:腾讯安全应急响应中心

本文不涉及常见的基于代码关键字匹配的GitHub监控。而是从GitHub的账户出发,通过人的关系来获得一些代码搜索不具有的优势。

疑云乍现

问题要从一个晴朗而又妩媚的下午说起,我喝着娃哈哈,看着自认为世界上最优雅的代码,然而当我上传到GitHub私有仓库的时候,嘴角的一抹笑意停留在10秒24毫秒前的阳光下,因为我发现上传显示的用户并非是我,换句话说,commit页面并未显示我帅气的头像,我的职业第二敏感性告诉我,这个事情有点蹊跷:

a. 这个人是谁?

b. 我的机器被劫持了?

c.我的账户被黑了?

d. GitHub出问题了?

e. 某些未知原因?

a问题是比较好回答的,点进去发现是一个非常正常的用户,我总不至于被黑了,不行,职业尊严让我强制排除了这个选项,但是我比较关心的一个问题是ta是不是能看到我的代码?ta会不会因为如此优雅的代码而感到自愧不如?所以随后出于对他情感的考虑先清空了自己的代码。

对于b,更换了多台机器,发现仍然具有相同的问题,同样出于职业尊严,我的机器不可能都被黑了,所以问题坚决不在b。

随后又细细过滤了最近的GitHub登录记录,c的可能性也被排除了;再问周围的童鞋,d的问题也被排除了。

目前只剩下e原因,但是这句话其实相当于没有说,因为一切未知都能归结到未知。

刨根问底

问题在这已经陷入了死胡同,简单描述下就是:因为某些未知原因,我的GitHub的提交人变成了未知的某人,而且在换了多台机器之后,问题依然重复。一般遇到这种情况,我的习惯都是从头梳理整个流程,从全局分析可能存在问题的环节。当务之急是需要重新梳理下所有的流程,然后不断尝试,那么问题来了,从编写代码到下载Git并使用Git提交到GitHub的流程是什么呢?

Git首先需要下载到本地,下载本地的时候需要使用HTTP协议,HTTP协议是基于TCP的,说到TCP,那么就要了解三次握手…….

半小时后……

看着16位微处理器芯片8086微处理器总线接口部分(BIU) 和 执行部件(EU)知识的我……感觉再深挖下去估计要开始学习二氧化硅的化学反应了,呵,知识啊!

只好另辟蹊径,找了一个熟悉Git的强力外援,我们先尝试了……然后尝试了……接着又尝试了……终于功夫不负有心人,找到了最后的症结所在。不是故意跳过这段,实在是这个过程乏善可陈。

总之看下边重点了:

这个问题引发的根本原因是使用某发行版源仓库安装的Git默认内置了一个邮箱和用户名,然后GitHub在上传的时候识别用户是默认通过Git中配置的邮箱来识别,倘若用户邮箱存在(在GitHub注册或者登记)则显示匹配到的用户名,否则会显示Git配置中的用户名,验证之后发现这个邮箱不一定是注册邮箱,而是在设置里添加的都可以关联到,也就是刚刚提到的登记邮箱,即使你没有验证邮箱的归属权限,如下图。

而且尤其比较诡异的是使用Git config user.name 和Git config user.email这两个命令查看均显示为空,就像这个命令从未执行一样,但是在使用Git log的时候才会真正显示提交本次commit的用户名和邮箱,也就是该发行版Git内置的缺省账户和邮箱。

拨云见日

上边说了那么多,那么这个东西有什么用呢?我一直秉承一个观点:安全总是跟场景相关的,所以要想知道这个有什么危害,首先需要做的就是设想一些可利用的场景。

在这里最基本的利用方式是可以伪造别人去提交代码,但是这个对我们来说其实并没有什么太大的用处。准确来说,更多有一种恶作剧的味道。

那有没有什么其他的场景是比较有用的,其实在写这篇文章之前,我还是比较犹豫的,众所周知,GitHub有很多用户提交了一些比较敏感的东西,而作者是不想在现实中被发现的,但是上述提到这个接口,可以通过批量爆破邮箱从而获得对应的用户名。那么也有可能获得了那些不愿意公开自己身份用户的联系方式。

扯的有点远了,还是回归到题目当中GitHub监控的问题,当前GitHub监控一直是基于代码搜索中的关键字匹配,真的是谁用谁知道——那是相当的难用。所以目前很多人也是在爬虫和更好的过滤上下功夫。但是这个流程还有一个盲点存在,就是在发现违规上传的第一时间并不能特别准确的定位到具体的个人。

说完传统监控的缺陷同时,我们其实也找到了新的利用场景,因为入职信息登记都会写到自己的常用邮箱(还没有入职,所以基本填写自己私人常用邮箱),那么可以通过这个接口来获得对应的用户账户,换句话说,安全团队基本就有了部分员工注册的GitHub账户,这个时候违规上传公司代码的监控是不是可以做一些分级管理,重点监控。而且更重要的一点,这也解决了发现问题简单、定位人员困难的问题。

至于操作过程,就相当简单了,新建一个项目,然后使用脚本修改自己用户邮箱进行commit,在这里我以修改自己的邮箱为例:

之后push到GitHub上去,最后在GitHub上就可以看到绑定了对应邮箱的用户,如下图(项目地址:github.com/daysdaysup/TSRC_TEST">https://github.com/daysdaysup/TSRC_TEST):

至于剩下的就不用再多说了。套用一句比较流行的打油诗:懂的自然懂,刀剑侠客梦,事了拂衣去,深藏身与名。

最后特别致谢我的师兄吴恒,感谢他在撰写本文时提供的帮助。

以上是 旧树开新花——再谈 GitHub 监控 的全部内容, 来源链接: utcz.com/p/199264.html

回到顶部