提示
本文不同于 云原生安全攻防|使用eBPF逃逸容器技术分析与实践,腾讯同学的实现,是用eBPF技术在内核态hook,修改文件,让用户态APP产生行为日志(cron的文件变化,且需要执行shell),完成逃逸。在此过程中,还是会留下一些日志行为,能被常规HIDS感知捕获,触发告警。
本文是在kernel space内核态,hook内核态函数,更改内核态返回用户态缓冲区数据,达到用户态欺骗的目的。用户态进程拿到被篡改的数据,从而被骗通过认证。在此过程,不改变任何文件、进程、网络行为,不产生日志。 常规HIDS、HIPS产品无法感知。
背景
前段时间,调研了业界基于eBPF实现的HIDS类产品,包括Cilium、datadog、tracee、falco等产品。 在工程研发上,了解了业界在eBPF技术的应用方式,覆盖场景,实现的安全业务功能等。
在K8S生态下,涌现大批基于eBPF技术实现的集群网络管理插件,比如Calico
、cilium
等。而业务实现网络管理服务是以容器化方式部署,且有需要给这些容器启用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点功能包括以下几部分
- 可以在
Storage
、Network
等与内核交互之前; - 也可以在内核中的功能模块交互之间;
- 又可以在内核态与用户态交互之间;
- 更可以在用户态进程空间。
这意味着,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 创作,采用 署名—非商业性使用—相同方式共享 4.0 进行许可。基于https://www.cnxct.com上的作品创作。转载请注明转自:内核态eBPF程序实现容器逃逸与隐藏账号rootkit
container_escapes_kern.c 能贴一下么
抱歉,代码过于危险,不便公开。核心目的是做安全建设。