bashには明らかに脆弱性(CVE-2014-6271)があります:Bashの特別に細工された環境変数コードインジェクション攻撃
何が起こっているのかを理解しようとしていますが、完全には理解できていません。 echo
はどのようにできますか 一重引用符でそのまま実行されますか?
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
編集1 :パッチが適用されたシステムは次のようになります:
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
編集2 :関連する脆弱性/パッチがあります:わずかに異なるテストを使用するCVE-2014-7169:
$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
パッチが適用されていない出力 :
vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test
部分的に(初期バージョン)パッチが適用された出力 :
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test
パッチされた出力 CVE-2014-7169まで:
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test
編集3 :ストーリーは続きます:
- CVE-2014-7186
- CVE-2014-7187
- CVE-2014-6277
承認された回答:
bashは、エクスポートされた関数定義を環境変数として格納します。エクスポートされた関数は次のようになります:
$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() { bar
}
つまり、環境変数foo
文字通りの内容があります:
() { bar
}
bashの新しいインスタンスが起動すると、これらの特別に細工された環境変数を探し、それらを関数定義として解釈します。自分で作成して、それがまだ機能することを確認することもできます:
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
残念ながら、文字列(環境変数)からの関数定義の解析は、意図したよりも幅広い影響を与える可能性があります。パッチが適用されていないバージョンでは、関数定義の終了後に発生する任意のコマンドも解釈します。これは、環境内で受け入れ可能な関数のような文字列を決定する際の制約が不十分なためです。例:
$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function
関数定義外のエコーがbashの起動中に予期せず実行されたことに注意してください。関数定義は、評価と悪用を実行するための単なるステップであり、関数定義自体と使用される環境変数は任意です。シェルは環境変数を調べ、foo
を確認します 、関数定義がどのように見えるかについて知っている制約を満たしているように見え、意図せずにエコーも実行して行を評価します(悪意のあるコマンドかどうかに関係なく)。
通常、変数自体が、変数に含まれる任意のコードの呼び出しを直接引き起こすことは許可または期待されていないため、これは安全ではないと見なされます。おそらく、プログラムは信頼できないユーザー入力から環境変数を設定します。コードで宣言されているような理由で、ユーザーがその環境変数を使用して明示的な意図なしに任意のコマンドを実行できるように、これらの環境変数を操作できることは非常に予想外です。
これが実行可能な攻撃の例です。脆弱なシェルをその存続期間の一部としてどこかで実行するWebサーバーを実行します。このWebサーバーは環境変数をbashスクリプトに渡します。たとえば、CGIを使用している場合、HTTP要求に関する情報がWebサーバーからの環境変数として含まれることがよくあります。例:HTTP_USER_AGENT
ユーザーエージェントのコンテンツに設定されている可能性があります。これは、ユーザーエージェントを「(){:;」のようなものになりすます場合を意味します。 }; echo foo’、そのシェルスクリプトが実行されると、echo foo
実行されます。繰り返しますが、echo foo
悪意があるかどうかにかかわらず、何でもかまいません。