
CVE-2021-43229 ウォークスルー
Windows NTFS の特権昇格の脆弱性
以下とは異なる:
パッチ: 2021年12月14日
Twitter の @AravGarg3 によると、CVE-2021-43229 は悪用可能であり、整数オーバーフロー に関連しているようです。
ソース: https://twitter.com/AravGarg3/status/1479447843458863104
| Windows 10 のマイナーバージョン | リリース日 |
|---|---|
| 1387 | 11/22/2021 |
| 1415 | 12/14/2021 |
BinDiff と IDA Pro を使用したパッチ差分解析の結果、以下の変更が見られました:
3つの候補が浮上します:
12月の Microsoft の セキュリティ更新ガイド によると、4つの CVE が NTFS に関連しています:
CVE-2021-43240 は NtSetShortNameInfo に関連しているようです。
NtfsRenameToPrivateDir、TxfAllocateAndStoreNameForTxLogging、TxAllocateFullFilePathForChangeNotify の3つはすべて同じ新しい長さチェックを持ち、CVE-2021-43229、CVE-2021-43230、CVE-2021-43231 に関連していると思われます(必ずしもこの順序ではありません)。現時点では、どれがどれかを知ることはできません。Microsoft はこれらの情報について少しケチです。
3つの CVE すべてにおいて、割り当てサイズの計算(ディレクトリパス長 + ファイル名長)中に整数オーバーフローが発生し、その後の2回の memmove(ディレクトリパスとファイル名)によりプールベースのバッファオーバーフローが発生します。
NtfsRenameToPrivateDirNtfsRenameToPrivateDir へのパスを以下に示します:
NtfsCommonSetInformation
|__________________
| |
v v
NtfsSetLinkInfo NtfsSetRenameInfo
|__________________|
|
v
NtfsRemoveSupersededTarget
|
v
NtfsRenameToPrivateDir
まず、NtfsCommonSetInformation を呼び出すには、NtSetInformationFile を呼び出します。次に、NtfsSetLinkInfo と NtfsSetRenameInfo を経由するには、NtSetInformationFile のファイル情報クラスとしてそれぞれ FileLinkInformationEx と FileRenameInformationEx を使用します。
NtfsSetRenameInfo を経由して NtfsRemoveSupersededTarget に到達するには、FILE_RENAME_REPLACE_IF_EXISTS フラグと FILE_RENAME_POSIX_SEMANTICS フラグを設定する必要があります。既存のファイルの名前でファイルを名前変更して、NtfsRemoveSupersededTarget にアクセスします。NtfsRenameToPrivateDir については、置き換えられるファイルが何らかのプロセスによって開かれている必要があるため、少しトリッキーです。
残念ながら、NtfsRemoveSupersededTarget の呼び出しの前に長さチェックが行われます。
NtfsSetLinkInfo を使用する方法は NtfsSetRenameInfo と似ており、フラグの名前が異なるだけで、意味は同じです。しかし、NtfsSetRenameInfo と同様に、NtfsRemoveSupersededTarget の呼び出し前に別のチェックが行われます。
TxfAllocateAndStoreNameForTxLoggingTxfAllocateAndStoreNameForTxLogging へのパスを以下に示します:
NtfsCommonCreate
|
v
NtfsCreateNewFile
|
v
TxfNewFileCreate
|
v
TxfAllocateAndStoreNameForTxfLogging
まず、NtfsCommonCreate を呼び出すには、CreateFile を呼び出します。
TxfNewFileCreate 関数は、Txf というプレフィックスが付いており、これは「Transactional NTFS」を意味し、トランザクションファイルが作成されるときに呼び出されます。TxfAllocateAndStoreNameForTxfLogging は、トランザクションファイルのパスを保存するためにプロセス中に呼び出されます。
必要な呼び出しは2つだけです:
TxfAllocateAndStoreNameForTxLogging の脆弱なコードを以下に示します:
...
and di, 2
add di, [rsi+UNICODE_STRING.Length] ; File name
add di, [rsp+68h+RelativeNormalizedDirectoryPath.Length] ; OVERFLOW HERE
cmp [rsp+68h+arg_20], r12b
jnz loc_16592C
movzx edx, di
add rdx, size UNICODE_STRING ; NumberOfBytes
mov ecx, cs:PoolType
or ecx, 10h ; PoolType
mov r8d, 'afxT' ; Tag
call cs:__imp_ExAllocatePooliWthTag
...
オーバーフローを引き起こすには、過度に長いファイル(0xFFFF バイト(32767 文字)以上)を作成する必要があります。
問題として、ファイル名またはディレクトリ名は256文字(NULL文字を含む)を超えることはできません。これを解決するには、深いサブフォルダを使用する必要があります。奇妙なことに、サブフォルダが正常に作成されても、サブファイルを作成できないのは、おそらく以前に行われたチェックが原因です。
エクスプローラ のバーを使用すると、ディレクトリパスを表示するために使用される形式に気付くことができます。私が予想したものとは異なり、「クラシック」なパスを使用する代わりに、エクスプローラ は DOS の昔ながらの形式である 8.3 ショート形式を使用します。
サブフォルダの作成は以前と同じように行い、ファイル作成時にサブディレクトリにショート名を使用することでうまくいきます。
重要なのは、オーバーフローしたサイズに 16 バイトが追加されることです。これは、最終的なパスを表す UNICODE_STRING のサイズです。要求されたメモリには、UNICODE_STRING とその UNICODE_STRING のバッファが続いて含まれるためです。
方法:
現在の条件:
SSTIC 2020 における Synacktiv による興味深い解説は、VS Heap をターゲットにすることで掘り下げるアイデアになるかもしれません。
CVE-2020-17087 の同様の悪用事例は、PixiePoint Security によって上記の手法を用いて発表されています。
| Simi | Conf | 関数 | 情報 |
|---|
| NOK | 0.98 | 0.99 | NtfsCommonSetInformation$fin$0 | ジャンプ変更 |
| 0.97 | 0.99 | NtSetShortNameInfo | ||
| 0.96 | 0.99 | NtfsUpdateSecurity | ||
| NOK | 0.91 | 0.94 | NtfsRenameToPrivateDir$fin$1 | ジャンプ変更 |
| 0.89 | 0.98 | NtfsInitializeFileInDirectory | ||
| OK | 0.88 | 0.95 | TxfAllocateAndStoreNameForTxLogging | 長さチェック |
| OK | 0.87 | 0.93 | NtfsRenameToPrivateDir | 長さチェック |
| OK | 0.81 | 0.95 | TxfAllocateFullFilePathForChangeNotify | 長さチェック |
| 0.76 | 0.94 | NtfsCommonSetInformation |