备份和代码审计

• 本文约 795 字,阅读大致需要 2 分钟 | Security | #FreeBSD.org | #security breach | #Backup | #code audit | #SysAdmin

这次回北京之前的周末,FreeBSD安全团队发表了内部通知,发现FreeBSD.org有些机器被入侵,最近终于做了全面披露了。目前,基本的代码审计和攻击检查已经做完,部分机器还在重装的过程中。

对FreeBSD这样的开源项目来说,在基础设施遭到攻击之后,首先必须被怀疑的便是有可能有人在代码库中植入了新的后门。由于代码量十分巨大,逐行审计是非常不现实的。由于FreeBSD在BSD时代即采用了版本控制系统(最早BSD时代是SCCS,FreeBSD早期是CVS,现在是subversion),因此,每一行代码的来源,包括作者、具体的修改时间,以及为什么那样修改等等,都可以很容易地查找到。

FreeBSD采用了许多种不同的方法来同步修订历史,这包括了旧式的CVSup、通过邮件的CTM,以及svnsync。CVSup类似于rsync,但是是为CVS优化的。FreeBSD的CVS代码库之前是通过SVN export出来,然后通过CVSup发给所有的下游镜像,其好处是比rsync节省带宽和时间(因为CVSup会记录修改的文件信息,两相比较便不必完全传送文件的stat数据了),缺点和rsync一样,如果源站点的数据出了问题,备份也会被修改,而且是不可逆的。CTM和svnsync都是类似会计记账的方式,也就是说一旦有了修改便不可反悔(CTM更通过邮件发出,从而可以被第三方备份服务永久性记录),从而便于审计。

所幸的是,目前为止的调查中,并没有迹象显示CVS代码库或subversion代码库中混入了任何未经授权的变动。为了保险起见,FreeBSD.org的管理员将cvs改为从subversion完全导出(因为svn的审计比较容易)覆盖,以避免某些没有检测到的问题给用户带来影响。

我们能够从这个事情中学习什么教训呢?我想,最重要的是,备份应该采用和源数据不一样的更新、删除逻辑,因为这样才可以知道具体发生了什么变化。也就是说,数据源这边在备份那边的权限应该是不能改变历史记录数据的,比如只允许添加,等等。

关于这次入侵的具体情况,等有时间再写出来。