Docker 容器逃逸案例分析

本文详细分析了一个存在于 Docker 1.0 之前的版本中的容器逃逸案例,主要涉及 Linux Capability、Unix 系统文件操作原理,特别是 open_by_handle_at() 函数。通过对 PoC 源码 shocker.c 的逐行解释,深入探讨了如何利用文件描述符的特性实现容器逃逸。
摘要由CSDN通过智能技术生成

摘要: ## 0. 前言 本文参考自《Docker 容器与容器云》 这个容器逃逸的 case 存在于 Docker 1.0 之前的绝大多数版本。 目前使用 Docker 1.0 之前版本的环境几乎不存在了,这篇分析的主要目的是为了加深系统安全方面的学习。 本案例所分析的 PoC 源码地址:[shocker.c](https://github.com/gabrtv/shocker/b

0. 前言

本文参考自《Docker 容器与容器云》

这个容器逃逸的 case 存在于 Docker 1.0 之前的绝大多数版本。

目前使用 Docker 1.0 之前版本的环境几乎不存在了,这篇分析的主要目的是为了加深系统安全方面的学习。

本案例所分析的 PoC 源码地址:shocker.c

1. 预备知识

1.1 Linux Capability

尝试用较为简单的话来说明 Linux 中 Capability 的概念。

为了解决在某些场景下,普通用户需要部分 root 权限来完成工作的问题。Linux 支持将部分 root 的特权操作权限细分成具体的 Capability,如果将某个 Capability 分配给某一个可执行文件或者是进程,即使不是 root 用户,也可以执行该Capability 对应的特权操作。

1.2 Unix 系统文件操作原理

1.2.1 proc 与 user 结构体

以 UNIX V6 为基础进行说明,目前主流的 Linux 版本文件系统的实现原理与 UNIX V6 差别不大。

Unix 系统中与某一个进程密切相关的有两个结构体,它们是 proc 结构体和 user 结构体。

proc 结构体中保存了进程状态、执行优先级等经常需要被内核访问的信息,因此由 proc 结构体构成的数据 proc[] 是常驻内存的。

/*
 * Filename: proc.h
 */

struct proc {
    // 进程当前状态
    char p_stat;
    // 标识变量
    char p_flag;
    // 执行优先级
    char p_pri;
    // 接收到的信号
    char p_sig;
    // UID
    char p_uid;
    // 在内存或交换空间中存在的时间,单位秒
    char p_time;
    // 占用 CPU 的累积时间,单位时钟 tick 数
    char p_cpu;
    // 用于修正执行优先级的补正系数,默认 0
    char p_nice;
    // 正在操作进程的终端
    int  p_ttyp;
    // PID
    int  p_pid;
    // 父进程 PID
    int  p_ppid;
    // 数据段的物理地址
    int  p_addr;
    // 数据段长度
    int  p_size;
    // 进程进入休眠的原因
    int  p_wchan;
    // 使用的代码段
    int  *p_textp;
}

user 结构体中保存了进程打开的文件等信息,由于内核只需要使用当前执行进程的 user 结构体,所以当某一个进程被移至交换空间时, user

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值