CVE-2016-4622学习笔记

CVE-2016-4622学习笔记

一、环境搭建

这个漏洞是两年前的漏洞,现在的代码直接git reset回当时的版本,无法编译通过。最初是修改了修补的地方,然后用现在的环境编译。但是发现有了别的地方的保护,无法复现。

以后再记录这里。

CVE-2016-4622这个漏洞可以在OS X 10.11.5上的safari 9.1.1重现。用vmfusion安装OS X 10.11.5之后,下载对应版本的Xcode,版本号为7.3.1. 然后把webkit的代码git reset到2fa4973,这是saelo提到的最初引入这个漏洞的版本。然后build出现错误。

localhost:WebKit_cp_vm test$ ./Tools/Scripts/build-jsc
Don't know where to find LLVM!

Try defining LLVM_LIBRARY_PACKAGE and LLVM_INCLUDE_PACKAGE or setting the
--use-llvm-includes and --use-llvm-libraries options.

Alternatively, you can check out llvm trunk into the WebKit directory:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
Died at ./Tools/Scripts/build-jsc line 119.

估计是早期的webkit项目中没有llvm。于是执行推荐的方案:

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

下载完llvm的源码后,继续build-jsc,还是有错。显示是llvm版本太高,没办法编译。
svn up -r 262564
svn up -r 255217
回滚到之前的版本,262564还是不能编译,255217就可以了。

build-jsc发生了错误。

Ld /Users/test/WebKit_cp_vm/WebKitBuild/Debug/libllvmForJSC.dylib normal x86_64
    cd /Users/test/WebKit_cp_vm/Source/JavaScriptCore
    export MACOSX_DEPLOYMENT_TARGET=10.11
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -dynamiclib -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -L/Users/test/WebKit_cp_vm/WebKitBuild/Debug -L/Users/test/WebKit_cp_vm/WebKitBuild/Debug/usr/local/LLVMForJavaScriptCore/lib -L/usr/local/LLVMForJavaScriptCore/lib -F/Users/test/WebKit_cp_vm/WebKitBuild/Debug -filelist /Users/test/WebKit_cp_vm/WebKitBuild/JavaScriptCore.build/Debug/llvmForJSC.build/Objects-normal/x86_64/llvmForJSC.LinkFileList -Xlinker --no-demangle -install_name /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Libraries/libllvmForJSC.dylib -mmacosx-version-min=10.11 -dead_strip -Xlinker -no_deduplicate -lobjc -Wl,-Y,3 -Wl,-exported_symbol -Wl,_initializeAndGetJSCLLVMAPI -Wl,-all_load -lpthread -lm -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMMCParser -lLLVMDebugInfo -lLLVMOption -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMMCDisassembler -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMMC -lLLVMObject -lLLVMCore -lLLVMSupport -lLLVMX86Disassembler -lLLVMX86CodeGen -lLLVMX86AsmParser -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -stdlib=libc++ -single_module -compatibility_version 1 -current_version 601.1.33 -Xlinker -dependency_info -Xlinker /Users/test/WebKit_cp_vm/WebKitBuild/JavaScriptCore.build/Debug/llvmForJSC.build/Objects-normal/x86_64/llvmForJSC_dependency_info.dat -o /Users/test/WebKit_cp_vm/WebKitBuild/Debug/libllvmForJSC.dylib
ld: warning: directory not found for option '-L/usr/local/LLVMForJavaScriptCore/lib'
ld: library not found for -lLLVMDebugInfo
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **


The following build commands failed:
	Ld /Users/test/WebKit_cp_vm/WebKitBuild/Debug/libllvmForJSC.dylib normal x86_64
(1 failure)

http://turingh.github.io/2016/12/03/CVE-2016-4622调试笔记/ 参考了这篇博客。我把WebKit源码文件夹中所有的Base.xcconfig中的GCC_TREAT_WARNINGS_AS_ERRORS设置为NO。但还是有这个错误。于是我将代码版本切换到320b1fc这个版本,编译成功。说明是特定版本不能编译。

二、漏洞简述

如果一个函数需要传入数字,但是我们传入的是其他对象,就会执行ToPrimitive函数。这个漏洞是slice的第二个参数是一个设置了ValueOf的函数,因此在slice时候会触发ValueOf,从而缩短数组长度。这里是把数组的butterfly缩短到只剩16个字节。这是残存的16字节,最近是32个字节,数据内容仍然保存butterfly原始值。接着存放一个[object]的数组,其butterfly会接着分配在16个字节后面,也是16个字节,前8个是两个length,后面是object地址。之后执行slice,会把object地址泄露。这就是addrof。这里是把地址作为double泄露,就需要最初的数组类型为Double类型。
然后再说fakeobj。这里需要把double当作指针,于是就是反过来,最初的数组是ArrayWithContiguous,缩小后存放一个[addr]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值