shell崩溃生成用户态core文件而非内核转储,取证需确保允许生成、精准定位、保留上下文:停用apport/systemd-coredump,设suid_dumpable=1,配置kernel.core_pattern含%e.%p.%u.%g.%t,/var/log/coredumps设1777权限,ulimit与systemd limitcore设为unlimited,用外部程序触发段错误并用gdb验证调用栈与上下文。

Shell崩溃本身不会触发内核级core dump——它属于用户态进程异常终止,生成的是用户态core文件,而非内核转储(kdump/kexec crash kernel那种)。所谓“内核调用链”在Shell崩溃场景中实际指崩溃进程的用户态调用栈,需靠core dump + gdb还原,而非真正意义上的内核堆栈。要确保这一过程可靠用于安全取证,关键在三点:允许生成、精准定位、保留上下文。
确保core dump不被系统拦截或限制
多数现代发行版(如Ubuntu、RHEL 8+)默认启用apport或systemd-coredump服务,它们会接管崩溃处理,可能屏蔽原始core文件或重定向到非预期位置。取证需原始、未压缩、带完整内存镜像的core文件:
- 临时停用干扰服务:
sudo systemctl stop apport systemd-coredump(Ubuntu)或sudo systemctl stop systemd-coredump(RHEL/CentOS Stream) - 确认
/proc/sys/fs/suid_dumpable为1(允许SUID程序生成core):echo 1 | sudo tee /proc/sys/fs/suid_dumpable - 检查并清除可能覆盖行为的
core_pattern管道调用,避免类似|/usr/lib/systemd/systemd-coredump这类转发配置
配置kernel.core_pattern支持取证级命名与路径
取证要求每个core文件可唯一追溯到具体Shell实例、时间、主机和权限上下文。推荐使用以下格式:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
sudo sysctl -w kernel.core_pattern="/var/log/coredumps/core.bash.%e.%p.%u.%g.%t"- 其中
%e(执行名,如bash)、%p(PID)、%u(UID)、%g(GID)、%t(Unix时间戳)组合,能区分普通用户、root、不同shell会话,避免混淆 - 路径
/var/log/coredumps/需提前创建并设宽松权限:sudo mkdir -p /var/log/coredumps && sudo chmod 1777 /var/log/coredumps(sticky bit确保仅属主可删)
配套ulimit与权限策略保障落地
仅改core_pattern不够,Shell进程自身必须被允许写入core:
- 对目标用户(如
root或审计账户),在/etc/security/limits.conf中添加:root soft core unlimitedroot hard core unlimited - 若Shell由systemd服务启动(如sshd派生的bash),还需在对应unit文件中设置
LimitCORE=infinity,否则systemd会覆盖ulimit - 验证生效:
su - root -c 'ulimit -c'应返回unlimited;再运行cat /proc/sys/kernel/core_pattern确认路径无误
触发与验证取证链完整性
测试不能只靠kill -SEGV $$——该信号可能被Shell自身捕获忽略。更可靠方式是用外部进程强制触发:
- 编写最小复现脚本:
echo 'int *p=0; *p=1;' | gcc -x c - && ./a.out(生成段错误) - 崩溃后检查:
ls -l /var/log/coredumps/core.bash.*,确认文件存在且大小合理(通常数MB起) - 用
gdb $(which bash) /var/log/coredumps/core.bash.*加载,执行bt full查看完整调用栈和寄存器值,确认关键上下文(如环境变量、命令行参数)是否保留










