auditd无法监控swap读写,因其不经过vfs路径和syscall入口;应通过禁用swap、调低swappiness、mlock锁定内存、加密swap等预防措施应对内存取证绕过风险。

auditd 为什么不能监控 Swap 读写
auditd 的文件系统规则(-w)只作用于**VFS 层可识别的路径**,比如 /etc/passwd、/var/log/ 这类挂载在文件系统上的对象。而 Swap 区域(无论是 swap 分区还是 swap 文件)在运行时:
- 不通过 VFS 路径触发常规文件 I/O 系统调用(如
read()/pread64()),而是由内核内存管理子系统(MM)直接操作页表与块设备; - 页面换入换出走的是
swap_readpage()、try_to_unmap()等内部函数,不经过 auditd 可挂钩的 syscall 入口(如openat、read); - 即使你对 swap 文件本身(如
/swapfile)加-w /swapfile -p r,也只能捕获用户态显式打开该文件的读操作(例如cat /swapfile),完全不覆盖内核自动换页行为。
“防止内存取证绕过”这个目标该怎么应对
攻击者利用 swap 绕过内存取证(如跳过 /dev/mem 或 crash 直接分析物理内存),本质是希望敏感数据(密钥、凭证、进程堆内容)落盘后不被发现。真正有效的防御不是“监控 swap 读”,而是减少敏感数据进入 swap:
-
禁用 swap(最彻底):
sudo swapoff -a && sudo sed -i '/swap/d' /etc/fstab,适用于内存充足且无休眠需求的服务器; -
设置
vm.swappiness=1(强烈推荐):echo 'vm.swappiness=1' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p,让内核几乎只在内存严重不足时才换页,大幅降低敏感页落盘概率; -
锁定关键进程内存:应用层调用
mlock()或mlockall()(需CAP_IPC_LOCK权限),确保密钥等数据常驻 RAM 不被换出; -
加密 swap(缓解数据泄露):使用
cryptsetup创建加密 swap 分区,或启用内核CONFIG_SWAP_ENCRYPTION(较新发行版默认开启); -
定期清空 swap(运维辅助):
sudo swapoff -a && sudo swapon -a,配合 cron 定期执行(注意服务中断风险)。
有没有间接可观测的线索?
虽然不能审计 swap 操作本身,但可监控可能触发换页的高风险行为,作为旁证线索:
- 监控大内存分配/释放:
auditctl -a always,exit -F arch=b64 -S mmap,mremap,brk -F uid!=0 -k mem_alloc; - 监控敏感进程启动(如 ssh-agent、gpg-agent):
auditctl -a always,exit -F path=/usr/bin/ssh-agent -F perm=x -k key_agent; - 结合
/proc/swaps和/proc/meminfo做基线比对,用脚本检测 swap 使用量突增(配合ausearch查看前后是否有可疑进程行为)。
总结
想靠 auditd 实时捕获“swap 读取”来防内存取证绕过,技术上不可行。重点应转向预防性控制:压低 swappiness、锁定关键内存、加密 swap 设备、必要时禁用 swap。日志侧可补充对大内存操作和敏感工具调用的审计,形成纵深观测能力。不复杂但容易忽略。











