工欲善其事:Github Action 极简搭建 v8 环境
Github Actions 是 Microsoft 收购 GitHub 后推出的 CI/CD 服务,它提供了配置非常不错的虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目。笔者联想起搭建 v8 编译环境时,三天三夜最后以失败告终,因为 v8 源代码编译过程中无可避免地需要用到 google 自家的 depot_tools,而国内网络环境劝退了很多初入 v8 坑的萌新们。
因此,在 P3TERX 师傅编译 openwrt 的启发下,笔者搞了一个 v8 版本的 github action,旨在帮助各位有兴趣的小伙伴,在入坑 v8 的时候,不必在网络行为上大费周章而被迫放弃。
本文相关内容已开源至星阑科技 Github 仓库,欢迎围观!
https://github.com/StarCross-Tech/v8-action
前言
前一阵在搜集IOT相关资料的时候,偶然间发现了P3TERX师傅用github action编译openwrt并且打包到网盘的策略:
https://p3terx.com/archives/build-openwrt-with-github-actions.html
Github Actions 是 Microsoft 收购 GitHub 后推出的 CI/CD 服务,它提供了配置非常不错的虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目。以我粗略的理解来看,完全可以把它当成一个临时型的免费的国外服务器。
读完整篇文章之后,发现之所以编译openwrt的时候采用了这种策略,是因为一些中国特色的网络限制会导致本地编译失败,而采用github action相当于我们可以白嫖github的国外服务器来做一些事情。
P3TERX师傅处理openwrt的方案是把编译openwrt的全部流程在action上编译好,再通过别人写好的网盘cli工具,将编译好的bin文件上传到一块国内不限速的网盘奶牛网盘上,这样你在本地通过网盘链接把bin文件下载下来就可以了。
隐约间,我想起很久之前,我搭建chrome v8编译环境的时候,搭建了三天三夜最后还是以失败告终,而失败的原因也恰好是这些网络行为。因为拖v8源代码和编译无可避免地需要用到google推广的自家的depot_tools,这些网络行为也劝退了很多初入v8坑的萌新们。
方案
首先先简单了解一下v8的编译过程。其实编译过程所用到的命令还是很少的,而且相关文章网络上非常多。在询问了一些搞v8的大佬们之后,我搞明白了以下几件事情。
之前很多人都在用ninja来编译v8的,但现在不用单独再下载一份。用depot_tools结合v8里面自带的tools/dev/gm.py就可以了,这是来自官方的高度集成。不然还需要修改某个文件中的一个布尔值,才可以在gdb的时候可以用job命令打印js object。
对于v8分析来说,最稳定的版本是ubuntu1804,1604有不少坑需要踩。
亲自测试用gm.py的方式编译会卡住,这时候ctrl+c中断过程,系统就会有ninja命令了,然后再用ninja命令编译即可。
对于漏洞分析来说,编译v8最好编译成release版本,debug版有断言,触发漏洞一般就挂了。
所以这里没有加入ninja的下载和打包的步骤,后续可能会加入ninja下载的功能,以及在action上编译好d8再将二进制文件上传上来的功能。
整个编译过程中需要产生网络行为的步骤为:
下载depot_tools整套工具链的时候;
用depot_tools从官方拖v8源代码的时候。
而编译v8是不产生网络行为的。
所以我们采取的策略就是在github action上,把depot_tools和v8源代码在github action上处理好,然后把它们通过网盘cli工具上传到网盘上,再显示出网盘链接,我们本地通过不限速的网盘将这些东西轻松愉快地下载下来即可。
对于漏洞复现者而言,则需要回滚到某一个没有patch这个漏洞的某个commit版本上。
对于ctfer而言,一般来说出题者都在某个commit版本的基础上,会提供一个diff文件,相当于在对应版本之中,手动在源代码里面戳了个0day出来。而diff文件可以用git apply来处理,这个过程同样也没有网络行为。
所以这里只在action里面做了一个commit的处理即可,diff的操作可以加但是没必要,自己在本地简单处理一下就行了。
使用方法
https://github.com/StarCross-Tech/v8-action
> 记得给项目点个 Star,然后 Fork 到自己的 github 上面。
点击 understand即可:
之后对以下文件进行修改。文件使用 yaml 语法,github官方也有对应的语法介绍。
v8-action/.github/workflows/v8.yml
把PATCH_FLAG的值改为true,COMMIT后面改成对应的版本号。如果PATCH_FLAG是false,那么就默认拉取最新版本的v8源代码。最后,BINARY_UPLOAD改成什么无所谓,因为功能我还没实现。
如果需要depot_tools,则将DEPOT_UPLOAD设置为true。
需要v8源代码,则将SRC_UPLOAD设置为true。
我以starctf-2019-oob这个题目为例,它的commit号是:
6dc88c191f5ecc5389dc26efa3ca0907faef3598
所以,对yml文件的env部分进行修改,就是这个样子的:
之后点击右方的start commit上传到master分支:
注意文件中的on部分:
这里的意思是每次push到master的更新,都会触发action运行。
如果watch那部分的注释符号被去掉,则表示,每次点击star的时候,都会触发action运行,相当于把star这个部分当成了开关。
之后再次点击Actions界面。可以看到action已经开始运行了:
然后有的时候push master之后不想运行,点击右侧可以取消本次运行。也可以点进去看它的当前进度,和每个步骤的花费时间,每个步骤点进去还可以看一下命令行的回显信息:
之后找一部动漫,睡一觉或者玩玩手机,等待20分钟左右。然后就可以看到网盘链接:
因为有一些版本的v8源代码,v8源代码压缩后的大小可能会超过了2G一些,而这里采用的网盘的cli工具上传是有2g限制的。所以action里会用7zip的分卷压缩方式对源码压缩包进行分卷压缩。所以如果没有超过2g,那么v8部分就只有一个网盘链接,如果超过了,那么就会有两个网盘链接。
如果上述一些步骤中,你的语法或者修改格式有错误,那么action就会报错并且终止,还会将错误消息发到你的邮箱里。
之后打开链接下载即可,这里用的是奶牛网盘,不是打广告!但是这个网盘国内不限速,速度快得简直飞起。
拿到源代码和各种工具之后,在本地尽情地折腾吧!
北京星阑科技有限公司(简称星阑科技)是一家以安全技术为核心、AI技术为驱动的网络安全科技公司,致力于提供高级攻防服务和智能化网络安全解决方案,以应对政府、企业所面临的日益严峻的网络安全威胁,让网络空间更加安全与智慧。
目前,星阑科技提供攻防对抗、APT防御、高级渗透等安全服务,为客户全面梳理威胁矩阵、进行安全赋能。产品包括攻击诱捕系统、邮件攻击一体化系统、基于前沿的图神经网络的智能边界防护引擎以及AI自动化漏洞挖掘系统,能全面提升客户的安全防护能力并有效降低安全运维成本。