使用经认证指针来进行经动态生成的代码处理沙盒化的制作方法

文档序号:20605731发布日期:2020-05-01 22:04阅读:105来源:国知局
使用经认证指针来进行经动态生成的代码处理沙盒化的制作方法

相关申请的交叉引用

本申请要求于2018年9月26日在美国专利商标局提交的非临时专利申请no.16/142,611以及于2017年9月29日在美国专利商标局提交的临时专利申请no.62/566,213的优先权和权益,这些申请的全部内容通过援引如同在下文全面阐述那样且出于所有适用目的而被纳入于此。

领域

本公开一般涉及处理器安全性,并且更具体地涉及防止经动态生成的执行代码触发存储器损坏攻击。

背景

随着高级risc机器v8.3(armv8.3)指针认证(pa)扩展的引入,有可能保护代码和数据指针免受存储器损坏攻击。在指针认证的一个示例中,密码签名被附加到指针值以使得可以在使用指针之前验证该密码签名。缺少用于创建密码签名的密钥的攻击者不太可能能够创建供漏洞使用的有效指针。pa指令可以帮助实施代码和数据流完整性,但是如果存在攻击者可注入和运行代码的可写且可执行存储器区域,则这些pa指令将失败。一种类型的动态代码生成包括即时编译(有时被称为动态翻译和/或运行时编译),其在程序的运行时或执行期间发生,而非在执行之前发生。动态代码生成在现代软件中是普遍的,并且例如在其中速度是必要的解释器和浏览器环境中得以频繁使用。然而,此类经动态生成的执行代码可能被攻击者使用以利用不受指针认证保护的可写且可执行存储器区域。即,经动态生成的代码可调用例如将指令/操作跳转或分支到攻击者可利用(例如,注入并运行有害代码)的不受保护的存储器区域中。

相应地,存在防止经动态生成的可执行代码利用不受保护的可写和/或可执行存储器区域来发起攻击的需要。

概述

相应地,存在需要,提供了一种在处理电路处操作的用于保护经动态生成的代码的执行的方法。当查明将要执行经动态生成的代码时,该经动态生成的代码可以被限制成使用不受保护的存储器空间内的第一存储器区域,其中第一存储器区域不同于由该处理电路执行的其他进程所使用的其他存储器区域。在一些实例中,限制经动态生成的代码可以由该处理电路和/或在其上操作的操作系统内核来执行。

在一些实例中,经动态生成的代码可以在由该处理电路生成之际被立即置于第一存储器区域中。在一个示例中,第一存储器区域可以是从耦合到或集成在该处理电路内的存储器设备的可写的执行存储器区域内定义的。在一些实现中,存储器页表中的标志被用于标记起源于第一存储器区域的所有存储器页面。

第一处理栈(其与由该处理电路执行的其他进程所使用的通用处理栈分开)可以被维护以用于第一存储器区域内的经动态生成的代码,其中在执行经动态生成的代码时栈指针被切换至第一处理栈,而在该经动态生成的代码结束时该栈指针被切换至通用处理栈。从第一存储器区域到其他存储器区域的所有存储器访问和/或对控制的转移被实施成通过经认证的指针来发生,从而忽略/禁用与其他指针认证相关的所有指令。

在一个实现中,经动态生成的代码所使用的计算指令可以被限制成在第一存储器区域内操作。

在一个示例中,如果经动态生成的代码内的加载、存储、和/或分支指令调用第一存储器区域之外的地址,则页面故障指示符可被触发。

在另一示例中,如果经动态生成的代码内的特殊或系统指令调用第一存储器区域之外的地址,则页面故障指示符可被触发。

在一些实例中,限制经动态生成的代码可以由该处理电路和/或在其上操作的操作系统内核来执行。

在一些实现中,处理电路可以是高级精简指令集计算机(risc)机器(arm)处理器。在一个示例中,返回和调用指令可以是将控制转移到第一存储器区域的唯一方式。

根据一个实现,一个或多个寄存器可定义可以由经动态生成的代码利用的一个或多个存储器范围。

另一方面提供了一种处理设备,其包括耦合到处理电路的存储器设备。该处理电路可被配置成:(a)查明何时将要执行经动态生成的代码;(b)将该经动态生成的代码限制成使用该存储器设备的不受保护的存储器空间内的第一存储器区域,其中该第一存储器区域不同于由该处理电路执行的其他进程所使用的其他存储器区域;(c)维护第一处理栈(其与由该处理电路执行的其他进程所使用的通用处理栈分开)以用于第一存储器区域内的该经动态生成的代码,其中在执行该经动态生成的代码时栈指针被切换至第一处理栈,而在该经动态生成的代码结束时该栈指针被切换至通用处理栈;和/或(d)将从第一存储器区域到其他存储器区域的所有存储器访问和对控制的转移实施成通过经认证的指针来发生,从而忽略/禁用与其他指针认证相关的所有指令。

在一个示例中,该处理电路可以进一步被配置成:(a)将该经动态生成的代码所使用的计算指令限制成在第一存储器区域内操作;(b)如果该经动态生成的代码内的加载、存储和/或分支指令调用第一存储器区域之外的地址,则触发页面故障指示符;和/或(c)如果该经动态生成的代码内的特殊或系统指令调用第一存储器区域之外的地址,则触发页面故障指示符。

在一个实现中,该处理电路可以是高级risc机器处理器。

在一个示例中,存储器设备可以被集成在该处理电路内。

在一个实例中,第一存储器区域可以是从耦合到或集成在该处理电路内的存储器设备的可写的执行存储器区域内定义的。

在一个示例中,该经动态生成的代码可以在由该处理电路生成之际被立即置于第一存储器区域中。

另一方面证明了一种具有一条或多条指令的非瞬态处理器可读存储介质,该一条或多条指令在由至少一个处理电路执行时使得该至少一个处理电路执行以下操作:(a)查明何时将要执行经动态生成的代码;(b)将该经动态生成的代码限制成使用不受保护的存储器空间内的第一存储器区域,其中该第一存储器区域不同于由该处理电路执行的其他进程所使用的其他存储器区域;(c)维护第一处理栈(其与由该处理电路执行的其他进程所使用的通用处理栈分开)以用于第一存储器区域内的该经动态生成的代码,其中在执行该经动态生成的代码时栈指针被切换至第一处理栈,而在该经动态生成的代码结束时该栈指针被切换至通用处理栈;和/或(d)将从第一存储器区域到其他存储器区域的所有存储器访问和对控制的转移实施成通过经认证的指针来发生,从而忽略/禁用与其他指针认证相关的所有指令。

附图简述

图1解说了配置成防止或禁止经动态生成的可执行代码利用不受保护的存储器区域来发起攻击的示例性设备。

图2是解说其中可以在不受保护的存储器区域/栈内安全地执行经动态生成的代码的系统的框图。

图3是解说处理器可以如何执行经动态生成的指令以防范攻击的示例的框图。

图4是解说经动态生成的代码的指令执行的一个示例的框图。

图5解说了用于执行经动态生成的代码的示例性不受保护的存储器区域/栈。

图6解说了可以在处理电路中操作以禁止经由经动态生成的代码的攻击的方法。

详细描述

现在参照附图描述各个方面。在以下描述中,出于解释目的阐述了众多具体细节以提供对一个或多个方面的透彻理解。但是显然的是,没有这些具体细节也可实践此类(诸)方面。

概览

第一方面提供了一种方法,该方法准许经动态生成的代码从不受保护的存储器空间执行,同时防止攻击者将代码定向到该不受保护的存储器空间的另一区域来发起攻击。经动态生成的代码(例如,潜在不受信任代码)可以被隔离在不受保护的存储器空间的动态定义的存储器区域内。

第二方面提供了一种处理器,该处理器用于在一些指令在不受保护的存储器空间的动态定义的存储器区域之外被执行的经动态生成的代码中出现时不同地执行这些指令。即,如果从所定义的存储器区域内执行的某些指令尝试访问、分支或跳转到所定义的存储器区域之外的存储器地址,则此类指令被阻止。

第三方面提供了将要在所定义的存储器区域内的应用栈与沙盒栈之间传递的栈。

第四方面提供了供经动态生成的代码访问所定义的存储器区域之外的地址空间或功能所使用的经认证指令的单个网关集。与其他指针认证相关的指令被忽略或禁用。

示例性操作环境

图1解说了配置成防止或禁止经动态生成的可执行代码利用不受保护的存储器区域来发起攻击的示例性设备102。设备102可以包括耦合至收发机电路106、存储器设备108、显示器设备110、和/或一个或多个输入/输出设备112的处理电路104(例如,arm架构处理器)。存储器设备108可以包括受保护的存储器区域114和不受保护的存储器区域116。在一些实现中,处理电路104可用于加载和执行经动态生成的代码,也被称为即时代码。在一个示例中,处理电路104可被配置成或可配置以隔离进程内的潜在不受信任代码,同时允许该潜在不受信任代码以受控方式来与进程代码的其余部分对接。此办法维护在可写且可执行存储器(例如,不受保护的存储器空间)之外执行经动态生成的本地代码(nativecode)的能力。即,可以从不受保护的存储器区域116的保留/沙盒式部分118执行经动态生成的代码。

在一种实现中,可以在例如不受保护的存储器区域116内定义保留(沙盒式)存储器区域118,以供经动态生成的(例如,潜在不受信任的)代码使用。当执行经动态生成的代码时,处理电路104可被配置成在修改某些指令的操作的同时使用保留/沙盒式存储器区域118。在各种实现中,此类保留/沙盒式存储器区域/空间118可以被预先分配(例如,在操作系统的初始化或引导期间),或者可以在编译经动态生成的代码之前或作为其一部分而立即作出分配。

图2是解说其中可以在不受保护的存储器区域/栈中安全地执行经动态生成的代码的系统的框图。在此示例中,处理电路202可被耦合到存储设备204和/或存储器设备206。处理电路202可以包括能够主存或执行操作系统210(可以通过该操作系统210来执行可执行软件212(例如,代码、指令等))的一个或多个处理器。在一个示例中,可执行软件212可以包括动态代码生成214。

存储设备204可以是其中可以存储经编译的可执行软件208的非瞬态存储。经编译的可执行软件208可以包括用于执行的各种指令205和207。一些指令可以包括用于动态代码生成的指令207a和207b。在指令c207a和j207b的执行期间,处理电路可以执行动态代码生成214,这导致生成存储在存储器设备206的不受保护的存储器空间/栈216中的经动态生成的代码218。

随后,该经动态生成的代码218可以由处理电路202在操作系统210的控制下执行。

图3是解说处理器可以如何执行经动态生成的指令以防范攻击的示例的框图。在操作系统内核级别下,处理器可以查明是否已调用经动态生成的代码(302)。若是,则处理器进入执行模式,该执行模式利用不受保护的存储器内的保留沙盒存储器空间来执行经动态生成的代码(304)。在一个示例中,这还可以包括将栈指针传递到保留沙盒存储器空间中。

在指令是从保留沙盒存储器空间取回并被执行时,处理器查明是否已调用访问保留沙盒存储器空间之外的地址的指令(306)。若是,则处理器默认地中止/挂起指令的执行(310)。然而,可存在某些例外,这些例外允许此类指令(例如,某些经认证的指令)在保留沙盒存储器空间之外被执行(308)。如果指令不是此类例外,则指令的执行被阻止,并且故障指示符被触发。

图4是解说经动态生成的代码的指令执行的一个示例的框图。在此示例中,操作系统(和/或处理器)可以确定是否已调用经动态生成的代码(402)。若是,则从经动态生成的代码所驻留的保留沙盒存储器区域获得指令(404)。如果指令是算术或计算指令(例如,算术逻辑单元(alu)指令、向量指令(诸如标量向量扩展或即sve),则此类指令可被执行(412)。

如果指令是加载、存储、和/或分支指令(408)并且去往/来自保留沙盒存储器区域之外的地址(409),则该指令不可被执行,并且其引发或触发一指令故障(416a)。然而,如果该指令是加载、存储和/或分支指令(408)并且去往/来自保留沙盒存储器区域中的地址,则该指令可被执行(412)。

如果指令是特殊指令或系统指令(414),则它也引发或触发一指令故障(416)。

一般而言,经动态生成的代码内的这些指令执行规则确保可改变系统状态的指令不允许被执行。

在一个示例中,仅某些经认证的指令(410)允许在保留沙盒存储器区域之外被执行。例如,经认证的调用可以是一条此类经认证的指令。在一个示例中,对于去往保留/沙盒式存储器区域之外的指令,仅可允许组合的aut+ret(认证+返回)(reta*)和aut+call(认证+调用)(blra*)指令。所有的其他指针认证(pa)指令(包括指针认证代码pac*)均被视为如同指针认证被禁用那样(例如,基于该指令,无操作nop或故障)。组合的aut+ret(reta*)和aut+call(blra*)在目的地位于保留/沙盒式存储器区域中的情况下跳过认证,并且如同返回ret那样起作用以及用去往寄存器blr指令的链接来分支。此受限的认证规则确保在保留沙盒存储器区域中操作的经动态生成的代码仅能通过已由进程自身所认证/批准的指针使用组合的调用和返回pac*指令来调用进入该进程的其余部分(即,不是经动态生成的代码)。通过组合的aut+load(认证+加载)指令来从经动态生成的代码访问数据是不被允许的。组合的加载指令具有允许访问指针周围的大存储器范围的偏移,并且不存在组合的存储指令。注意,对上下文和/或密钥可能存在进一步的限制(例如,仅允许零个上下文,例如,仅允许b密钥)以使得不旨在用于经动态生成的代码而是以某种方式泄漏并传递到经动态生成的代码域中的经认证的指针不可由经动态生成的代码使用。在一些实现中,在经动态生成的代码内仅允许经认证的调用指令。经认证的分支(bra*)指令不被允许。这是为了防范经动态生成的代码分支到一外部函数,该外部函数具有随后将返回到被经动态生成的代码控制的外部存储器地址的受控链接寄存器(lr)。当目的地位于经动态生成的代码所使用的保留/沙盒式存储器区域内时跳过对blra*和reta*指令的认证使得有可能执行被编译成使用保留/沙盒式存储器区域内的指针认证(pa)指令的代码。

图5解说了用于执行经动态生成的代码的示例性不受保护的存储器区域/栈。不受保护的存储器区域/栈502可以包括用于执行第一应用a504的指令,该指令可包括动态代码生成指令506。当动态代码生成指令506被执行时,它创建存储在不受保护的存储器区域/栈502的保留沙盒存储器空间510中的经动态生成的代码508。

根据一个方面,当由处理器执行经动态生成的代码508时,为了栈指针(sp)可被使用,至保留沙盒存储器空间/区域510中的项必须将该栈指针(sp)移动到保留沙盒存储器空间/区域510中。此规则允许经动态生成的代码508域具有其自己的栈(例如,由栈指针sp'标识)。当调用经动态生成的代码508时,调用方(例如,调用指令或函数)将栈指针设为保留沙盒存储器空间/区域510内部的栈。在一个示例中,当执行此类调用经动态生成的代码508时,调用方可以将arm指令paci[ab]sp,x30用于用经更新的sp来给链接寄存器lr打标签,以使得经动态生成的代码508能通过reta[ab]来返回。这允许经动态生成的代码508在完成时通过经认证的返回指令来返回。随后,调用方可以在继续之前恢复sp。

存在可以定义保留沙盒存储器空间/区域510和/或域的各种方式。在一个示例中,所有可写的执行区域([r]wx区域)可被自动视为保留沙盒存储器区域。作为进一步完善,有可能将rwx存储器的起源于相同页表子树的区域视为单个保留沙盒存储器区域。这将允许多个不同的沙盒式存储器区域在一进程内共存。

在另一示例中,可以添加定义经动态生成的代码存储器范围(例如,保留或沙盒式存储器范围)的新寄存器(基数+大小)。这允许多个不同的存储器范围和不同的页面准许共存于经动态生成的代码所使用的沙盒式存储器范围内。但是,此选项可能需要附加的机制/指令来配置这些寄存器,并且将不自动限制进程地址空间中可能存在的任何wx区域。

在又一示例中,可以向页表添加一标志以将源自于该项的所有页面标记为沙盒式存储器的一部分。如果每个页表项(pte)子树被视为单独的沙盒式存储器区域,则此办法可被用于支持多个范围。此办法还允许任意页面准许共存于沙盒式存储器区域内。

自动地将可写且可执行(wx)区域作为沙盒存储区域510的一部分将是隐式地实施执行指针认证所依赖的数据执行保护(dep)的一种方式。使用地址范围可能更灵活且更接近于将代码和数据指针限制为用于将一段代码或库进行沙盒化的地址范围的类cheri使用(即,功能硬件增强型risc指令处理器)。使用页表项来分段和标示沙盒式存储器区域还增加了灵活性,但是需要附加的操作系统(os)支持来管理这些标志。也有可能实现这些技术的组合。

图6解说了可以在处理电路中操作以禁止经由经动态生成的代码的攻击的方法。处理电路可以查明何时将要执行经动态生成的代码(602)。经动态生成的代码可以被处理电路限制成使用不受保护的存储器空间内的第一存储器区域,其中第一存储器区域不同于由该处理电路执行的其他进程所使用的其他存储器区域(604)。不受保护的存储器空间可以在任何安全的执行环境之外。然而,处理器可以实现沙盒操作模式,其中限制了从经动态生成的代码访问第一存储器区域之外的存储器区域。

例如,经动态生成的代码所使用的算术/计算指令可以被处理电路限制成在第一存储器区域内操作(606)。

处理电路还可以维护第一处理栈(其与由该处理电路执行的其他进程所使用的通用处理栈分开)以用于第一存储器区域内的经动态生成的代码,其中在执行经动态生成的代码时栈指针被传递到第一处理栈中或切换至/指向第一处理栈,并且在经动态生成的代码结束(例如,完成执行)时该栈指针被传递出到通用处理栈或切换至/指向通用处理栈(608)。

如果经动态生成的代码内的加载、存储和/或分支指令调用第一存储器区域之外的存储器地址,则处理电路可以触发页面故障指示符(610)。

如果经动态生成的代码内的特殊或系统指令调用第一存储器区域之外的地址,则处理电路可以触发页面故障指示符(612)。

在一个示例中,页面故障指示符可以是由操作系统内核所提供的存储器故障指示符。

处理电路可以将从第一存储器区域到其他存储器区域的所有存储器访问和对控制的转移实施(例如,限制、强制、路由、调用等)成通过或使用经认证的指针来发生,从而忽略/禁用与其他指针认证相关的所有指令(614)。

在一个示例中,处理电路可以是高级risc机器(arm)处理器。

根据一个方面,一个或多个寄存器可被用于定义可以由经动态生成的代码利用的一个或多个存储器范围。

第一存储器区域是从耦合到或集成在处理电路内的存储器设备的可写的执行存储器区域内定义的。

在另一方面,存储器页表中的标志可被用于标记起源于第一存储器区域的所有存储器页面。

提供了一种处理设备,其包括存储器设备和处理电路。该处理电路可被配置成:(a)查明何时将要生成和/或执行经动态生成的代码;(b)将经动态生成的代码限制成使用该存储器设备的第一存储器区域,其中该第一存储器区域不同于由该处理电路执行的其他进程所使用的其他存储器区域;(c)将经动态生成的代码所使用的计算指令限制成在第一存储器区域内操作;(d)如果经动态生成的代码内的加载、存储和/或分支指令调用第一存储器区域之外的地址,则触发页面故障指示符;(e)如果经动态生成的代码内的特殊或系统指令调用第一存储器区域之外的地址,则触发页面故障指示符;(f)认证去往/来自经动态生成的代码的所有返回和调用指令,并且忽略/禁用所有的其他指针认证指令;和/或(g)维护第一处理栈(其与由该处理电路执行的其他进程所使用的通用处理栈分开)以用于第一存储器区域内的经动态生成的代码,其中在执行经动态生成的代码时栈指针被传递到第一处理栈中或即切换至/指向第一处理栈,而在经动态生成的代码结束时该栈指针被传递出到通用处理栈或切换至/指向通用处理栈(608)。

将理解,所公开的过程中的步骤的特定顺序或层次是示例性方法的说明。基于设计偏好,可以重新编排这些过程中各步骤的具体次序或层次。所附方法权利要求以示例次序呈现各种步骤的要素,且并不意味着被限定于所给出的具体次序或层次。

提供先前描述是为了使本领域任何技术人员均能够实践本文中所描述的各种方面。对这些方面的各种修改将容易为本领域技术人员所明白,并且在本文中所定义的普适原理可被应用于其他方面。因此,权利要求并非旨在被限定于本文中所示的方面,而是应被授予与语言上的权利要求相一致的全部范围,其中对要素的单数形式的引述除非特别声明,否则并非旨在表示“有且仅有一个”,而是“一个或多个”。除非特别另外声明,否则术语“一些/某个”指的是一个或多个。本公开通篇描述的各个方面的要素为本领域普通技术人员当前或今后所知的所有结构上和功能上的等效方案通过引述被明确纳入于此,且旨在被权利要求所涵盖。此外,本文中所公开的任何内容都并非旨在贡献给公众,无论这样的公开是否在权利要求书中被显式地叙述。没有任何权利要求元素应被解释为装置加功能,除非该元素是使用短语“用于……的装置”来明确叙述的。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1