转载请引用from 信安科研人
研究浏览器安全的目的是怎样让浏览器更安全
整体上分为三个大部分主体,一个是浏览器,一个是用户本机,一个是web服务器。
浏览器是中间者,作为用户与web服务器的通信媒介。
信息流大体上可以分为四个过程,用户与浏览器有两个,浏览器与web服务器有两个。
浏览器与用户本机之间:
浏览器与web服务器之间:
地址随机化,即同一代码在不同次加载时具有不同的加载地址。
DEP(Data Execution Prevention)数据执行保护,以内存页为单位,对于数据区的内存页不设置可执行标志,阻止数据作为代码执行。
GS(Stack Cookies)栈完整性保护,保证被调函数返回正确的调用函数
对插件或扩展的安全控制机制,如沙箱、安装警告、访问控制等。
由于JIT引擎动态代码生成的特征,DEP和ASLR机制不再适用。JIT引擎应具有的安全机制包括:
恶意URL放入黑名单以阻止访问从而维护本机和浏览器安全。
ROP代码重用攻击绕过DEP,任意地址读写绕过ASLR。
本质:web页面A中的脚本被允许访问web页面B中的数据,当且仅当web页面A与web页面B同源。
“源”:URL机制、主机名、端口三要素共同决定。
应用:源A的cookie对于源B不可见;源A的脚本不可以读取或者设置源B的属性
本质:为浏览器提供额外的功能。
风险:
渲染引擎内存操作导致的安全问题,如溢出漏洞、指针重用漏洞等。
详例请见:
CVE-2012-1876、CVE-2014-1772
简述:
内存操作安全一直是软件安全关注的焦点,浏览器中的内存操作繁杂多样,内存操作类漏洞是浏览器漏洞的最重要组成,由于实现错误不可避免,所以安全机制侧重利用缓解。
JS引擎机制——V8 JIT(JUST IN TIME):
JIT技术:
漏洞类型:
JIT热函数翻译模块:整型溢出
JIT优化模块:整型溢出,边界错误等
实例:
CVE-2021-21220
热函数翻译模块漏洞:
安全加固:
架构安全的基础是沙箱,沙箱的架构,以chrome为例,如下:
Broker进程就是浏览器进程
Target进程通常是渲染进程
因此,针对沙箱的安全性,有以下的
详例见CVE-2014-1705和CVE-2020-0986
渲染时需要用到GPU加速,一个浏览器实例使用单个GPU进程渲染多个renderer进程:
左边时render进程,中间SHM共享内存,交由GPU进程内的模块分配GPU资源。
GPU侧信道攻击
前提:一个GPU进程内所有上下文共享一个GPU地址空间(共享内存、GPU显存)。
攻击方式:很久很久以前,网页的WebGL代码可直接越界访问、分配GPU内存读取其他页面释放后未清0的数据,从而窃取其他页面信息。
GPU内存侧信道攻击
OpenGL / cuda提供接口可以获取实时GPU显存剩余量,从而获取浏览器的显存分配事件,可以根据内存分配事件trace,推断:
(1)利用cache
Prime阶段:攻击者通过大量访存操作,使用特定数据集完成Cache填充
Trigger阶段:目标程序进行访存操作,将目标数据填充进Cache
Probe阶段:攻击者访问用于填充Cache的特定数据集,根据时间差异确定目标数
据。
初始状态为空,prime阶段按照自定义的数据集填入cache,接着目标程序访问内存将对应的数据填入cache,最后攻击者访问用于填充Cache的特定数据集,根据时间差异确定目标数
据。
(2)spectre攻击
Spectre攻击利用了cpu的预测执行导致了提前把私有数据放到了cpu缓存中,但是因
为保护机制并没有写入数据的能力,同时我们并没有直接读取cpu缓存中数据的权
限,不过可以通过计算访问数组的时间上做判断获取到下标中的之前放入的私有数
据。
(3)Meltdown攻击
破坏了位于用户和操作系统之间的基本隔离,此攻击允许程序访问内存,因此其他
程序以及操作系统的敏感信息会被窃取。这个漏洞“熔化”了由硬件来实现的安全
边界。允许低权限用户级别的应用程序“越界”访问系统级的内存,从而造成数据
泄露。
《软件安全原理》—— 霍玮