shellshock と sudo
CVE-2014-6271を発端とする bash の脆弱性、いわゆる ShellShock って呼ばれている奴。環境変数に仕込んだ任意のコマンドを実行できてしまうってことから、CGI との組み合わせが取り沙汰されている。
その頃 sudo の設定の勉強をしていたので、ふと気になったのが、sudoの設定で環境変数を持ち越して使用することができる env_keep の設定。sudo で root としてbashを実行させれば、任意のコマンドを特権昇格して実行できちゃうんじゃ? というもの。
早速試してみた。
普通に実行したもの
$ export ORACLE_SID='() { :;}; echo Vulnerability !!!'
$ cat /usr/local/bin/testcmd
#!/bin/bash -x
id
printenv ORACLE_SID
$ /usr/local/bin/testcmd
echo Vulnerability '!!!'
Vulnerability !!!
+ id
uid=2001(testid) gid=100(users) 所属グループ=100(users),102(gsudo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
+ printenv ORACLE_SID
() { :
}
$環境変数に ORACLE_SID を使用しているが、別に Oracle に恨みがあるわけではない。
まぁ、普通にコマンド実行がされている。
sudo経由で実行
攻撃コードを入れた場合
$ export ORACLE_SID=<span style="color: magenta">'() { :;}; echo Vulnerability !!!'</span>
$ sudo /usr/local/bin/testcmd
+ id
uid=0(root) gid=0(root) 所属グループ=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
+ printenv ORACLE_SID
$値が何も出力されないので、やり方間違えたかな?と何度試しても同じだった。今度は普通の値を入れてみたところ、普通に出力される結果となった。
$ export ORACLE_SID=TESTDB $ sudo /usr/local/bin/testcmd + id uid=0(root) gid=0(root) 所属グループ=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 + printenv ORACLE_SID TESTDB $
どうやら、sudo経由だと攻撃コードが入っていると環境変数として設置されないようにサニタイズをしている様子。
2004年にはCVE-2004-1051として報告&修正されている。
特権昇格が問題だったというのもあると思うけど、bashの問題をsudoが肩代わりして修正してしまい、bash側は放置、という印象を受ける。今の問題で言えば、Apache 等のWebサーバ側で環境変数をサニタイズするみたいな。
何だかモヤっとする後味だったけれど、とりあえず、sudo の方は影響を受けないよってことで。