Go 主机安全面试:Linux Web RCE 进程链与异常命令检测
Web 服务被打出 RCE 后,攻击者常会让 nginx、apache、php-fpm、tomcat 或业务进程拉起 sh、bash、curl、wget、chmod、python 等命令,再下载脚本、写入临时目录、执行探测或横向移动。面试官通常会追问:Go Agent 怎么从进程事件里识别 Web RCE?只看命令黑名单够不够?怎么降低发布脚本、备份任务和运维命令带来的误报?
岗位场景
Linux Web 主机
-> 采集进程创建、父子进程、命令行、工作目录、用户、文件写入和网络连接
-> 标准化 Web 服务进程、解释器、下载器、临时目录执行和权限变更
-> 关联 Web 入口、命令执行、落地文件、后续外联和主机探测
-> 输出可解释证据,支撑客户现场复盘和规则降噪这类题考的是 Linux 进程模型、Web 服务运行方式、命令行解析、攻击链关联、误报治理和 Go Agent 的低开销事件处理能力。
高频面试题
1. Web RCE 落到主机侧后,最先看哪些进程证据?
简洁答案:先看 Web 服务进程是否异常拉起 shell、解释器、下载器、权限工具或系统探测命令,再结合用户、工作目录和命令行判断是否偏离基线。
关键知识点:
- 常见父进程包括
nginx、apache2、httpd、php-fpm、java、tomcat、node。 - 常见子进程包括
sh、bash、dash、python、perl、curl、wget、chmod、id、whoami。 - 业务发布也可能执行脚本,所以不能只靠命令名告警。
Go 落地思路:
- 事件字段至少包含
pid、ppid、process.name、parent.name、argv、cwd、uid、start_time。 - 给 Web 服务进程打角色标签,例如
asset.role=web_server、process.is_web_parent=true。 - 把“Web 父进程 + 可疑子命令 + 异常目录/用户”组合成规则条件。
2. 为什么只维护命令黑名单容易误报和漏报?
简洁答案:攻击者能换命令、换解释器、用内置功能绕过;正常运维也会调用同名命令。更稳的是看父子关系、参数、目录、用户和后续行为。
关键知识点:
curl、wget、bash本身都是正常工具,风险来自调用上下文。- RCE 可能表现为
sh -c、python -c、php -r、perl -e、busybox nc。 - 容器或最小化系统里命令路径可能不同,不能只匹配固定绝对路径。
Go 落地思路:
- 命令名是弱信号,父进程和参数模式是强信号。
- 对
-c、管道、重定向、base64、/tmp、/dev/shm、chmod +x这类参数做结构化标记。 - 输出命中原因时写清楚“哪个父进程、哪个参数、哪个目录”触发,而不是只写“命中黑名单”。
func isWebParent(name string) bool {
switch name {
case "nginx", "apache2", "httpd", "php-fpm", "tomcat":
return true
default:
return false
}
}3. Web RCE 常见命令链路是什么样?
简洁答案:常见链路是探测身份和环境、下载 payload、赋权执行、建立外联、清理痕迹或写入持久化。
常见证据:
| 阶段 | 典型命令 | 检测价值 |
|---|---|---|
| 身份探测 | id、whoami、uname -a | 判断 RCE 成功和权限 |
| 下载落地 | curl、wget、python -c | 发现 payload 来源 |
| 赋权执行 | chmod +x、sh /tmp/x | 发现临时目录执行 |
| 网络动作 | 外联 IP、异常端口 | 关联 C2 或横移 |
| 清理痕迹 | rm -f、清空日志 | 提升风险优先级 |
Go 落地思路:
- 用短窗口把同一父进程树下的多个命令串起来。
- 对临时目录执行、下载 URL、目标 IP、文件 hash 保留证据字段。
- 单条低危探测命令可以降级,连续链路应提升置信度。
4. 怎么判断 sh -c 是正常业务调用还是 RCE?
简洁答案:看谁调用、执行什么、从哪里执行、用哪个账号、是否在发布窗口、后续有没有下载执行或外联。sh -c 只是入口,不能单独定性。
关键知识点:
- CI/CD、备份、日志轮转和业务脚本都可能调用 shell。
- Web RCE 常见特征是 Web 用户、Web 工作目录、短命令探测、临时目录和异常外联。
- 攻击者可能把多条命令塞进一行,或者用 base64/管道隐藏意图。
Go 落地思路:
- 解析 argv 时保留原始命令行和归一化 token。
- 对
;、|、&&、反引号、$()、base64 解码命令做轻量标记。 - 白名单要绑定脚本路径、hash、父进程、账号和维护窗口,避免按
sh放行。
5. Web 进程写 /tmp 后执行,为什么值得重点关注?
简洁答案:攻击者常把 payload 写到 /tmp、/var/tmp、/dev/shm 这类可写目录,再赋权执行;正常 Web 进程通常不该在这些目录生成并执行新二进制。
关键知识点:
- 临时目录可写、清理周期短,适合攻击者落地。
/dev/shm在内存文件系统中,常被用于降低磁盘痕迹。- 仅有文件写入不一定恶意,写入后执行和外联更有价值。
Go 落地思路:
- 关联
file.create、file.chmod、process.exec三类事件。 - 记录
file.path、file.sha256、mode、writer.process、exec.process。 - 对 Web 用户执行新生成文件设置更高权重。
6. 如何降低 Web RCE 进程链检测的误报?
简洁答案:用主机角色、发布窗口、脚本 hash、进程树、账号、工作目录和历史基线降噪;不要用一个全局白名单覆盖所有 Web 主机。
关键知识点:
- 发布系统、健康检查、日志切割、备份任务可能触发相似命令。
- 不同技术栈基线差异很大,PHP、Java、Node 的正常子进程形态不同。
- 客户临时排障命令要有过期时间,不能永久白名单。
Go 落地思路:
- 白名单维度绑定
host.role + parent.path + script.hash + uid + time_window。 - 保留降噪原因,告警解释里展示“因什么被降级或抑制”。
- 对新出现的父子进程组合做学习,但上线前用离线 replay 校验。
7. Go Agent 怎么做高吞吐进程事件处理?
简洁答案:采集层尽早过滤明显无关事件,标准化层只做必要解析,规则层用固定窗口和小状态表关联,避免每条事件全量扫描历史。
关键知识点:
- 进程创建事件可能很多,尤其是 CI、批处理和容器节点。
- 命令行解析、hash 计算和规则匹配都可能成为 CPU 热点。
- 事件乱序和丢失会影响链路还原。
Go 落地思路:
- 以
host.id + process.guid作为关联键,缓存短时间进程上下文。 - 对命令行做一次解析,多条规则复用解析结果。
- 窗口状态设置 TTL,过期即清理,避免 Agent 常驻内存增长。
8. 客户说“这是正常发布脚本”,你怎么排查?
简洁答案:先还原进程树和命令行,再核对脚本路径、hash、发布窗口、执行账号和变更记录,最后用同版本规则离线 replay,确认是规则过严还是客户基线缺失。
关键知识点:
- 排查要回到原始事件,不能只看告警标题。
- 发布脚本通常有固定路径、固定账号、固定父进程和稳定 hash。
- 真攻击可能伪装成发布脚本名,所以路径和 hash 比文件名更重要。
Go 落地思路:
- 告警事件保留
rule_id、rule_version、hit_reason、原始事件 ID 和关联窗口。 - 导出脱敏样本用于 replay,避免直接在生产规则上猜改。
- 修复优先放在共享解析、基线或降噪逻辑,不给单台机器硬编码分支。
通俗答案
Web RCE 进程链检测不是“看到 curl 就报警”。可靠做法是看 Web 服务进程有没有拉起不符合基线的命令,命令是否在探测环境、下载落地、赋权执行或外联,再结合账号、目录、发布窗口和历史行为判断风险。
Web 服务进程
-> shell / 解释器 / 下载器
-> 临时目录写入或 chmod
-> 新文件执行
-> 外联、探测、横移或清理
-> 攻击链告警学习要点
| 方向 | 要点 |
|---|---|
| Linux 原理 | 进程父子关系、用户、工作目录、argv、文件权限 |
| Web 攻击 | RCE、命令执行、下载落地、临时目录执行 |
| 检测设计 | 父子进程、参数模式、文件写入、网络关联、基线 |
| Go 实现 | 事件模型、命令行解析、短窗口关联、TTL 状态清理 |
| 误报治理 | 发布窗口、脚本 hash、账号、主机角色、离线 replay |
小练习 / 复盘题
- 设计一个
ProcessExecEvent结构体,字段要能表达父子进程、argv、cwd、uid 和进程唯一 ID。 - 写一条规则:Web 服务进程拉起
sh -c,随后 60 秒内从外部 URL 下载文件并在/tmp执行,列出至少 6 个证据字段。 - 客户发布系统会让
tomcat执行固定脚本,你会怎样设计白名单,避免攻击者只改文件名绕过? - 复盘一条 Web RCE 攻击链:漏洞入口、命令探测、payload 落地、赋权执行、后续外联。请按时间线输出证据。
