
CVE-2021-43229 Guida
Vulnerabilità di elevazione dei privilegi di Windows NTFS
Distinto da:
Patch: 14 dicembre 2021
Secondo @AravGarg3 su Twitter, CVE-2021-43229 sembra essere sfruttabile e correlato a un integer overflow.
Fonte: https://twitter.com/AravGarg3/status/1479447843458863104
| Versioni minori di Windows 10 | Date di rilascio |
|---|---|
| 1387 | 11/22/2021 |
| 1415 | 12/14/2021 |
Usando BinDiff con IDA Pro, il risultato del patch diffing mostra le seguenti modifiche:
Tre candidati emergono:
Secondo il Security Update Guide di Microsoft di dicembre, quattro CVE sono correlati a NTFS:
CVE-2021-43240, sembra essere correlato a NtSetShortNameInfo.
NtfsRenameToPrivateDir, TxfAllocateAndStoreNameForTxLogging e TxfAllocateFullFilePathForChangeNotify hanno tutti e tre lo stesso nuovo controllo di lunghezza, e sembrano essere correlati a CVE-2021-43229, CVE-2021-43230 e CVE-2021-43231, non necessariamente in quest'ordine. Al momento, non è possibile sapere quale corrisponda a quale, Microsoft è un po' avara di queste informazioni.
In tutti e tre i CVE si verifica un integer overflow durante il calcolo della dimensione di allocazione (lunghezza del percorso della directory + lunghezza del nome file), portando a un overflow del buffer basato su pool con i successivi due memmove del percorso della directory e del nome file.
NtfsRenameToPrivateDirIl percorso verso NtfsRenameToPrivateDir è mostrato di seguito:
NtfsCommonSetInformation
|__________________
| |
v v
NtfsSetLinkInfo NtfsSetRenameInfo
|__________________|
|
v
NtfsRemoveSupersededTarget
|
v
NtfsRenameToPrivateDir
Innanzitutto, per chiamare NtfsCommonSetInformation, basta chiamare NtSetInformationFile. Quindi, per passare attraverso NtfsSetLinkInfo e NtfsSetRenameInfo, usare rispettivamente FileLinkInformationEx e FileRenameInformationEx come classe di informazioni file in NtSetInformationFile.
Per raggiungere NtfsRemoveSupersededTarget tramite NtfsSetRenameInfo, è necessario impostare i flag FILE_RENAME_REPLACE_IF_EXISTS e FILE_RENAME_POSIX_SEMANTICS. Rinominare un file con il nome di uno già esistente per accedere a NtfsRemoveSupersededTarget. Per NtfsRenameToPrivateDir, è un po' più complesso, perché il file sostituito deve essere aperto da qualsiasi processo.
Sfortunatamente viene eseguito un controllo di lunghezza prima della chiamata a NtfsRemoveSupersededTarget.
Il metodo con NtfsSetLinkInfo è simile a NtfsSetRenameInfo, solo i nomi dei flag differiscono, i loro significati rimangono gli stessi. Ma così come per NtfsSetRenameInfo, viene eseguito un altro controllo prima della chiamata a NtfsRemoveSupersededTarget.
TxfAllocateAndStoreNameForTxLoggingIl percorso verso TxfAllocateAndStoreNameForTxLogging è mostrato di seguito:
NtfsCommonCreate
|
v
NtfsCreateNewFile
|
v
TxfNewFileCreate
|
v
TxfAllocateAndStoreNameForTxfLogging
Innanzitutto, per chiamare NtfsCommonCreate, basta chiamare CreateFile.
La funzione TxfNewFileCreate è prefissata con Txf che sta per "Transactional NTFS" e viene chiamata quando viene creato un file transazionale. TxfAllocateAndStoreNameForTxfLogging viene chiamata durante il processo per memorizzare il percorso del file transazionale.
Sono necessarie solo due chiamate:
Il codice vulnerabile di TxfAllocateAndStoreNameForTxLogging è mostrato di seguito:
...
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
...
Per attivare l'overflow, è necessario creare un file con una lunghezza eccessiva, superiore a 0xFFFF byte (32767 caratteri).
Un problema che emerge è che un nome di file o directory non può essere maggiore di 256 caratteri - incluso il carattere NULL. Per risolvere questo problema, sarà necessario l'uso di sottocartelle profonde. Stranamente, non è così facile; anche con le sottocartelle create con successo, il file sottostante non può essere creato, certamente a causa di alcuni controlli eseguiti in precedenza.
Usando la barra di explorer è possibile notare il formato usato per mostrare il percorso della directory. Non è quello che mi aspettavo; invece di usare un percorso "classico", explorer usa il vecchio formato DOS, il formato abbreviato 8.3.
Mantenendo la creazione delle sottocartelle come prima e usando il nome breve per le sottodirectory durante la creazione del file, si ottiene il risultato.
È importante notare che 16 byte verranno aggiunti alla dimensione dell'overflow, che è la dimensione della UNICODE_STRING che rappresenterà il percorso finale. Questo perché la memoria richiesta conterrà la UNICODE_STRING seguita dal buffer di questa UNICODE_STRING.
Metodo:
Condizioni attuali:
Un interessante write-up di Synacktiv al SSTIC 2020 potrebbe essere un'idea da approfondire, prendendo di mira VS Heap.
Il CVE-2020-17087, un caso simile di sfruttamento, è stato presentato da PixiePoint Security utilizzando la tecnica menzionata sopra.
| Simi | Conf | Funzione | Informazioni |
|---|
| NOK | 0.98 | 0.99 | NtfsCommonSetInformation$fin$0 | Modifiche ai salti |
| 0.97 | 0.99 | NtSetShortNameInfo | ||
| 0.96 | 0.99 | NtfsUpdateSecurity | ||
| NOK | 0.91 | 0.94 | NtfsRenameToPrivateDir$fin$1 | Modifiche ai salti |
| 0.89 | 0.98 | NtfsInitializeFileInDirectory | ||
| OK | 0.88 | 0.95 | TxfAllocateAndStoreNameForTxLogging | Controllo lunghezza |
| OK | 0.87 | 0.93 | NtfsRenameToPrivateDir | Controllo lunghezza |
| OK | 0.81 | 0.95 | TxfAllocateFullFilePathForChangeNotify | Controllo lunghezza |
| 0.76 | 0.94 | NtfsCommonSetInformation |