本文目录导读:

远程代码执行(RCE)是最高危的漏洞之一,攻击者利用它可以在服务器上执行任意命令,拦截RCE需要从输入层、执行层、系统层三个维度构建纵深防御体系,以下是具体拦截方案:
输入层拦截(最重要)
严格输入验证
# 错误示范:直接拼接用户输入
os.system("ping " + user_input)
# 正确做法:白名单验证
allowed_ips = ["192.168.1.1", "10.0.0.1"]
if user_input in allowed_ips:
os.system(f"ping {user_input}")
else:
reject_request()
参数化查询与转义
// 错误:直接拼接到命令
Runtime.getRuntime().exec("cmd /c " + input);
// 正确:使用ProcessBuilder避免Shell注入
ProcessBuilder pb = new ProcessBuilder("ping", input);
pb.start();
禁用危险函数
PHP示例:
; php.ini 配置 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Python Web框架:
# Flask中禁用os.system等
allowed_commands = ["ls", "pwd"]
if cmd not in allowed_commands:
abort(403)
执行层拦截
沙箱/容器隔离
# Docker限制
docker run --read-only \
--cap-drop=ALL \
--cap-add=NET_RAW \
--security-opt=no-new-privileges \
your_app
seccomp过滤器
// 使用seccomp限制系统调用
struct sock_filter filter[] = {
/* 只允许read, write, exit等基本调用 */
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)),
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_execve, 0, 1),
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), // 拒绝execve
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
};
低权限运行
# 创建专用用户 useradd -r -s /bin/false app_user # 限制权限 chown -R app_user:app_user /app chmod -R 750 /app
系统层拦截
WAF与IDS检测
ModSecurity规则示例:
# 检测命令执行特征
SecRule ARGS "@rx (system|exec|shell_exec|passthru|popen|proc_open)" \
"id:1001,deny,status:403,msg:'RCE attempt detected'"
# 检测编码绕过
SecRule ARGS "@rx (base64_decode|eval\(|assert\()" \
"id:1002,deny"
文件系统监控
# auditd监控敏感文件变更 auditctl -w /tmp -p wa -k rce_attempt auditctl -w /etc/passwd -p wa -k unauthorized_change
内核防护
# 启用ASLR echo 2 > /proc/sys/kernel/randomize_va_space # 启用NX保护 sysctl -w vm.mmap_min_addr=65536
Web框架层防护
模板引擎安全
// Thymeleaf避免直接拼接
// 错误:Thymeleaf模板中直接使用${param}
// 正确:使用th:utext转义
th:utext="${#strings.escapeXml(param)}"
序列化过滤
// Java反序列化黑名单
ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(
"!java.lang.Runtime;!java.lang.ProcessBuilder;"
);
ObjectInputStream ois = new ObjectInputStream(in);
ois.setObjectInputFilter(filter);
运行时防护工具
OpenRASP
{
"hook_def": {
"RCE": {
"command": ["exec", "system"],
"action": "block",
"stack_white_list": ["com.your.package."]
}
}
}
应用网关
# Nginx WAF规则
location / {
# 拦截危险字符
if ($args ~* "(\|.*&&|;.*bash|`.*`|\$\(") {
return 403;
}
# 限制请求大小
client_max_body_size 10k;
}
检测与响应
日志监控
# ELK检测规则
detection_rules:
- name: Process Spawned From Web
query: >
process.parent_name:("apache2" OR "nginx") AND
process.name:("bash" OR "python" OR "perl")
severity: high
实时告警
# 使用falco检测容器逃逸 - rule: Terminal shell in container desc: A shell was spawned in a container condition: spawned_process and container and shell_procs output: Shell spawned in container (user=%user.name) priority: WARNING
最佳实践清单
| 层次 | 措施 | 优先级 |
|---|---|---|
| 输入 | 白名单验证 | |
| 执行 | 参数化命令 | |
| 系统 | 最小权限原则 | |
| 框架 | 禁用危险函数 | |
| 网络 | WAF防护 | |
| 监控 | 异常行为检测 |
建议实施步骤
- 立即执行:代码审计,禁用所有不必要的外部命令执行
- 短期(1周):部署WAF规则,启用seccomp限制
- 中期(1月):重构为沙箱架构,运行在Docker中
- 长期(3月):实施零信任架构,所有命令执行需审批
没有100%绝对安全的防护,但纵深防御可以让攻击者需要突破10层才能成功,这在实践中几乎不可能。