Tor系统是用于匿名通信的一个系统,源代码的维护到今天已经快10年。笔者从今年3月份开始陆陆续续研究Tor系统的源码,由于源码量大,也有很多需要总结的地方,所以特地在这里开辟个Tor源码分析的系列文章,供自己总结,也供大家共同探讨。
1. 源码查看工具 — SourceInsight
本来Tor源码在Linux下分析和调试都可以比在Windows下更专业些,但是因为笔者本身大部分时间需要在Windows下工作,所以选择了Windows下的源码分析软件。SourceInsight是个非常好的源码分析软件,用于查看各种开源代码工程都非常方便。这里选用SourceInsight作为Tor源码的基本浏览和修改工具。
2. 文档生成工具 — Doxygen
关于Doxygen的基本介绍大家可以在网上找到很多。简单的说,Doxygen就是将源码内的信息进行总结,生成包括函数调用关系,函数介绍等信息。这对于宏观查看代码非常重要。Tor源码内很多函数都连续嵌套非常多层,靠人为记住是非常困难的。利用Doxygen的函数调用图,能帮助我们更好的查看函数之间的调用关系。这里不介绍Doxygen如何使用,百度上有许多。注:使用Doxygen时定要打开函数调用图的生成功能。
3. 编译工具 — MinGW MSYS msyDTK
为了在Windows上完成对Tor的编译,需要使用到下面一些列套件。好在这些部分在Tor的FAQ中已经很详细地说明如何使用,这里就仅仅将Tor中关于如何在WIndows下编译Tor源码的部分复制于此,请大家自行查看。
##
## Instructions for building Tor with MinGW (http://www.mingw.org/)
##
Stage One: Download and Install MinGW.
---------------------------------------
Download mingw:
http://prdownloads.sf.net/mingw/MinGW-5.1.6.exe?download
Download msys:
http://prdownloads.sf.net/ming/MSYS-1.0.11.exe?download
Download msysDTK:
http://sourceforge.net/projects/mingw/files/MSYS%20Supplementary%20Tools/msysDTK-1.0.1/msysDTK-1.0.1.exe/download
Install MinGW, msysDTK, and MSYS in that order.
Make sure your PATH includes C:\MinGW\bin. You can verify this by right
clicking on "My Computer", choose "Properties", choose "Advanced",
choose "Environment Variables", select PATH.
Start MSYS(rxvt).
Create a directory called "tor-mingw".
Stage Two: Download, extract, compile openssl
----------------------------------------------
Download openssl:
http://www.openssl.org/source/openssl-0.9.8l.tar.gz
Extract openssl:
Copy the openssl tarball into the "tor-mingw" directory.
Type "cd tor-mingw/"
Type "tar zxf openssl-0.9.8l.tar.gz"
(Note: There are many symlink errors because Windows doesn't support
symlinks. You can ignore these errors.)
Make openssl libraries:
Type "cd tor-mingw/openssl-0.9.8l/"
Type "./Configure -no-idea -no-rc5 -no-mdc2 mingw"
Edit Makefile and remove the "test:" and "tests:" sections.
Type "rm -rf ./test"
Type "cd crypto/"
Type "find ./ -name "*.h" -exec cp {} ../include/openssl/ \;"
Type "cd ../ssl/"
Type "find ./ -name "*.h" -exec cp {} ../include/openssl/ \;"
Type "cd .."
Type "cp *.h include/openssl/"
Type "find ./fips -type f -name "*.h" -exec cp {} include/openssl/ \;"
# The next steps can take up to 30 minutes to complete.
Type "make"
Type "make install"
Stage Three: Download, extract, compile zlib
---------------------------------------------
Download zlib source:
http://www.zlib.net/zlib-1.2.3.tar.gz
Extract zlib:
Copy the zlib tarball into the "tor-mingw" directory
Type "cd tor-mingw/"
Type "tar zxf zlib-1.2.3.tar.gz"
CHOICE:
Make zlib.a:
Type "cd tor-mingw/zlib-1.2.3/"
Type "./configure"
Type "make"
Type "make install"
Done.
Stage Four: Download, extract, and compile libevent
------------------------------------------------------
Download the latest libevent release:
http://www.monkey.org/~provos/libevent/
Copy the libevent tarball into the "tor-mingw" directory.
Type "cd tor-mingw"
Extract libevent.
Type "./configure --enable-static --disable-shared"
Type "make"
Type "make install"
Stage Five: Build Tor
----------------------
Download the current Tor alpha release source code from https://torproject.org/download.html.
Copy the Tor tarball into the "tor-mingw" directory.
Extract Tor:
Type "tar zxf latest-tor-alpha.tar.gz"
cd tor-
Type "./configure"
Type "make"
You now have a tor.exe in src/or/. This is Tor.
You now have a tor-resolve.exe in src/tools/.
Stage Six: Build the installer
-------------------------------
Install the latest NSIS:
http://nsis.sourceforge.net/Download
Run the package script in contrib:
From the Tor build directory above, run:
"./contrib/package_nsis-mingw.sh"
The resulting Tor installer executable is in ./win_tmp/.
上述所有的工具及源码都下载,安装完毕之后,就可以进入Tor源码的细节分析阶段。不过,在此之前,如果可能,还需要通读Tor源码的设计文档:
https://www.torproject.org/docs/documentation.html.en
上述网址需要翻墙才可以阅读,所以,或许还需要使用VPN或者GoAgent的方式事先翻墙。
重点必读的设计文档包括:
十多年来,全世界的人们都在使用Tor(原名洋葱路由器)来保护自己的隐私。美国海军研究实验室使用开源技术开发这一系统,来保护美国政府的通信。 它用于那些生活在约束体制下的人们,通过它去访问网上被禁止的信息或数据,或者那些想要与记者交流的告密者和持不同政见的人;以及那些不想被跟踪的Internet用户或者是想在网上公布信息而又不想泄露自己隐私的人。 Tor如何工作 Tor通过随机选取遍布于全球的tor中继点,将流量从源头发送到目的。每一次从一个中继点到下一个中继点传送的流量都是加密的,任何获得流量的中继点只知道流量来至哪里,以及下一个中继点的地址。只有到最后,出口的节点才知道最终的目的地;并在流量离开tor网络时将它解密。 Tor的“会合点”也可以提供一个“隐藏”的服务,如让匿名网站的所有者和位置不能被追溯。世界范围内有数千个tor的中继点,并且有成千上万的人都在使用它们 (任何人都可以创建一个。)美国国家安全局的文件透露:2013年将Tor描述为“……高等级安全的王者,低延迟的网络匿名,”还补充道,“……不存在能与之匹敌的竞争对手”。这是只是2013年的时候,而现在看来确实不能这样说。 Tor的困境 也许最明显的例子是丝绸之路2.0毒品电子网站被查封,同时逮捕了一个被认为是幕后黑手的旧金山男子。该网站使用了一个隐藏的tor服务器。有人认为:丝绸之路2.0毒品电子网站是因为招到了国土安全局一个秘密调查机构的损害并非是因为tor系统的技术弱点。但是逮捕事件说明了这样的一个事实:使用tor并不能保证匿名。 事实上,使用Tor确实能吸引执法和安全机构的兴趣。今年早些时候,据透露,国安局的xkeyscore程序很可能会把那些 使用tor的互联网用户,或是想学习tor而访问tor网站的人列为极端分子。因此,具有讽刺意味的是,试图匿名上网的你很可能是把自己直接放在NSA的聚光灯下。 可以肯定的是tor存在技术弱点并且这些弱点可以被利用。 在7月份,tor在一篇博文中声称不明的攻击者建立很多个tor中继点,并通过修改经过这些中继点的流量试图去识别那些隐藏服务的用户。该博文建议,如果用户访问或者是直接操作隐藏服务到2014年7月4日时已经有5个月的时间,那么就可以认定他们的身份已经被泄露了。 Tor的另一个问题是如果这些用户的电脑被恶意软件侵害,那么当他们使用tor时已经不足以保持匿名了。这是在2013年8月的一个例子,当以个被称为“万磁王”的恶意软件被发现的时候,他已经利用了一个之前未发现的tor浏览器致命弱点,该浏览器通常使用tor技术去访问网站。 不再匿名 Javascript被广泛利用被认为是FBI的工作,因为除了利用这些计算机的真实IP地址将这些计算机的MAC地址和windows主机名发送到一个位于弗吉尼亚州的服务器外,它没有不做任何泄密机器的事情。如果说FIB牵涉了恶意软件就一点也不奇怪了。从爱德华斯诺登揭露的事情已经显示国家安全局做好很多这样的事情。 最近,前哥伦比亚大学的研究人员共同发表的研究声称:通过使用一个叫做流量分析技术的演变方法可以识别81%的Tor的用户。其本质上是通过建立一个被修改的tor中继点,然后向流量中注入一个TCP连接,从而分析出路由器的流量记录。 这是一个复杂的事情,但是根据教授sambuddho Chakravarty的说法,这并非复杂到需要用到美国国家安全局的巨大资源来实施。 有这样一个观点:因由于网上的一些Tor中继都非常大并且处理着巨大的流量,这使得他们的操作和维护都很昂贵。一个明显的问题是:谁来买单?给出答案是,由于许多政府想更多地知道人们在用Tor做什么,这并不难想象,其中的一些是被外国政府情报服务机构操作的。 Tor的代替品 尽管国家安全局说没有任何竞争对手能动摇TOR为互联网匿名王的地位,然而替代方案是存在的,这包括:看不见的互联网项目(I2P),这是一个匿名的重叠网,一个网络包含着另一个网络,它的目的是为了防止通讯信息被像ISP这样的第三方拉网式监控。 以匿名方式发送消息,每一个客户端都有自己的I2P路由器建立的几个入境和出境的通道-通过向一个方向传送一系列同等片段的信息(分别往返于客户端之间)。反过来,当一个客户端要向另一个客户端发送信息时,一个客户端通过自己的出境通道将信息发向另一个客户端的入境通道,最终达到目的地。 I2P开源软件项目的网站警告说“没有网络可以绝对地匿名”,I2P的继续的目标是使攻击变得越来越难以实施。并补充说:“随着网络大小的扩大和正在进行的学术研究将会使它的匿名性变得更强壮。” Freenet是一个免费软件,它旨在让你匿名共享你的文件,浏览网页和发布“freesite”地址(改网络地址只能通过Freenet访问)以及在论坛上聊天。根据项目的一个重要发展是,有一些被称为“darknet”的网络加入。这些网络只连接到他们所信任的人,用户能极大地降低自身的脆弱性并能通过朋友的朋友连接到全球的网络。 VPN服务不提供强健的匿名,因为在你使用他们的时候都需要你去服务提供商哪里进行注册,即使那些你所连接和访问的网站并不需要保存你的IP地址记录。 尽管如此,一个VPN服务并能从你访问的网站掩盖你的ip地址,并提供一个低水平的匿名。VPN应谨慎使用,因为网站仍然可以通过cookies识别你的身份或者是通过其他的 标示符。特别是当你访问一个没有VPN掩盖你IP地址的相关网址时。