从内部源码看Facebook技术(第一集)

Warning

本文中所有代码都是通过合法途径获得。

写在前面

我是一名铁杆Facebook粉丝。Facebook为开源社区贡献了许多力量,经常开放他们内部的软件。比如Phabricator, libphutil, 以及 XHP都是不错的好东西。

Phabricator是Facebook开发的可视化代码审查工具。工程师可以在页面上非常方便的针对每一段(单行或者多行)代码进行交互讨论。负责审查的工程师可以接受代码改变,可以提出疑问要求原作者继续修改。

曾经有段时间我对Phabricator 和XHP(一个PHP扩展)进行了优化研究,却意外发现了许多有关Facebook的内部资料。

意外的发现

大概是2013年6月份左右,那时我已经在使用Phabricator修复bug了。如果我没有记错的话,Phabricator程序当时是返回了一个PhutilBootloaderException错误信息。

当时我并不知道Phabricator是怎么运行的,于是就Google查询了下错误信息……就跟你想的一样,我获得了源代码以及一些参考链接,其中有一个链接十分抢眼——一个Pastebin(一个轻量级的文本分享工具)分享链接,里面有Facebook很多的内部数据。

当然,这引起了我的兴趣,下面就是我的发现…

 

Okay,这确实不是完整的源码。这仅仅是一些命令行输出,但依旧告诉了我们一些有趣的信息。

数据分析

我们可以得知用户名“emir”,或许这是该用户的First Name(相当于国人的名),当然也可能是由姓的第一个字母加上名(E. Mir)。我们可以通过另外一个Facebook的工程师清楚的看到这些输出,所以在Pastebin上面发布文章不是一个明智的做法。这个人的这个做法很容易被攻击者盯住,惹来不必要的麻烦。

"dev3003"是emir那个时候使用的机器名字同时我们可以得知Facebook至少有3000台机器支持着开发工作(假设“3003”是从1开始增长的,我对这个假设很确信呢)

/home/engshare/devtools/是libphutil和arcanist的安装路径,如果我的记忆没问题的话,/home/engshare/是通过NFS开发机器之间进行分享,这里没有什么比较有趣的,但是也有可能存在其他脚本定位在这个目录。

这里也有一些执行时间的信息,以及Git hashes。

之后,我又继续尝试类似Pastebin文章中的操作。结果告诉我,并没让我失望!

有趣的是,它显示了路径和文件名。"flib" (Facebook Library)是一个包含实用工具的内部lib以帮助开发。我们再深入一些…

dev578中的Ksalas似乎在运行一个字符串解析器。intl_string.php尝试运行/mnt/vol/engshare/tools/fbt_extractor,所以我们可以知道在/mnt/vol/engshare/目录下还有其他的脚本,我们可以看到他们正在使用PHP Unit进行单元测试,"www-hg"是Mercurial的目录!众所周知,他们从Subversion进行Git迁移数据。

"That&'s still not god damn sourcecode!" 我听见有人在哭了……

flib/core/db/queryf.php就是问题文件。在前面,我们认为这只是一个文件与另一个文件MySQL相关函数之间的差异。我们可以通过mysql_query_all()查询函数。从目前能够得到的代码看来,这是一个十分简单的查询函数,或许实际上它很复杂,但是不幸的是我们可能永远不会知道。

我会发布一些我发现的示例代码,这些都可以通过文章底部下载链接进行下载。

 

Facebook MysSql数据库密码

最后,我想分享一些我认为有趣的东西。Facebook&'s MySQL password.似乎保存在print_r()数组

 

Okay,尽管Facebook数据库服务有大量防火墙进行保护,这也许不是最安全的密码。

学习收获

我们今天学到了什么呢?我们最好不要在面向公众的站点(就比如共享工具Pastebin)发布内部源码。另外还有一点:确保调试信息不会被用户看到。

下载地址

声明:仅供学习和研究用途

链接:http://pan.baidu.com/s/1kTEBXuJ 密码:p3ve
密码:freebuf.com