7

浙江大学百人计划研究员申文博:容器场景下的内核安全

 2 years ago
source link: https://blog.csdn.net/m0_46700908/article/details/125415176
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

浙江大学百人计划研究员申文博:容器场景下的内核安全

CSDN云原生 已于 2022-06-22 19:25:16 修改 115
ea6b68a8f8d8857cbd4f833a25da867c.gif

嘉宾 | 申文博 整理 | 哪吒

出品 | CSDN云原生

2022年6月7日,在CSDN云原生系列在线峰会第7期“安全技术峰会”上,浙江大学百人计划研究员、博士生导师申文博以内核传统攻击和防护演化为切入,分享了容器给内核安全带来的新挑战——抽象资源攻击和内存计数问题。

据统计,2008-2019年,Linux内核代码量急剧增长,到2019年已超过2300万行,而最新统计数据显示,Linux内核代码量更是将近2800万行。

与此同时,Linux只是Android生态的一部分,在Linux内核之上,还有HAL、Runtime、Framework、Applications等多层。

251928554d1b1ce461310c7eb8bab8f3.png

我们知道,代码量跟Bug数量或者跟漏洞数量成正比,也就是说,代码量越多,Bug数量、漏洞数量也会越大。这些漏洞往往会被攻击者利用,产生新型的攻击。

同时,新型的攻击又催生了新型的防护,所以对操作系统内核的攻防是在不断的对抗中演化升级的,可谓没有绝对安全的系统,也没有绝对强的攻击手段。

f2f722bb4b3653c42b7269fb4376ed93.png

内核传统攻击和防护演化

攻防一般围绕着代码注入、代码重用、数据攻击进行对抗。下图展示的是内核攻击和防护的演化历程。

bb3400a61abb8408b9c306f1d08efc68.png

代码注入攻防

通过内核漏洞

  • 篡改已有代码text section

  • 注入新的代码

  • 或者跳到用户代码,比如jump-to-user

系统控制能力大

  • 可执行新代码

多见于早期Linux

  • 比如Kernel Text RWX(Android 2013)

内核代码注入防护

  • 保护已有代码W^X

  • 硬件支持,杜绝注入

  • 数据不可执行(2001 XN ARM; NX AMD)

  • 特权不可执行(2011 SMEP Intel; PXN ARM)

通过内核页表来实现

0ab3e870f9ec12761c778c85b5a3146d.png
  • 在内核页表设置相应的保护位,实现保护

  • 多数Android设备, 包含Google Pixel

  • 防御性弱,内核页表被改掉即失效

  • 对内核页表没有保护

  • 攻击者可篡改页表,去掉保护

  • 进而篡改代码   

通过隔离环境保护内核页表

1ce6b10bbfc43032f0a7e3532ec79500.png
  • 通过隔离环境,避免内核漏洞影响

  • 实现了纵深防御defense-in-depth

内核代码重用攻击

内核代码重用攻击也被称为控制流劫持攻击,该攻击无法注入新代码,而是重用已有代码。一般通过篡改控制流,拼接已有函数片段,实现攻击函数。

攻击方式有两种:

  • Return-oriented programming (ROP) :通过注入恶意返回地址,构造攻击函数

  • Jump-oriented programming (JOP):通过篡改函数指针,构造攻击函数

5ae475e5724443240f21168937e7dc4a.png

内核数据攻击

控制数据被保护后,攻击者提出非控制数据攻击

  • 返回地址和函数指针以外的数据

  • Data-oriented programming

  • 影响关键的安全特性:仅利用非控制数据攻击做到内核提权

非控制数据防护 

be585d189189faae76dcad8921354986.png
  • 种类繁杂,难以实行统一有效保护

  • 主流操作系统均缺乏对数据攻击的有效防护

总体来说,攻击演化呈现出

bd608ce8ebdee850964e10c4231f615d.png
  • 攻击难度指数级增加

  • 复杂性指数级增加

  • 隐蔽性在增加

  • 控制能力减弱

  • 数据攻击依然能root内核

防护演化呈现出

7c50de5eec48f912979e33b282bfad02.png
  • 软件到硬件

  • 学术界原型到产业界实用方案

4a98c4390b37a67ea5a4a1fd1bfb9c3f.png

内核在容器场景下的安全问题

容器是操作系统级虚拟化,它是由同一个内核虚拟出来多个用户空间的实例,每个用户空间的实例,不需要维护单纯的内核。用户空间的实例,也叫容器实例,它不用单独维护内核,所以效率高、启动快,并且配置比较灵活,会被广泛应用于代码。

在容器场景下,安全主要体现在抽象资源攻击、内存计数问题。

抽象资源攻击

容器本质是基于进程的资源隔离,由namespaces负责隔离,当前内核支持8种namespaces,包含UTS、IPC、mount、PID、network、user、time、cgroup;由control groups进行限制,当前内核支持13种cgroups,主要用于限制CPU、内存和设备资源。

容器注重限制物理资源,忽略抽象资源,如内核变量。我们发现,这些抽象资源同样可以被DoS攻击,例如打开大量文件,耗尽nr_files;所有新打开文件操作均会失败,导致无法运行新程序。同时发现,大的云厂商均可受到抽象资源攻击。

因此,内核数据同样决定操作系统功能的可用性,容易导致DoS攻击;内核data dependency复杂,难以彻底解决DoS问题;高安全性要求场景建议使用虚拟机隔离。

内存计数问题

内核依赖memcg对内存进行计数,而memcg未经系统性安全分析,存在安全隐患。因此,针对内存计数问题,我们做了大量的工作。

8557aeff0685cdad64991825a24289c4.png
8999d4e2ae259e6a4bb0af46a7e5b43c.png
  • 形式化定义了内存计数的步骤

  • 分析了policy design的问题

  • 设计自动化工具分析implementation问题

  • 发现了policy design中导致的计数缺失的问题

  • 设计了基于编译器的自动化分析工具,对policy implementation进行系统性分析

截至目前,我们发现了53个计数Bug,已确认其中的34个并提交patch。

总结来说,内核安全性在对抗中大幅提升,但对数据攻击防护依然不足。而容器场景给内核带来了新的机遇,也带来了新的安全挑战,包括抽象资源攻击和内存计数问题。


聚焦云原生新技术、新实践,帮助开发者群体赢在开发范式转移的新时代。欢迎关注CSDN云原生微信公众号~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK