host1:~$env x='(){ :;}; echo vulnerable' bash -c "echo hello"
hello
host1:~$env x='() { :;}; echo vulnerable' bash -c "echo hello"
vulnerable
hello
host1:~$
怪啊?
解决方法:
Bash将环境变量识别为函数,如果它恰好以四个字符(){,包括空格开头.所以env x ='(){:;};回声脆弱’不计算在内.
这与用于在bash中定义函数的语法不完全一致;在内部,bash将以规范化的形式存储函数的字符串表示.如果导出函数(使用export -f function_name),则将规范化表单添加到环境中,子bash进程将其识别为函数定义.
“shellshock”错误来自bash处理已识别函数的方式; bash的错误版本(可以追溯到很长一段路)简单地将环境中的字符串作为函数定义进行评估(通过将变量的名称添加为函数名称),这将受到注入攻击,如漏洞中所示测试.
手动创建看起来像bash函数定义的字符串以便在子bash过程中定义函数是一种已知技术.导出功能并重新导入它们非常常见,用户通常甚至都注意不到. (例如,这种技术用于将bash函数传递给由xargs bash -c启动的子shell,并找到… -exec bash -c.)
标签:bash,security,linux,shellshock-bash-bug
来源: https://codeday.me/bug/20190713/1454016.html