安全的 ECMAScript
如果无法正常显示,请先停止浏览器的去广告插件。
1. Secure ECMAScript
Jack Works
Sujitech 前端工程师
2. • 供应链攻击
• 基于对象能力(Object Capability)的安全模型
• 沙盒、Realm 的概念和 Realm 提案
• Membrane 和 Compartment 提案
3. 用途
• 第三方插件系统
• 微前端
• 敏感代码
4.
5. 供应链攻击
安装时、编译时攻击
运行时攻击
6.
7. 基于角色的安全模型
• 执行这项操作的主体是谁?
• 它有权限执行这项操作吗?
8. 解决办法?
1. 不使用任何第三方依赖?
2. 对整个依赖树进行安全审计?
3. ……
9. 解决办法?
1. 不使用任何第三方依赖?
2. 对整个依赖树进行安全审计?
3. 基于对象能力(Object Capabilities)的安全模型 + 沙盒
10. 基于对象能力
(Object
capability) 的安全
模型
11. 基于角色
• 执行这项操作的主体是谁?
• 它有权限执行这项操作吗?
基于对象能力
•
它有执行这项操作的钥匙吗?
12. 权限衰减 (attenuation)
b
a
c
d
13. 基于对象能力的安全模型的前提
1. 引用不可伪造(内存安全)
2. 不能访问私有属性和方法
3. 副作用不能从语法直接构造
4. 只能通过拥有的对象执行副作用
14. Linux x86_64, clang-7
1.
2.
3.
4.
✔ 引用不可伪造(内存安全)
❔ 不能访问私有属性和方法
❔ 副作用不能从语法直接构造
❔ 只能通过拥有的对象执行副作用
15. 1.
2.
3.
4.
✔ 引用不可伪造(内存安全)
✔ 不能访问私有属性和方法
❔ 副作用不能从语法直接构造
❔ 只能通过拥有的对象执行副作用
16. 1.
2.
3.
4.
✔ 引用不可伪造(内存安全)
✔ 不能访问私有属性和方法
❌ 副作用不能从语法直接构造
❔ 只能通过拥有的对象执行副作用
17. ES5:严格模式
18. 1.
2.
3.
4.
✔ 引用不可伪造(内存安全)
✔ 不能访问私有属性和方法
✔ 副作用不能从语法直接构造
❌ 只能通过拥有的对象执行副作用
19. ECMAScript 中基于对象能力的前提
1. ✔ 引用不可伪造(内存安全)
2. ✔ 不能访问私有属性和方法
3. ✔ 副作用不能从语法直接构造(严格模式)
4. ❌ 只能通过拥有的对象执行副作用
20. 历史的巧合
21.
22.
23. 拦截全局对象查找
24. 今天的沙盒
25. 今天的沙盒
26. globalThis
Object
Function
Object.prototype
Function.prototype
规范中的
Realm
Global
eval
Array
document
Array.prototype
27. 身份不连续 (Identity discontinuity)
28. 身份不连续 (Identity discontinuity)
Object
Function
Function.prototype
Function
Global
Object
Object.prototype
Array.prototype
Array
document
Global
Function.prototype
eval
Array
iframe.contentWindow
arr
document
eval
Object.prototype
Array.prototype
29. Realm 提案
(旧版)
https://github.com/tc39/proposal-realms/
30.
31. Object
Function
Object
Object.prototype
Function
Function.prototype
Object.prototype
Function.prototype
Global
Global
Array
Array.prototype
Array
Array.prototype
dangerous.js
fetch
fetch (fake)
r = new Realm()
沙盒逃逸
32. Membrane
Function
fetch
idb
Proxy
Proxy
fetch
idb
33. Membrane
Function
fetch
idb
Proxy
Proxy
fetch
idb
34. SES Meeting: Building Membranes in JavaScript, 2021 年 1 月
35.
36.
37. 旧版 Realm 提案
38. Isolated Realm
39.
40. Compartment 提案
• https://github.com/tc39/proposal-compartments
• 冻结并共享内置对象
• 更进一步的虚拟化
41.
42. 虚拟化
43.
44. 展望
• Realms 提案
• Compartments 提案
• ? https://github.com/endojs/endo 安装、编译时防护
• ? https://npmjs.com/ses 运行时防护
45.