从MONGODB “赎金事件” 看安全问题

2017-01-09 03:47:56 来源:济宁新闻网

今天上午(2017 年 1 月 7 日),我的微信群中同时出现了两个 MongoDB 被黑掉要赎金的情况,于是在调查过程中,发现了这个事件。这个事件应该是 2017 年开年的第一次比较大的安全事件吧,发现国内居然没有什么报道,国内安全圈也没有什么动静(当然,他们也许知道,只是不想说吧),Anyway,让我这个非安全领域的人来帮补补位。

事件回顾

这个事情应该是从 2017 年 1 月 3 日进入公众视野的,是由安全圈的大拿Victor Gevers(网名:0xDUDE,GDI.foundation的 Chairman),其实,他早在 2016 年 12 月 27 日就发现了一些在互联网上用户的 MongoDB 没有任何的保护措施,被攻击者把数据库删除了,并留下了一个叫 WARNING 的数据库,这张表的内容如下:

{    "_id" : ObjectId ("5859a0370b8e49f123fcc7da"),    "mail" : "harak1r1@sigaint.org",    "note" : "SEND 0.2 BTC TO THIS ADDRESS 13zaxGVjj9MNc2jyvDRhLyYpkCh323MsMq AND CONTACT THIS EMAIL WITH YOUR Ip OF YOUR SERVER TO RECOVER YOUR DATABASE !"}

基本上如下所示:

MongoDB ransom demand (via Victor Gevers)

MongoDB ransom demand (via Victor Gevers)

说白了就是黑客留下的东西老子把你的 MongoDB 里的数据库给转走了,如果你要你的数据的话,给我 0.2 个的比特币(大约 USD200)。然后,他的 twitter 上不断地发布这个赎金事件的跟踪报道。与此同时,中国区的 V2EX 上也发现了相关的攻击问题 《自己装的 mongo 没有设置密码结果被黑了》

然后,在接下来的几天内,全球大约有 1800 个 MongoDB 的数据库被黑,这个行为来自一个叫 Harak1r1 的黑客组织(这个组织似乎就好黑 MongoDB,据说他们历史上干了近 8500 个 MongoDB 的数据库,几乎都是在祼奔的 MongoDB)。

不过,这个组织干了两天后就停手了,可能是因为这事已经引起了全球科技媒体的注意,产生了大量的报道(如果你在 Google News 里查一下mongodb ransom,你会看到大量的报道(中文社区中,只有台湾有相关的报道)),他们也许是不敢再搞下去了。

不过,很快,有几个 copycats 开始接着干,

马上跟进的是 own3d ,他们留下的数据库的名字叫 WARNING_ALERT,他们至少干掉了 930 个 MongoDB,赎金 0.5 个比特币(USD500),至少有 3 个用户付费了

然后是 0704341626asdf,他们留下的数据库名字叫 pWNED,他们至少干掉了 740 个 MongoDB,赎金 0.15 个比特币(USD150),看看他们在数据库里留下的文字你的 MongoDB 没有任何的认证,并且暴露在公网里(你 TMD 是怎么想的?)

0704341626asdf group ransom note (via Victor Gerves)

0704341626asdf group ransom note (via Victor Gerves)

就在这两天,有两个新的黑客也来了

先是 kraken0,发现到现在 1 天了,干了 13 个 MongoDB,赎金 0.1 个比特币。然后是 3lix1r,发现到现在 5 个小时,干了 17 个 MongoDB,赎金 0.25 比特币。

BBC 新闻也于昨天报道了这一情况《Web databases hit in ransom attacks》,现在这个事情应该是一个 Big News 了。

关于 MongoDB 的安全

安全问题从来都是需要多方面一起努力,但是安全问题最大的短板就是在用户这边。这次的这个事,说白了,就是用户没有给 MongoDB 设置上用户名和口令,然后还把服务公开到了公网上。

是的,这个安全事件,相当的匪夷所思,为什么这些用户要在公网上祼奔自己的数据库?他们的脑子是怎么想的?

让我们去看一下 Shodan 上可以看到的有多少个在暴露在公网上而且没有防范的 MongoDB?我了个去!4 万 7 千个,还是很触目惊心的(下图来自我刚刚创建的Shodan 关于 MongoDB 的报表)

那么,怎么会有这么多的对外暴露的 MongoDB?看了一下 Shodan 的报告,发现主要还是来自公有云平台,Amazon,Alibaba,Digital Ocean,OVH,Azure 的云平台上有很多这样的服务。不过,像 AWS 这样的云平台,有很完善的默认安全组设置和 VpC 是可以不把这样的后端服务暴露到公有云上的,为什么还会有那么多?

这么大量的暴露在公网上的服务是怎么回事?有人发现(参看这篇文章《Its the Data, Stupid!》 ),MongoDB 历史上一直都是把侦听端口绑在所有的 Ip 上的,这个问题在 5 年前(2011 年 11 月)就报给了 MongoDB (SERVER-4216),结果 2014 年 4 月才解决掉。所以,他觉得可能似乎 MongoDB 的 2.6 之前的版本都会默认上侦听在 0.0.0.0 。

于是我做了一个小试验,到我的 Ubuntu 14.04 上去apt-get install mongodb(2.4.9 版),然后我在/etc/mongodb.conf文件中,看到了默认的配置是 127.0.0.1,mongod 启动也侦听在了 127.0.0.1 这台机器上。一切正常。不过,可能是时过境迁,debain 的安装包里已加上了这个默认配置文件。不管怎么样,MongoDB 似乎是有一些问题的。

再到 Shodan 上看到相关的在公网裸奔的 MongoDB 的版本如下,发现 3.x 的也是主流:

虽然,3.x 的版本成为了主流,但是似乎,还是有很多人把 MongoDB 的服务开到了互联网上来,而且可以随意访问。

你看,我在阿里云随便找了几台机器,一登就登上去了。

真是如那些黑客中的邮件所说的:WTF,你们是怎么想的?

后续的反思

为什么还是有这么多的 MongoDB 在公网上祼奔呢?难道有这么多的用户都是小白?这个原因,是什么呢?我觉得可能会是如下两个原因:

1)一是技术人员下载了 mongod 的软包,一般来说,mongodb 的压缩包只有 binary 文件 ,没有配置文件 ,所以直接解开后运行,结果就没有安全认证,也绑在了公网上。也许,MongoDB 这么做的原因就是为了可以快速上手,不要在环境上花太多的时间,这个有助于软件方面的推广。但是,这样可能就坑了更多的人。

2)因为 MongoDB 是后端基础服务,所以,需要很多内部机器防问,按道理呢,应该绑定在内网 Ip 上,但是呢,可能是技术人员不小心,绑在了 0.0.0.0 的 Ip 上。

那么,这个问题在云平台上是否可以更好的解决呢?

关于公网的 Ip。一般来说,公有云平台上的虚拟主机都会有一个公网的 Ip 地址,老实说,这并不是一个好的方法,因为有很多主机是不需要暴露到公网上的,所以,也就不需要使用公网 Ip,于是,就会出现弹性 Ip 或虚拟路由器以及 VpC 这样的虚拟网络服务,这样用户在公有云就可以很容易的组网,也就没有必要每台机器都需要一个公网 Ip,使用云平台,最好还是使用组网方案比较好的平台。

关于安全组。在 AWS 上,你开一台 EC2,会有一个非常严格的安全组只暴露 22 端口,其它的全部对外网关闭。这样做,其实是可以帮用户防止一下不小心把不必要的服务 Open 到公网上。按道理来说,AWS 上应该是帮用户防了这些的。但是,AWS 上的 MongoDB 祼奔的机器数量是最多的,估计和 AWS 的 EC2 的基数有关系吧(据说 AWS 有千万台左右的 EC2 了)

最后,提醒大家一下,被黑了也不要去付赎金,因为目前来说没有任何证据证明黑客们真正保存了你的数据,因为,被黑的服务器太多了,估计有几百T的数据,估计是不会为你保存的。

济宁IT新闻