内核态eBPF程序实现容器逃逸与隐藏账号rootkit

提示

本文不同于 云原生安全攻防|使用eBPF逃逸容器技术分析与实践,腾讯同学的实现,是用eBPF技术在内核态hook,修改文件,让用户态APP产生行为日志(cron的文件变化,且需要执行shell),完成逃逸。在此过程中,还是会留下一些日志行为,能被常规HIDS感知捕获,触发告警。

本文是在kernel space内核态,hook内核态函数,更改内核态返回用户态缓冲区数据,达到用户态欺骗的目的。用户态进程拿到被篡改的数据,从而被骗通过认证。在此过程,不改变任何文件、进程、网络行为,不产生日志。 常规HIDS、HIPS产品无法感知。

背景

前段时间,调研了业界基于eBPF实现的HIDS类产品,包括Ciliumdatadog、tracee、falco等产品。 在工程研发上,了解了业界在eBPF技术的应用方式,覆盖场景,实现的安全业务功能等。

在K8S生态下,涌现大批基于eBPF技术实现的集群网络管理插件,比如Calicocilium等。而业务实现网络管理服务是以容器化方式部署,且有需要给这些容器启用SYS_BPF_ADMIN权限以支持eBPF系统调用。

这些业务形态,恰恰给这种攻击手段一个完美的发挥空间。

目的

随着业务形态变化,在强大的eBPF技术下,会给安全上带来什么样的威胁呢?正巧前段时间也看到腾讯@neargle 同学们写的 云原生安全攻防|使用eBPF逃逸容器技术分析与实践 文章,深知eBPF的威胁远比这更可怕,细想其功能覆盖XDP、TC、probe、socket等,每个功能点都能实现内核态的篡改行为,从而使得用户态完全致盲,哪怕是基于内核模块的HIDS,一样无法感知这些行为。
为此,笔者跟大家分享这篇文章,演示eBPF技术的强大,给防御产品HIDS/HIPS预警,尽快完成eBPF相关入侵行为监控的建设,提升IDC的防御检测能力。

原理

既然容器启动时,已经授权启用了eBPF权限,那么理论上可以做任何事情,包括容器逃逸获得宿主机权限、实现超级隐藏的rootkit后门、绕过网络防火墙等。

那么eBPF技术还能做哪些事情呢?为了回答这个问题,我们回顾一下eBPF的hook点
eBPF Hook位置
从图中可以看出,eBPF的hook点功能包括以下几部分

  1. 可以在StorageNetwork等与内核交互之前;
  2. 也可以在内核中的功能模块交互之间;
  3. 又可以在内核态与用户态交互之间;
  4. 更可以在用户态进程空间。

这意味着,eBPF技术都可以在这些HOOK点做各种手脚,为所欲为,十分可怕。而更可怕的是,在前两个地方,都是在内核态以及内核态之前做手脚,而现有常见的HIDS都是基于内核里或者用户态做行为监控,这恰恰就绕开了大部分HIDS的监控,且不产生任何日志,简直细思极恐、不寒而栗

演示环境

版本

宿主机系统版本

系统内核版本

root@vmubuntu:/home/cfc4n#uname -a 
Linux vmubuntu 5.11.0-41-generic #45-Ubuntu SMP Fri Nov 5 11:37:01 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Linux 发行版

root@vmubuntu:/home/cfc4n#cat /etc/os-release
NAME="Ubuntu"
VERSION="21.04 (Hirsute Hippo)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 21.04"
VERSION_ID="21.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=hirsute
UBUNTU_CODENAME=hirsute

容器引擎版本

docker容器版本为20.10.12,比较新。

root@vmubuntu:/home/cfc4n#docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:34 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:42 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.11
  GitCommit:        5b46e404f6b9f661a205e28d59c982d3634148f8
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

镜像版本

容器镜像版本

root@vmubuntu:/home/cfc4n# docker image ls
REPOSITORY   TAG                IMAGE ID       CREATED         SIZE
ubuntu21     latest             5355960aa2c5   5 days ago      119MB
ubuntu       hirsute            d662230a2592   3 weeks ago     80MB
ubuntu       latest             ba6acccedd29   2 months ago    72.8MB
python       3.7.9-alpine3.11   8b32838a7ca6   11 months ago   41.9MB

环境

系统账号文件hash

root@vmubuntu:/home/cfc4n# md5sum /etc/passwd /etc/shadow
f43a244c13b639a41a8f555b28c1ff27  /etc/passwd
31dd98746685de12d8b6fb40ef22975e  /etc/shadow

演示视频


B 站 1080P原画 :https://www.bilibili.com/video/BV1f34y1z7nN/

检测防御

视频演示了eBPF技术的强大,只使用了tracepoint一个bpf prog类型实现容器逃逸与隐藏root的rootkit,不改动任何文件,用户态全程无感知。而eBPF还支持kprobe/kretprobe、uprobe/uretprobe、XDP、TC、socket、cgroup等程序类型,覆盖文件、网络、socket、syscall等事件,都是可以被黑客利用的地方。
比如,在XDP层实现一个IP转换,利用http(80端口)来透传sshd(22端口)的通信,完成绕过防火墙的目的,而主机的网络防火墙完全感知不到,更无法溯源出网络通信来源,就问你,可怕不可怕?

那针对这些威胁,站在防御者角度,该如何防范?eBPF实现的rootkit不同于常规rootkit,本身不改变函数地址、代码,防御检测的思路会有什么差别呢?

笔者近期将在「美团安全应急响应中心」微信公众号跟大家分享,敬请期待。
(已更新至: https://www.cnxct.com/evil-use-ebpf-and-how-to-detect-ebpf-rootkit-in-linux/ )

最后

临近元旦,祝大家玩得开心,我们…节后见。

知识共享许可协议CFC4N的博客CFC4N 创作,采用 知识共享 署名-非商业性使用-相同方式共享(3.0未本地化版本)许可协议进行许可。基于https://www.cnxct.com上的作品创作。转载请注明转自:内核态eBPF程序实现容器逃逸与隐藏账号rootkit

2 thoughts on “内核态eBPF程序实现容器逃逸与隐藏账号rootkit

Comments are closed.