Smb è un bug presente su Windows da diverso tempo e può permettere ad hacker e malintenzionati per rubare password o credenziali ai siti o ai servizi remoti presenti sulla rete.
Il nome del bug si riferisce ovviamente all’omonimo protocollo di rete Server Message Block incluso in tutte le versioni di Windows. Attraverso il bug Smb è possibile effettuare attacchi di tipo man-in-the-middle intercettando il traffico cifrato verso un server remoto e reindirizzandolo verso un server SMB di proprietà dell’hacker e forzando Windows a fornire le credenziali di accesso.
Il generico bug Smb si suddivide poi in due sotto-vulnerabilità:
- SMBGhost in cui la falla può essere sfruttata da remoto inviando pacchetti opportunamente creati ad una porta SMB connessa ad Internet
- SMBleed di più recente scoperta. Grazie a lacune nella gestione dei messaggi SMB v3 compressi nei servizi di sistema, un malintenzionato senza autorizzazione potrebbe riuscire a recuperare porzioni di memoria di sistema tramite l’invio di messaggi SMB v3 riuscendo ad ottenere chiavi di cifratura, dati di accesso o configurazioni
SMB: come si verifica il bug
A livello di funzionalità. il bug è simile a quanto succede per SMBGhost per la funzione Srv2DecomporessDara nel driver del server SMB srv2.sys. Ecco qui di seguito la versione semplificata della funzione:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
typedef struct _COMPRESSION_TRANSFORM_HEADER { ULONG ProtocolId; ULONG OriginalCompressedSegmentSize; USHORT CompressionAlgorithm; USHORT Flags; ULONG Offset; } COMPRESSION_TRANSFORM_HEADER, *PCOMPRESSION_TRANSFORM_HEADER; typedef struct _ALLOCATION_HEADER { // ... PVOID UserBuffer; // ... } ALLOCATION_HEADER, *PALLOCATION_HEADER; NTSTATUS Srv2DecompressData(PCOMPRESSION_TRANSFORM_HEADER Header, SIZE_T TotalSize) { PALLOCATION_HEADER Alloc = SrvNetAllocateBuffer( (ULONG)(Header->OriginalCompressedSegmentSize + Header->Offset), NULL ); If (!Alloc) { return STATUS_INSUFFICIENT_RESOURCES; } ULONG FinalCompressedSize = 0; NTSTATUS Status = SmbCompressionDecompress( Header->CompressionAlgorithm, (PUCHAR)Header + sizeof (COMPRESSION_TRANSFORM_HEADER) + Header->Offset, (ULONG)(TotalSize - sizeof (COMPRESSION_TRANSFORM_HEADER) - Header->Offset), (PUCHAR)Alloc->UserBuffer + Header->Offset, Header->OriginalCompressedSegmentSize, &FinalCompressedSize); if (Status < 0 || FinalCompressedSize != Header->OriginalCompressedSegmentSize) { SrvNetFreeBuffer(Alloc); return STATUS_BAD_DATA; } if (Header->Offset > 0) { memcpy( Alloc->UserBuffer, (PUCHAR)Header + sizeof (COMPRESSION_TRANSFORM_HEADER), Header->Offset); } Srv2ReplaceReceiveBuffer(some_session_handle, Alloc); return STATUS_SUCCESS; } |
Quindi che operazioni compie la funzione Srv2DecompressData?
La funzione riceve il messaggio compresso inviato dal client, alloca la quantità necessaria di memoria e decomprime i dati. Se dunque l’offset non è zero prima dei dati compressi vengono copiati i dati posizionati come all’inizio del buffer allocato.
SMBGhost è nato a causa del non controllo di overflow dei numeri interi. Microsoft lo ha risolto ma nonostante questo rimane un bug che crea difficoltà.
OriginalCompressedSegmentSize
Nell’immagine precedente SMBGhost è stato utilizzato impostando il campo OriginalCompressedSegmentSize con un numero grandissimo causando overflow di numeri interi. Cosa succederebbe se lo impostassimo poco più grande dei dati decompressi che inviamo? Per esempio se la dimensione dei nostri dati compressi è y, a seguito della decompressione e impostiamo OriginalCompressedSegmentSize su y + 0x1000 otterremo questo:
Funzionamento del bug
Ora utilizziamo un messaggio SMB per verificare la vulnerabilità. Il messagggio è strutturato con campo come la quantità in byte da scrivere e i flag seguiti da un buffer di lunghezza variabile. Va bene per utilizzare il bug dato che possiamo creare un messaggio in modo da specificare l’intestazione ma comunque il buffer a lunghezza variabile contiene dati non inizializzati.
1
2
3
4
5
6
|
// HACK: fake size if (((Smb2SinglePacket)packet).Header.Command == Smb2Command.WRITE) { ((Smb2WriteRequestPacket)packet).PayLoad.Length += 0x1000; compressedPacket.Header.OriginalCompressedSegmentSize += 0x1000; } |
Il bug si applica a tutti i messaggi e può essere sfruttato senza autenticazione. Inoltre la memoria trapelata proviene da allocazioni precedenti nel pool NonPagedPoolNx e dato che controlliamo la dimensione di allocazione, potremo essere in grado di controllare i dati trapelati in una certa misura.
Versioni di Windows interessate
Ecco quali sono le versioni di Windows vulnerabili
Windows 10 versione 2004
Aggiornamento | SMBGhost | SMBleed |
KB4557957 | Non vulnerabile | Non vulnerabile |
Prima di KB4557957 | Non vulnerabile | Vulnerabile |
Versione di Windows 10 1909
Aggiornamento | SMBGhost | SMBleed |
KB4560960 | Non vulnerabile | Non vulnerabile |
KB4551762 | Non vulnerabile | Vulnerabile |
Prima di KB4551762 | Vulnerabile | Vulnerabile |
Versione di Windows 10 1903
Aggiornamento | SMBGhost | SMBleed |
KB4560960 | Non vulnerabile | Non vulnerabile |
KB4551762 | Non vulnerabile | Vulnerabile |
KB4512941 | Vulnerabile | Vulnerabile |
SMB: possibili soluzioni
Per risolvere i bug SMBleed e SMBGhost consigliamo di eseguire le seguenti operazioni:
- Aggiornare Windows dovrebbe risolvere completamente il problema
- Il blocco della porta 445 interromperà i movimenti laterali utilizzando queste vulnerabilità
- Applicazione dell’isolamento dell’host
- Disabilitazione della compressione SMB 3.1.1 (non è una soluzione consigliata)
SMB fa parte di alcuni bug di Windows per la quale spesso si consiglia di rivolgersi ad esperti informatici per risolvere il problema. Nexsys offre un servizio di assistenza sistemistica, ancheda remoto, che potrà aiutare voi e la vostra azienda quando vi troverete di fronte a vulnerabilità informatiche che mettono a repentaglio la sicurezza informatica dei vostri sistemi. Il nostro servizio di sicurezza informatica vi permetterà di scovare vulnerabilità e tornare operativi al 100%.