CVE-2014-7169用の更新されたShellshock脆弱性テストはどのように機能しますか?


11

CVE-2014-6271の元のテストを理解しました。

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

しかし、CVE-2014-7169の更新されたテストと対応する出力に混乱しています。

$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

ここで何が起こっているのか、CVE-2014-6271のパッチをどのようにバイパスするのかを簡単に説明できますか?


回答:


13

この質問を最初に投稿してから、少しの間、ウェブを掘り下げてきました。

バグの最初の発見者によると、CVE-2014-6271パッチの前のbashは次のような関数をインポートしました。

foo=() {
  code
}

等号をスペースに置き換えて解釈することにより、関数定義を超えて解釈することが可能になりました。

CVE-2014-6271 のパッチでは、関数定義に評価を制限するためのparse_and_execute()関数の特別なモードが導入されました

ただし、このスレッドで説明されているように、CVE-2014-7169脆弱性テストの特別に細工された環境変数は、1)パーサーを混乱させる2)スクラップをバッファに残す3)元のbashコマンドの動作を完全に変更するように設計されていますすでにバッファ内にあるスクラップと結合します。

そのため、環境変数を分析するには:

X='() { (a)=>\'

  • パーサーが分析し() { (a)=>\ます。\は文字列の一部であることに注意してください。それがされていない末尾の単一引用符をエスケープ。

() {

  • パーサーはこれを関数定義として識別します。

(a)=

  • これにより、パーサーが混乱してしまいます。

>\

  • パーサーは最後の2文字をバッファーに残します。

>\[NEWLINE]

  • shコマンドが実行される前のある時点で、バッファーに改行が配置されます。

>\[NEWLINE]echo date

  • ときはsh(おそらくこのケースではbashへのシンボリックリンクである)と呼ばれ、それは、そのコマンドの引数を追加してecho date、既にバッファ内の既存の文字に、。

>echo date

  • 改行がエスケープされるため、bashはとしてバッファーを解析>echo datedate > echoます。これはと同じ効果があります。という名前のファイルechoが作成され、dateコマンドの標準出力がそこにリダイレクトされます。

; cat echo

  • 2番目のコマンドは、新しく作成されたファイルの内容を表示するだけです。


2

きれいな出力は得られませんが、バグを示しています。

バグがXなければ、環境変数は無視され、bashは実行され、echo datecatはechoと呼ばれるファイルがないと文句を言うはずです。たとえば、ダッシュの動作を検討します。

me@myserver$ rm -f echo && env -i  X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory

質問で示した出力を繰り返しません。また、その仕組みを理解するふりはしませんが、bashが実行dateされ、出力を「echo」というファイルに入れています。dateこれが有用で危険であると自分自身に確信させるために、代替手段で遊ぶことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.