•
一言以概:科大 mirrors 服务器被黑客入侵以及攻击了。
下面将以 cuihao 同学的视角描述整个过程的经过。其中跳过了大量技术细节,以后有机会会陆续公布。
8月6日
mirrors 流量大增,IO负载也显著升高。rsync 日志显示同步 ubuntu 镜像的下游同步流量较平时显著升高。
8月8日
有人报告 http 出现零星的 404 错误,但没有引起重视。
晚上,为了降低负载和网络压力,限制了单 IP 的 rsync 并发连接数。
8月9日
中午,由于前一天的限制效果不理想,又对 http 并发连接施加了限制,并进一步压低了 rsync 的限制,网络/IO 压力得到控制。
晚上,有 mirrors 维护人员发现,从上游同步 ubuntu 镜像同步时出现奇怪的错误。检查后发现,ubuntu 镜像目录下的 /ubuntu 软链接(指向自身),被人替换为文件夹,并将自身 bind mount 到该文件夹上。
这就解释了 mirrors 流量激增的原因:mirrors 的下游源要多传输一整个 ubuntu 镜像。该问题于当日解决。
当日,有更多人反应 http 出现随机的 404 的错误。这引起了我们的注意。Nginx 日志和 strace 跟踪显示,Nginx 对特定文件执行 open 系统调用时有一定概率因 ENOENT 失败。但无法用其他程序重现,原因不明。
8月10日
LUG 多位技术人员都开始对 404 问题进行调试。boj 发现,Nginx 执行 open() 系统调用后,包含文件路径参数的字符串被篡改了。
下午,该 bug 突然出现反调试行为 —— Nginx 被 gdb 或 strace 跟踪之后,bug 消失,无法再次重现。调试陷入僵局。综合前面链接被替换的事件,有人指出 mirrors 可能被人入侵。但这也使得该 404 问题得到临时“解决”——我们把所有 Nginx 进程都 strace 上了……
晚上,测试了 Apache,发现 Apache 会出现随机的 403 错误。根本原因和 Nginx 错误一样,即 open() 调用失败。
当天还发现,root 的 bash 历史在近期被清除过(第一条记录为 rm ~/.bash_history)。
8月11日
boj 深入内核进行调试,最终发现了导致 404 问题的罪魁祸首。mirrors 上被人植入了一个内核模块,该模块会篡改 open() 函数的参数。根据 boj 反汇编结果,其行为大致如下:<br></br>if (
process name is "nginx" and process is not traced) or<br></br>\(process name is "apache2" or "lighttpd"))<br></br>if (rand() % sample == 0)<br></br>if (path is not empty && file extension is "exe", "msi"...)<br></br><strong>rewrite the path to empty string</strong>
自此,404 问题真相大白。
8月12日
我们对系统文件做了检查(使用 debsum),没有发现其他文件被篡改。但为了安全起见,决定于 14 日停机重装系统。
8月13日
下午将近6点,mirrors 上短时间内 fork() 出两万多个 vsftpd 进程,FTP 服务疑似遭 DoS 攻击。发现时为时已晚,服务彻底瘫痪。http 服务切换到备份机器。
晚间,cuihao、Guangyu Zhang、pudh、zsj 进入机房,决定提前开始重装系统作业。作业持续到晚上 11 点,大家先回去洗洗睡了。
8月14日
http、rsync 服务陆续恢复。不过因为路由配置错误(当时未发现),所以国内非教育网用户仍访问的是备份站点,也无法访问 rsync/ftp。
当日,我们对 vsftpd 进行了大量测试。认为 vsftpd 先 fork()(clone())再检查客户端数量限制的行为使得 DoS 成为可能。进行若干严格的限制后,ftp 服务也恢复了。
8月15日
晚上,cuihao 发现国内非教育网用户仍无法访问 mirrors 的问题。后经检查确认是路由没有配置好,现已修复。
此次事件显示,LUG 服务器安全方面存在不少漏洞。重装系统后,我们会在安全方面做更多努力,以后这些安全措施也会逐步应用于其他服务器。
同时 LUG 也对黑客入侵和攻击 mirrors 服务器的行为表示强烈愤慨 🙁