远程代码执行如何拦截

wen 网络安全 28

本文目录导读:

远程代码执行如何拦截

  1. 输入层拦截(最重要)
  2. 执行层拦截
  3. 系统层拦截
  4. Web框架层防护
  5. 运行时防护工具
  6. 检测与响应
  7. 最佳实践清单
  8. 建议实施步骤

远程代码执行(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. 立即执行:代码审计,禁用所有不必要的外部命令执行
  2. 短期(1周):部署WAF规则,启用seccomp限制
  3. 中期(1月):重构为沙箱架构,运行在Docker中
  4. 长期(3月):实施零信任架构,所有命令执行需审批

没有100%绝对安全的防护,但纵深防御可以让攻击者需要突破10层才能成功,这在实践中几乎不可能。

抱歉,评论功能暂时关闭!