Chrome漏洞分析与利用——Windows V8漏洞环境编译

671 阅读5分钟

工具:

  • ninja: ninja git地址
  • depot-tools: depot-tools git地址
  • vs2019: 官网下载,使用默认安装路径,否则在用v8gen.py时会因为路径问题导致失败,如果非要使用自定义路径,则需要去改v8源码目录中的vs_toolchain.py脚本,其中有一行代码path = os.path.expandvars('%ProgramFiles(x86)%' + '/Microsoft Visual Studio/%s' % version)会去默认安装路径查找vs,可以将此路径改为自定义的vs安装路径
  • git: 官网下载
  • python2: 需要用到urllib2模块所以使用py2,pip直接安装urllib2可能会报错,直接装urllib3即可

环境配置

因为需要从google下载大量的内容所以需要代理 git代理设置:

 git config --global https.proxy http://地址:端口
 git config --global https.proxy https://地址:端口
 git config --global http.proxy socks5://地址:端口
 git config --global https.proxy socks5://地址:端口

系统环境变量设置,此处配置完如果依然报错[fetch 1/2] RPC failed transiently....那就重启以下: http://地址:端口 在这里插入图片描述 系统代理设置(需要使用管理员权限运行cmd): netsh winhttp set proxy http://地址:端口 再在设置里将代理打开 在这里插入图片描述 将ninja与depot_tools路径写入系统默认路径 在这里插入图片描述 然后在命令行中设置一个临时环境变量 set DEPOT_TOOLS_WIN_TOOLCHAIN=0

编译流程

创建一个用于存放v8代码的目录cd进入,执行

fetch v8
gclient sync

如果代理配置有误可能会一直卡住或一直报以下错误 在这里插入图片描述 假设现在要编译存在issue-1196683(CVE 2021-21220)漏洞环境,打开issue链接:bugs.chromium.org/p/chromium/… 找到commit并进入 在这里插入图片描述 由于此版本已经将漏洞修复,所以找到上一个版本 在这里插入图片描述 拷贝其commit哈希 在这里插入图片描述 执行以下指令将v8版本回滚到存在漏洞的版本,并重新执行gclient sync

git reset --hard 1e4b1c521a491c7487028b7f2aec550c1b36606b
gclient sync

然后在v8源码根目录下执行以下指令进行编译,编译过程会很漫长,而且可能会占满CPU,如果已经编译过debug版本还需要编译release版本的话,直接忽略以上步骤直接执行以下内容将所有debug都替换为release即可,但要注意的是必须要设置DEPOT_TOOLS_WIN_TOOLCHAIN环境变量否则还是会报错。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python tools/dev/v8gen.py -vv x64.debug
ninja -C out.gn\x64.debug

编译好后可以在out.gn\x64.debug目录下找到编译好的exe以及dll文件,其中d8.exe可以帮我们进行一些基础的调试分析 在这里插入图片描述

补充

注意点一

除此以外在编译较新版本v8时还可能会遇上以下情况 在这里插入图片描述 然后去查看FILE_INFO_BY_HANDLE_CLASS的定义后发现存在一句条件编译指令。在这里插入图片描述 基本可以确定就是这个条件编译指令的原因,将其注释后再编译,出现以下报错 在这里插入图片描述 查看后依然还是条件编译指令在判断NTDDI版本时出的问题 在这里插入图片描述 将其注释后再编译,还剩一个报错。 在这里插入图片描述 查看该函数在Version_Helper.h中的定义,发现还是NTDDI版本的问题,再注释编译 然后发现win系统库中存在大量此类条件编译一个一个注释掉显然不现实,然后观察报错输出后发现两个sdk版本号对不上,10.0.19041.0是我的,而后面的10.0.20348.0我都没有装。 在这里插入图片描述 在vs拓展工具里去掉10.0.19041.0,安装10.0.20348.0,相当于将sdk升级至win10平台最新版 在这里插入图片描述 然后编译完成,总结来讲在编译新版v8时最好将sdk也升至最新版

注意点二

如果升级过sdk后使用python tools/dev/v8gen.py -vv x64.debug生成编译配置文件时出现如下报错:

 C:\vun\v8\buildtools\win\gn.exe gen out.gn/x64.debug --check
    -> returned 1
  ERROR at //build/config/win/BUILD.gn:297:27: Script returned non-zero exit code.
    vcvars_toolchain_data = exec_script("../../toolchain/win/setup_toolchain.py",
                            ^----------
  Current dir: C:/vun/v8/out.gn/x64.debug/
  Command: C:/vun/depot_tools/bootstrap-2@3_8_10_chromium_23_bin/python/bin/python.exe C:/vun/v8/build/toolchain/win/setup_toolchain.py "C:\Program Files (x86)/Microsoft Visual Studio/2019/Community" "C:\Program Files (x86)\Windows Kits\10" "C:\Windows\System32;C:\Windows\SysWOW64;Arm64Unused" win x64 none
  Returned 1.
  See //build/config/BUILDCONFIG.gn:343:5: which caused the file to be included.
      "//build/config/win:lean_and_mean",
      ^---------------------------------
  Traceback (most recent call last):

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>

      main()

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main

      vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList

      file_name, env_name, '\n'.join(parts))

  AssertionError: user32.lib is not found in LIB:

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64

  Check if it is installed.

  Traceback (most recent call last):

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>

      main()

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main

      vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')

    File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList

      file_name, env_name, '\n'.join(parts))

  AssertionError: user32.lib is not found in LIB:

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x86

  C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x86

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x86

  C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86

  Check if it is installed.

  GN gen failed: 1
Traceback (most recent call last):
  File "tools/dev/v8gen.py", line 307, in <module>
    sys.exit(gen.main())
  File "tools/dev/v8gen.py", line 301, in main
    return self._options.func()
  File "tools/dev/v8gen.py", line 169, in cmd_gen
    gn_outdir,
  File "tools/dev/v8gen.py", line 211, in _call_cmd
    stderr=subprocess.STDOUT,
  File "C:\vun\depot_tools\bootstrap-2@3_8_10_chromium_23_bin\python\bin\lib\subprocess.py", line 223, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['C:\\vun\\depot_tools\\bootstrap-2@3_8_10_chromium_23_bin\\python\\bin\\python.exe', '-u', 'tools\\mb\\mb.py', 'gen', '-f', 'infra\\mb\\mb_config.pyl', '-m', 'developer_default', '-b', 'x64.debug', 'out.gn/x64.debug']' returned non-zero exit status 1

打开v8\build\toolchain\win目录下的setup_toolchain.py文件百分之九十的路径问题报错都源于该脚本文件,该脚本文件较为奇葩它将sdk版本号直接写死在脚本文件里,注意核查该处sdk版本号与你所配置使用的sdk版本号是否一致,不一致就改 在这里插入图片描述 更改后输出成功