笔记
introduction
功能干扰错误(functional interference bug):可能导致跨容器信息泄露、拒绝服务攻击和权限提升攻击。 在多租户环境下,不正确或者不充分的内核隔离会导致严重的容器安全问题:
- 不正确的隔离可能会让攻击者了解在同一台机器上运行的另一个容器的凭据,这可能会进一步导致对其他网络可访问系统的级联攻击
background and motivation
Linux Namespaces
通过unshare系统调用来创建和加入一个命名空间,一个namespace实例可以分配给一个进程或一组进程。 通过setns系统调用可以从一个命名空间切换到另一个命名空间。 通过clone系统调用,父进程可以指定子进程的命名空间,不指定则继承父进程的命名空间。
Testing Kernel Resource Isolation
- 通过比较主机和容器的procfs和sysfs中的统一文件来检测信息泄漏,但无法发现其他内核接口中的信息泄露。
- 静态分析方法来发现容易受到基于容器的拒绝服务攻击的内核抽象资源,但静态分析在大型和复杂的系统中很难发挥作用
Functional Interface Detection
目标:找到允许信息泄露和完整性攻击的内核隔离漏洞 使用功能干扰作为容器漏洞检测器:这种方法的目的不是在内核执行过程中查找内部错误,而是检测内核产生错误输出的证据
Practical Functional Interference Testing
解决了两个难题:高效的测试用例生成和有效的功能干扰错误检测。
Efficient Test Case Generation
功能干扰的根本原因是共享内核内存上的容器间通信,也就是说一个容器(sender)只有在修改内核共享内存区域时,才能干扰另一个容器(receiver)。
Effective Functional Interference Bug Detection
检测方法:分析receiver程序在执行sender程序和未执行sender程序时的执行轨迹。 判断方法:如果sender对receiver造成了功能干扰的话,那么两次执行的系统调用轨迹会不同。 优化方法(减少误报):
- 功能干扰发生在不受明明空间保护的资源上(不检测):与用户交互,由用户提供部分过滤规则。
- 由非确定性引起的系统调用轨迹差异(不报告):多次运行receiver程序,识别并忽略非确定性系统调用结果。
what is 非确定系统调用?
KIT Design
- 生成测试用例:
输入:内核测试程序(系统调用序列),可由fuzzer等外部工具生成 输出:触发功能干扰的测试用例,每个测试用例都由sender程序和receiver程序组成
- sender程序:修改本应隔离的内核资源
- receiver程序:检测对这些内核的修改(好像侧信道啊!!)
步骤:
- 发现容器间数据流:使用动态数据流分析,对每个测试程序触发的内存访问进行剖析,然后找到触发对相同内存位置的写入和读取访问的程序对。
- 优先触发独特内核行为的测试用例(回报率高)
- 使用多种启发式方法对可能触发相同内核行为的测试用例进行聚类,每个聚类只执行一个测试用例以提高效率。根据测试用例触发的潜在容器间内核数据流的属性来聚类相似的测试用例。如果两个测试用例能引起类似的容器内核间数据流,那么它们很可能会触发相同的功能干扰错误。
- DF-IA:涉及类似的写入和读取内核指令
- DF-ST:DF-IA的拓展,还考虑了执行写入和读取指令的调用栈
- 执行测试用例
KIT 使用虚拟机快照(保证执行环境相同),在不同的容器中运行每个测试程序
两次执行: (1)a容器中执行sender后b容器中再执行receiver (2)a容器中不执行sender,b容器中执行receiver 收集系统调用跟踪:系统调用的执行结果,包括参数、返回值和错误编码
- 分析跟踪结果
识别访问受保护资源的系统调用:用户设置的规则 识别非确定性结果:
有些系统调用的部分结果是非确定的,而部分结果是确定的:fstat 系统调用不仅会产生时间戳等非确定性结果,还会产生文件大小等确定性结果。
细粒度的跟踪比较算法:该算法比较两个系统调用跟踪的抽象语法树(AST),并报告树的差异。通过比较抽象语法树的差异,而不是比较纯系统调用跟踪文本,可以识别或忽略细粒度系统调用结果的差异。
- 汇总测试报告
特定的功能干扰案例通常只能由特定的发送方和接收方系统调用触发和检测。 为了找出发送方系统调用的根本原因,KIT 采用了一种差异测试方法:对于发送方程序中的每个系统调用,KIT 都会检查在执行过程中跳过该发送方调用是否会掩盖功能干扰。
Implementation
- 测试用例执行器:基于Syzkaller实现
Syzkaller:google的安全研究人员开发并维护的内核fuzz工具 https://github.com/google/syzkaller
- 系统调用识别:通过 Syzlang Syzkaller 的系统调用描述框架实现的