OSX下调试WebKit

Safari的解析和渲染引擎WebKit是开源的项目,并提供了很多脚本方便调试。在OSX下分析一个漏洞还是头一回,用到的技巧大都取自WebKit官方的一篇JS引擎漏洞分析

准备环境


首先当然是要下载Webkit的源码,以前写过如何在Ubuntu环境里下载编译WebKit,当时只考虑了最新版本,所以直接从官网下载代码压缩包。

但如果是分析漏洞,一般要根据testcase的描述找到对应版本的WebKit,然后用svn和git下载指定版本的代码。

官方的建议的命令是

svn co -r 200796 http://svn.webkit.org/repository/webkit/trunk webkitDir

由于我查看的testcase信息来自于WebKit的Github镜像,所以用git下载的源码。

不过国内访问git的速度实在不怎么样,最后就用VPS从美国先git clone好整个源码树,然后压缩传回本地

根据testcases找到对应的branch编号以后,再切换过去

git reset --hard 6711d17

原理分析


为了尽快分析清楚漏洞的原理,当然要直接调用WebKit去解析testcase,先编译debug的程序:

./Tools/Scripts/set-webkit-configuration --asan
./Tools/Scripts/build-webkit --debug

然后就可以使用DumpRenderTree直接调用编译好的WebKit来解析引发问题的testcase了

VM=WebKitBuild/Debug/ && DYLD_FRAMEWORK_PATH=$VM lldb $VM/DumpRenderTree LayoutTests/js/regress-155776.html

真实环境下的调试


一旦问题分析清楚,必须回到Safari下才算是真正的利用过程起点。编译release版的程序:

./Tools/Scripts/build-webkit --release

然后使用提供的辅助脚本,就能自动将WebKit库注入到浏览器中,使Safari运行在刚刚编译好的WebKit之上:

./Tools/Scripts/run-safari

Linux下编译WebKit和JSC

Safari和Chrome的内核都是webkit,无论是打算自己开发个浏览器还是在程序里集成完整的HTML解析功能,webkit都是为数不多的选择。特别是webkit分支中的jsc,可以命令行下解释执行javascript,真是想想就让人亢奋的玩物。编译环境选择的是Ubuntu 15.04 x86_64,由于玩心太重,所以首先考虑把jsc编译出来。

下载代码

有大概三种途径弄到代码,git,svn和直接下载tar.xz,我只试了后面两种

svn checkout https://svn.webkit.org/repository/webkit/trunk webkit

或者从webkitgtk直接下载tar.xz

准备编译环境

执行webkit/Tools/gtk/install-dependencies可以安装大部分缺失的库代码,另外再手动补下刀

sudo apt-get install libgstreamer*

其余的库要是还缺,apt-cache search+apt-get install 缺啥补啥吧

编译

如果下载的tar.xz的话,参考linuxfromscratch进入webkit目录执行以下代码,编译好的jsc位于./build/bin/jsc

sed -e 's/“/"/' -e 's/”/"/' 
    -i Source/WebCore/xml/XMLViewer.{css,js} &&

mkdir -vp build &&
cd        build &&

cmake -DCMAKE_BUILD_TYPE=Release 
 -DCMAKE_INSTALL_PREFIX=/usr 
 -DCMAKE_SKIP_RPATH=ON 
 -DENABLE_GEOLOCATION=OFF 
 -DPORT=GTK 
 -DLIB_INSTALL_DIR=/usr/lib 
 -DUSE_LIBHYPHEN=OFF 
 -DSHARED_CORE=OFF 
 -DCMAKE_C_COMPILER=/home/jack/afl/afl-gcc 
 -DCMAKE_CXX_COMPILER=/home/jack/afl/afl-g++ 
 -DBUILD_SHARED_LIBS=OFF 
 -DENABLE_MINIBROWSER=ON 
 -Wno-dev .. &&
make -j10

如果是svn得到的代码,进入webkit目录后执行编译脚本得到./WebKitBuild/Release/bin/jsc

./Tools/Scripts/build-jsc --gtk --makeargs="-j10"