bashのshellshockの件で、脆弱性の有無をテストするスクリプトが出回っていましたが、これは非常にわかりにくいと思いました。
端的にいうとUnix的でないこと、ユーザビリティ的にわかりにくいことが問題だと思いました。
オリジナルコードの問題点
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
出力
vulnerable
this is a test
- 出力の1行目と2行目の関係がよくわからない。
- 脆弱性がない場合にも出力が行われる。
- 出力結果を見たときに、「自分が今使っているbashが脆弱である」と一瞬ではわからない。
- これを見たユーザが、次に何をすればよいのか(もしくは、何か行動しなければいけないこと)が伝わらない。
- "this is a test"というメッセージが無意味かつ無駄である。
よりよいテストコード
$ env x='() { :;}; echo this bash is vulnerable' bash -c :
出力
this bash is vulnerable
ポイント
- 脆弱性がある場合のみ出力が行われ、脆弱性がない場合は何も出力されない。(沈黙は金)
- メッセージが"this bash is vulnerable" なので意味が明快である。
- いま脆弱性があることと、bashが問題であることが伝わる。
たった1行のコードだとしても、広く使われるサンプルを提供する場合は、より良いユーザビリティを心がけたいものですね。