【论文阅读】Shakti-T: A RISC-V Processor with Light Weight Security Extensions

一、背景

        由于计算核芯和电子商务的兴起,有必要在硬件层面保护我们的数据安全,目前面临的主要威胁是来自内存的攻击,包括时间和空间上两方面的侵入,团队制造出了一个名为Shakti-T的轻量级安全扩展芯片来解决这些问题,本处理器仅使用194个LUTs以及2197个触发器。

二、攻击类型

刚刚提到了基于内存的攻击

1. 基于空间上的攻击 -指针访问了它不允许被访问的地方。
   比较著名的例子有buffer-overflow,blaster-worm以及用于DDoS的slammer worm,安卓的Root也是利用了这个原理.
2. 基于时间上的攻击 -指针访问了已经被释放的地方。

三、解决方案

        前人对这两个问题提出了许多解决方案,为了解决问题一,有人提出了Lock and Key的方案,或者

- Stack Canaries,
- Encryption of The Code Pointer,
- Rearranging argument locations,
- 以及the Address Space Layout Randomization(ASLR)

等方法,而对于问题二,也有人提出富指针的方案,其中ASLR是抵御ROP(Return Oriented Programming)问题最好的方法,但是它依然存在一些问题,攻击者可以通过改变控制流的方法来绕过它们的检查。同时富指针方案也存在着高开销,缺乏稳定性等问题,即便有硬件层面的解决方案,当多个指针同时存在时也会失效。

四、富指针(Fat-Pointer)

        所谓富指针就是指,在原先指针的数据结构上再加上基地址和限长两个元素,每次为指针分配一个地址空间的时候,都会自动写入这块地址的起始位置和长度,而每次访问指针时,都会检查是否越界,以此来防止指针在释放后再次读取的问题.但是传统的方法有一个十分遗憾的问题,假如存在{P1,P2…..Pn}n个指针,它们同时指向同一个空间,当释放其中一个以后,由于是各存一份,访问其它指针依然会认为是正常访问,但实际上已经出现了空间上的攻击。

五、提出的方案

我们使用的是基于硬件的富指针:

  1. 基地址和边界统一存放于一个PLM(Pointer Limits Memory),而PLM的地址存于PLBR寄存器
  2. 每一个指针对应一个ptr_id
  3. 每次调用指针时使用ptr_id调取对应的基地址和边界,
    表格

我们使用如图表格来作为缓存,

  1. 其中左边的GPR(General Purpose Register)分两个部分一个是Tag bits,用于标记是数据还是指针,另一部分是寄存器的数值。
  2. 右边的BnBIndex和BnBLookUp包含在一个名为BnBCache的寄存器中,BnBIndex中的index表示BnBLookUp的位置,有效位V的值若为1,则表示可以从BnBLookUp中取到值,若为0,则说明需要从内存中去取所需的信息,当BnBLookUp中的信息被更新时,BnBindex中的信息也会被同步更新。BnBLookUp中的有效位V为1则表示它目前可用,为0则表示它可能被释放了。当BnBLookUp中的空间不足,则用LRU(最近最少使用)算法进行替换。

六、副作用及解决方案

        比如有的时候调用函数,某个寄存器被push了,若此时正好这个寄存器被替换出去,但是当数据再次被pop的时候那个寄存器已经是无效的了。于是需要新设计一个BnBStack(Base and Bound Stack)用于专门存放暂时被push的指针ptr_id.

七、结果

  1. 安全性:还是同样的问题,此处有(P1,P2….Pn)n个指针,若它们指向同一个地址,其中一个释放以后,BnBLookUp中有效位被置0,其它指针再访问它时,就可以得知它是无效的消息。
  2. 节约内存 :(P1,P2….Pn)n个指针,若他们指向同一个地址,则需要存n个ptr_id和1个base,一个bound,共n+2个空间。但传统的方法,每一个指针都需要存一份,则需要2n个空间。但如果这些指针分别指向不同的空间,则本方案更耗费一些空间。

William
会打代码的扫地王大爷
wlmnzf
中科院信工所
IIE
CAS
csuncle
丁洁的男朋友
丁洁的人
王立敏
Limin Wang wechat
Welcome!
I'm happy it's useful to you!
Show comments from Gitment