てきとうなメモ

本の感想とか技術メモとか

bashのFlorian's patchとアップデート時の再起動

Shellshock関係でbashをアップデートした後にbashを利用しているプロセスを再起動するかどうかという話。

RHELの文書はちょっと混乱していて最初は再起動すべきと書いてあったが、いらないんじゃないとコメントで指摘され削除されたように思う。しかし、現在はshell関数のexportを利用しているサービスは再起動することを推奨している。

Do I need to reboot or restart services after installing the update for CVE-2014-6271 and CVE-2014-7169?

If your system uses exported Bash functions, restarting affected services is recommended. Affected interactive users may have to re-login, and screen or tmux sessions may need to be restarted.

脆弱性そのものは、bash起動時に環境変数の値をbashの変数や関数にバインドしていく部分で発生するため、既に起動中のbashは該当しないし、新たに起動するbashはアップデート後のbashになるので、攻撃はされない。

しかし、RHELの最新版のbashではFlorian Weimerによるパッチがあたっている。このパッチはshell関数のexportに関する仕様変更を行っている。そのため、shell関数のexportを想定しているサービスは動かなくなる可能性がある。

shell関数のexportを利用しているプロセスのプロセスIDはリンク先にあるように以下のコマンドで確認できる

$ grep -l -z '[^)]=() {' /proc/[1-9]*/environ | cut -d/ -f3

これに該当すれば該当するプロセスIDを利用しているサービスを再起動すれば良い。ただ、shell関数のexportを想定しているサービスはまずなさそうな気がする

で、このFlorianによるパッチの内容だが、shell関数をそのままexportすることができなくなっている。

環境変数bashにimportする場合、環境変数名にprefix/suffixが付いている場合のみshell関数と認識され、prefix/suffixを除外してimportされる。Ubuntuの場合はprefixはBASH_FUNC_、suffixは()になっている。

$ env 'x=() { echo "this is an imported function"; }' bash -c x
bash: x: コマンドが見つかりません
$ env 'BASH_FUNC_x()=() { echo "this is an imported function"; }' bash -c x
this is an imported function

bash環境変数にexportする時は環境変数名にprefix/suffixが付く。

$ bash -c 'x() { echo "this is an exported value"; }; export -f x; sh -c printenv'
...
BASH_FUNC_x()=() {  echo "this is an exported value"
}

環境変数名まで外部から指定することができれば攻撃は可能なのだが、通常環境変数まで操作可能にするようにコードを書いているとは考えづらい。ので、このパッチで十分な気がしている。