我很难理解Shellshock漏洞验证

Mar*_*cel 3 linux security bash shellshock-bash-bug

我在检查Shellshock漏洞时得到了这个:

host1:~$ env x='(){ :;}; echo vulnerable' bash -c "echo hello"
hello
host1:~$ env x='() { :;}; echo vulnerable' bash -c "echo hello"
vulnerable
hello
host1:~$
Run Code Online (Sandbox Code Playgroud)

怪啊?

ric*_*ici 12

Bash将环境变量识别为函数,如果它恰好以四个字符() {(包括空格)开头.所以env x='(){ :;}; echo vulnerable'不算数.

这与用于定义函数的语法不完全一致bash; 在内部,bash将以规范化的形式存储函数的字符串表示.如果导出函数(with export -f function_name),则将规范化表单添加到环境中,子bash进程将其识别为函数定义.

"shellshock"错误来自bash处理识别功能的方式; bash(有很长的路要走)的错误版本只是简单地将环境中的字符串作为函数定义进行评估(通过将变量的名称作为函数名称添加),这将受到注入攻击,如漏洞测试中所示.

手动创建看起来像bash函数定义的字符串以便在子bash进程中定义函数是一种已知技术.导出功能并重新导入它们非常常见,用户通常甚至都注意不到.(例如,这种技术用于将bash函数传递给由xargs bash -cand 开始的子shell find ... -exec bash -c.)