web-dev-qa-db-ja.com

Shellshockは包括的なローカル権限昇格ベクトルを生成しますか?

setuidスクリプトが、LD_LIBRARY_PATHのようないくつかのブラックリストに記載されたものを除いて、呼び出し元からの任意の環境変数を取る場合、これは#!/bin/bashを直接または間接的に実行するsetuidスクリプトが特権のローカル昇格のベクトルであることを意味しませんか?

これがなぜそうであるか、そうでないのかを説明するのが良いでしょう。

たとえば、多くの(ほとんど?)unixalikeは現在、シェルスクリプトでsetuidを尊重していません(ただし、このバグ/バックドアが導入されたときはそうでした)。しかし、バイナリはシェルスクリプトを間接的に呼び出す可能性があるため、最初に明示的に環境をクリアしない限り、これはまだ問題ではありませんか?

10
Ben

はい!

setuidビットを含み、(直接的または間接的に)bashからexecvepopenまたはsystemを呼び出すバイナリは、使用できるツールですシェルショックバグをアクティブにします。

これらのコマンドがbash(またはシェルスクリプト)を実行する前に*envをクリアしない場合、これらのバイナリを使用して任意のコマンドを実行できます(例:bashrootの権限で。

popenおよびsystemは、プログラマが*envをクリーンアップする可能性を与えません。

推定このリスクに対する簡単な監査の最初のドラフトは次のとおりです。

find /  -perm +4000 \
    -exec /bin/zsh -c "ls -dluT {} ; nm -a {} | egrep '(popen|system|execve)' && strings {} | egrep '/bin/(sh|bash)'" \; 2>/dev/null

シェルのフォークの前に*envがクリーンアップされている可能性があるため、これはproofのリスクではありません。確実にする唯一の方法は、ソースコードを読むことです。

そして、これは、頻繁に使用されるUnixの実際のバージョンでの結果です。

-rwsr-xr-x  1 root  wheel  910848 Sep 29 16:31:18 2014 /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/MacOS/ARDAgent
             U _popen
/bin/bash

(ここで最後に使用したのは、攻撃の証拠ではなく、私自身の以前の「ドラフト監査」の証拠です。)

7
dan

bashがsetuid(またはsetgid)コンテキストで呼び出された場合、つまり有効なuidが実際のuidと異なる場合、bashは特権を削除します(有効なuidを実際のuidに戻します) )。

その例外は、_-p_または_-o privileged_(SHELLOPTS変数は無視されるため、privilegedもそこに含まれる)を使用する場合、またはsh

その場合でも、関数は環境からインポートされません(同じ明らかな理由により、_BASH_ENV_、_BASH_OPTS_、SHELLOPTSなども同様です)。

もしそうなら、それを利用するのにShellshockの脆弱性は必要ないでしょう。 echo関数(または_/bin/mount_のようなパスを含むスクリプトによって呼び出されるもの)をエクスポートするだけで十分です。

一部のsetuidコマンドは、ruidをeuidに設定することを選択する場合があります。環境をサニタイズせずにbash(または他のシェル)を呼び出す場合、ゲームオーバー、Shellshockの脆弱性かどうか。

Libcの動的リンカーは、libcまたはリンカーに影響を与えるいくつかの変数(LD_PRELOAD、LOCPATH、LD_LIBRARY_PATH ...)を削除しますが、シェル(またはpython、Pythonなどの他のコマンドを呼び出した場合、残りをクリアするのはsetuidアプリケーション次第です。または環境変数で動作を制御できるその他のコマンド)、一般的な正気なアプローチは、サニタイズされたホワイトリスト以外のすべてをクリアすることです。

このようなアプリケーションの典型的な例は、Sudoです。

デフォルトでは(_env_reset_オプションがオンの場合)、Sudoは環境をクリアし、いくつかを設定します(PATHHOME、_Sudo_USER_など)。 。)およびTERMDISPLAYなどの内容を確認した後、ホワイトリストにいくつか登録します。そのチェックの一部は、コンテンツが_()_で始まる変数を特別に処理します。

_env_reset_がオフ(ユーザー/管理者によって無効にされている)の場合でも、Sudoはさまざまなシェルや他の一般的なツール(_PS4_、_BASH_ENV_など)に影響するいくつかの変数をブラックリストに載せます...)およびコンテンツが_()_で始まるもの。

したがって、Shellshockは次の方法で悪用することはできません。

_DISPLAY='() {(:);}; ouch;}' Sudo trusted-bash-script
_

Ruidを設定し、_()_で始まる変数をチェックせず、bashを(おそらく間接的に)呼び出さないsetuidコマンドが存在する可能性がありますが、ここでもShellshockバグは必要ありませんそれらを悪用する。

これに対する可能な例外は、Apacheのsuexecです。私の知る限り、suexecは環境をサニタイズしますが、コンテンツではなく、名前に基づいて一部の変数のみをホワイトリストに登録します。 CVE-2014-6271がなければ、QUERYSTRING、_HTTP_USER_AGENT_などの変数名はコマンドの名前と一致しない可能性が高いため、これは問題にはなりません。コンテンツが"() {"で始まる変数をブロックしますが、実際には、CVE-2014-6271に公開されていることを意味します。

2