|CPU有个禁区,内核权限也无法进入


神秘项目
我是CPU一号车间的阿Q , 是的 , 我又来了 。
最近一段时间 , 我几次下班约隔壁二号车间虎子 , 他都推脱没有时间 , 不过也没看见他在忙个啥 。
前几天 , 我又去找他 , 还是没看到他人 , 却意外地在他桌上发现了一份文件 , 打开一看是一个代号为SGX的神秘项目 , 还是厂里领导亲自带头攻坚 。
|CPU有个禁区,内核权限也无法进入
本文插图

仔细看了看 , 原来 , 自从上次的攻击事件(详情:完了!CPU一味求快出事儿了!)发生以来 , 领导一直忧心忡忡 , 虽然当时依靠操作系统提供的办法暂解了燃眉之急 , 不过治标不治本 , 我们自身的缺陷一直存在 , 保不准哪天还要翻车 。
这个代号为SGX的神秘项目全称Software Guard Extensions , 志在全面改革 , 提升咱们CPU的安全能力 。
偷听会议
我瞬间不高兴了 , 这么重要的项目 , 居然没找我参加?
随即 , 我来到了领导的办公室 , 果然他们几个在开着秘密会议 , 而我就凑在一旁偷听 。
|CPU有个禁区,内核权限也无法进入
本文插图

“诸位 , 你们都是咱们厂里的核心骨干 , 关于这次安全能力提升的事情 , 大家回去之后有没有什么想法 , 请畅所欲言!” , 我听到领导在讲话 。
核心骨干?难道我阿Q不是核心骨干吗?真是气抖冷!
沉闷了一小会儿 , 隔壁二号车间虎子才说到:“咱们现在不是有安全访问级别吗 , 从Ring0到Ring3 , 已经可以很好到隔绝应用程序的攻击了啊”
|CPU有个禁区,内核权限也无法进入
本文插图

领导摇了摇头 , “尽管如此 , 但是一些恶意软件可以利用操作系统的漏洞可以获取到Ring0的权限 , 咱们现有的安全保护就荡然无存了”
“那也是操作系统的锅 , 要改进也该让他们做啊 , 关我们什么事呢?” , 虎子继续说到 。
“你忘记前段时间针对咱们CPU发起的攻击了吗?”
此话一出 , 会场瞬间安静了 。 就这水平 , 领导居然请他来不请我!
领导缓了缓 , 接着说到:“咱们不能总依赖操作系统的安全保护 , 咱们自己也得拿出点办法 。 我觉得现有的安全机制不够 , 操作系统漏洞频出 , 很容易被攻破 , 咱们现在不能信任操作系统 , 得彻底全面的改革!”
这时 , 五号车间的代表说话了:“领导 , 我回去调研了一下 , 了解到咱们的竞争对手推出了一个叫TrustZone的技术 , 用于支持可信计算 , 号称提供了一个非常安全的环境专门支持对安全性要求极高的程序运行 , 像什么支付啊、指纹认证之类的 , 咱们要做的话可以参考一下”
听完TrustZone的介绍 , 三号车间老哥仿佛找到了灵感 , 激动的说到:“有了!咱们可以在内存中划出一片特殊的区域 , 作为最高机密的空间 。 将高度机密的程序代码和数据放在这里面运行 , 再引入一种新的工作模式 , 咱们CPU只有在这种模式下才允许访问这个安全空间 , 否则就算是有Ring0的权限也不能访问!”
|CPU有个禁区,内核权限也无法进入
本文插图

引进一个新的工作模式 , 这种思路倒是很新鲜 , 大家纷纷议论开来 。
“这个安全空间技术上要怎样实现呢?”
“线程怎么进入和退出安全空间?恶意程序进去了怎么办?”
“怎么调用外部普通空间的函数呢?外部函数被攻击了怎么办?”
“需要系统调用怎么办?中断和异常怎么办?”
短短一小会儿时间 , 大家就七嘴八舌提了一堆问题出来···
领导给他们几个一一分配了任务 , 下去思考这些问题的解决办法 , 过几天再进行讨论 。
在他们散会离场前 , 我匆忙离开了 。
主动出击
这可是个表现的好机会 , 要是能解决上面的问题 , 领导说不定能让我加入这个项目组 。
对于安全空间实现问题 , 既然是从内存上划出来的区域 , 自然得从内存的访问控制上做文章 。 我跟咱们厂里内存管理单元MMU的小黑还算有些交情 , 打算去向他请教一番 。
听完我的需求 , 小黑不以为意 , “就这啊 , 小事一桩 , 访问内存时我会进行权限检查 , 到时候除了之前已有的检查 , 再加一道检查就可以:如果发现是要访问安全空间的页面 , 再检查一下当前的工作模式是否正确”
其他几个问题我也有了自己的想法 , 安全空间按照创建-初始化-进入-退出-销毁的顺序进行使用 。
创建:通过执行ECREATE指令创建一个安全空间 ,
初始化:通过执行EINIT指令对刚才创建的安全空间进行初始化
进入 & 退出:通过执行EENTER/EEXIT指令进入和退出安全空间 , 类似于系统调用的SYSENTER/SYSEXIT指令 。 提前设置好入口地址 , 进入安全空间后需要从指定的地方开始执行 , 避免外面的程序乱来 。 执行这两条指令的同时CPU进行安全模式的切换 。
中断 & 异常:遇到中断和异常 , 需要转而执行操作系统内核处理代码 , 而操作系统是不能被信任的 。 需要执行AEX指令退出 , 将在安全空间执行的上下文保存起来 , 以便回头继续执行 。
系统调用:系统调用有点麻烦 , 需要进入操作系统内核空间 , 因为不能信任操作系统 , 同样需要先退出安全空间 , 执行完系统调用再进来 。
函数调用:安全空间和外部可以互相调用函数 , 普通空间调用安全空间函数叫ECALL , 安全空间调用外部空间函数叫OCALL 。 调用的方式类似操作系统的系统调用 , 不同的是操作系统的函数是内核提供 , 安全空间的函数是应用程序自己定义的
销毁:通过执行EREMOVE指令销毁一个安全空间
我还给这个安全空间取了一个名字 , 叫:Enclave , 自然而然咱们CPU的工作模式就分了Enclave模式和非Enclave模式 。
【|CPU有个禁区,内核权限也无法进入】内存加密
随后 , 我把我的这些想法整理出来 , 来到了领导办公室 , 主动申请加入SGX项目组 。
领导显然对我的到来有些意外 , 不过看完我准备的材料还是满意的同意了我的申请 , 让我也参与下一次的讨论会 , 真是功夫不负有心人!
很快就到了下一次的会议 , 我再也不用在门外偷听了 。
|CPU有个禁区,内核权限也无法进入
本文插图

会议上我的方案得到了大家的一致认可 , 只有八号车间的代表不以为然:“安全空间的方案是很好 , 但是还差一个最重要的东西 , 要是加上这个 , 那就完美了!”
“是什么?” , 大家齐刷刷的望向了老八 。
“这些形形色色的攻击方式 , 最终都是要读写内存数据 , 而他们屡屡得手的根本原因在于什么?” , 老八说到 。
大家一头雾水 , 不知道他想表达什么 。
“老八 , 你就别卖关子了 , 快说吧!”
老八站了起来 , 说到:“其根本原因就在于内存中的数据是明文 , 一旦数据泄漏就可能造成严重后果 。 而如果我们把安全空间的内存数据加密了呢?即便我们的防线都失守了 , 对方拿到的也只是加密后的数据 , 做不了什么!”
老八的话如当头一棒 , 我怎么就没往这个方向考虑 。
“加密?那什么时候解密呢?” , 虎子问到 。
|CPU有个禁区,内核权限也无法进入
本文插图

“问得好 , 我建议咱们厂里内存管理部门设置一个内存加密引擎电路MEE(memory encryption engine) , 对安全空间的数据进行透明的加解密 , 数据写入内存时加密 , 读入咱们CPU内部时再解密!”
虎子一听说到:“唉 , 这个好 , 建议全面推广 , 干嘛只在安全空间用啊”
老八拍了拍虎子的头:“说你虎 , 你还真虎 , 这玩意对性能影响不可小觑 , 怎么能随便用呢 , 好钢要用到刀刃上!”
“好!老八这个建议好 。 我决定这个项目就由老八来牵头!” , 领导拍案而起 。
|CPU有个禁区,内核权限也无法进入
本文插图

散会后 , 虎子笑我忙活半天还是没有当上牵头人 , 我倒是很看得开 , 能一起参与就不错了 , 学到技术才是王道~
彩蛋
SGX项目上马后 , 咱们CPU的安全性有了很大的提升 , 然而我们花了这么大力气打造出的这个安全空间真的如铁桶一般 , 牢不可破吗?
预知后事如何 , 请关注后续精彩······
受限于故事形式 , SGX技术的很多实现细节不便展开 , 感兴趣实现原理的朋友参考阅读下面的文章:
SGX技术的分析和研究:http://www.jos.org.cn/html/2018/9/5594.htm
Intel SGX学习:https://zhuanlan.zhihu.com/p/50894009
Intel 官方文档:https://software.intel.com/sites/default/files/article/413936/hasp-2013-innovative-instructions-and-software-model-for-isolated-execution.pdf
作者:轩辕之风
来源:编程技术宇宙(ID:xuanyuancoding)


    推荐阅读