`env X='() { (a)=>\' sh -c "echo date"` どのように動作しますか?

`env X='() { (a)=>\' sh -c "echo date"` どのように動作しますか?

最新のbashエクスプロイトについて読んだ後、Tavis Ormandyのエクスプロイトがどのように機能するのか疑問に思いました。どのように(a)=>\動作しますか?

彼は次のように掲示した。

私にとっては、bashパッチが不完全であるように見え、関数の解析は依然として脆弱です。例えば

$ env X='() { (a)=>\' sh -c "echo date"; cat echo

答え1

GNU Bashのエクスポートシェル機能関数定義を含む環境変数から:

$ function foo { echo bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() { echo bar
}

新しい Bash インスタンスが作成されると、特定のパターンに一致する環境変数を探します。この変数の内容は次のとおりです。自動的にシェル関数にインポートされました。 〜のようにスティーブンチェイザーズが説明する=、この機能はBash 1.03で導入されているため、その項目を置き換えるだけで関数のインポートを完了できます。環境変数の配列、結果を関数定義として解釈します。前に斑点その固定一つCVE-2014-6271、環境変数は、実際の関数本体に従うすべてのコマンドを含む完全に解釈されます。パッチはこのparse_and_execute()機能に2つの特殊モードを導入しましたSEVAL_FUNCDEFSEVAL_ONECMDこの関数を呼び出すときに、SEVAL_FUNCDEF関数で定義したコマンド以外のコマンドを解釈してはいけません。このSEVAL_ONECMDフラグは、関数が複数のコマンドを評価するのを防ぐ必要があります。

Tavis Ormandyのカスタム環境変数は、微妙に異なる操作を行います。これは、パーサーを混乱させ、評価するコマンドを格納するために使用されるバッファーを破壊するように設計されています。バッファの残りの環境変数以降のコマンドの解釈の変更。この問題はCVE識別子を受け取りました。CVE-2014-7169

環境変数定義のコンポーネントはX='() { (a)=>\'次のとおりです。

  • () {パーサはこれを関数定義の始まりとして解釈します。

  • (a)=パーサーを混乱させ、バッファーに環境変数の残余を残すように設計されています。

  • >\バッファに残っている実際のペイロードです。

ペイロードの目的は、呼び出しサブシェルで実行されるコマンドの解釈を変更することですsh -c "echo date";。もちろん、これはこれがシンボリックリンクである/bin/shと仮定しますbash。オペランドで指定されたコマンド文字列が-cバッファに配置されると、バッファの内容は次のようになります。

>\[0xA]echo date

[0xA]通常、コマンド区切り文字として使用されるASCII改行文字ですが、\ペイロードからエスケープされます。その結果、バッファの内容は次のように解釈されます。

>echo date

なぜならBashでは、リダイレクト演算子がコマンドの前に来ることができます。、これは次のとおりです。

date > echo 

これにより、date標準出力が名前付きファイルにリダイレクトされたときにコマンドが実行されるようになりますecho。残りはcat echo攻撃の一部ではなく、出力echoを含む名前のファイルがあることを示していますdate

この場合、文字列がパーサーを混同する理由は、(a)=(誤った)ネストされた関数定義として表示されることに関連しているようです。これこのエクスプロイトの単純化されたバリエーションこれをより明確に証明すると、次のようになります。

$ X='() { function a a>\' bash -c echo
$ ls echo
echo

関連情報