Fileless ELF Execution via Kernel Keyring
20 days ago
- 这项技术使用Linux内核密钥环将ELF载荷存储在内核内存中,无需触碰文件系统。
- 载荷通过add_key系统调用以'user'类型存储,并通过keyctl的KEYCTL_READ进行检索。
- 读取后,密钥被撤销(KEYCTL_REVOKE),因此载荷仅存在于匿名用户空间映射中。
- 加载器手动将ELF中的PT_LOAD段映射到内存中,处理BSS并使用MAP_FIXED_NOREPLACE。
- 入口点直接跳转(无execve),并正确设置x86-64栈以及寄存器清零。
- 加载器可以选择删除自身二进制文件(通过/proc/self/exe),但这会产生一个'(deleted)'标记,可能触发检测。
- 该技术避免使用文件描述符和索引节点,不在/proc/self/fd或文件系统中留下痕迹(加载器二进制文件除外)。
- 默认的每个用户密钥环配额为20000字节;root用户可以使用/proc/sys/kernel/keys/root_maxbytes来支持更大的载荷(最高25 MB)。
- 加载器的第三个参数成为argv[0]并通过prctl(PR_SET_NAME)设置线程名称,有助于隐藏。