
PoC pour déclencher un débordement de tampon via CVE-2020-0796
./CVE-2020-0796.py servername
Ce script se connecte à l'hôte cible et compresse la requête d'authentification avec un champ d'offset invalide défini dans l'en-tête de transformation, ce qui provoque un dépassement de tampon dans le décompresseur et fait planter la cible.
Ceci contient une modification de l'excellent smbprotocol avec un support ajouté pour la compression/décompression SMB 3.1.1 (uniquement LZNT1). La plupart des ajouts se trouvent dans smbprotocol/connection.py. Une version de lznt1 est incluse, modifiée pour prendre en charge Python 3.
L'en-tête de transformation de compression se trouve dans la classe SMB2CompressionTransformHeader. La fonction _compress est appelée pour compresser les requêtes d'arborescence. C'est là que le champ d'offset est défini tout en haut pour déclencher le crash.
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 est un bug dans la nouvelle capacité de compression SMB3 de Windows 10 1903/1909. La version 3.1.1 du protocole SMB introduit la possibilité pour un client ou un serveur d'annoncer des capacités de compression et de compresser sélectivement les messages SMB3 lorsque cela est utile. Pour y parvenir, lors de la négociation d'une session SMB, le client et le serveur doivent tous deux inclure un SMB2_COMPRESSION_CAPABILITIES comme documenté dans MS-SMB2 2.2.3.1.3.
Une fois qu'une session est négociée avec cette capacité, le client ou le serveur peut compresser sélectivement certains messages SMB. Pour ce faire, la totalité du paquet SMB est compressée, et un en-tête transformé est préfixé, comme documenté dans MS-SMB2 2.2.42. Cet en-tête est une petite structure (16 octets) avec une valeur magique, la taille des données non compressées, l'algorithme de compression utilisé et une valeur d'offset.
CVE-2020-0796 est causé par un manque de vérification des limites dans cette taille d'offset, qui est directement transmise à plusieurs sous-routines. Le fait de passer une grande valeur provoque un dépassement de tampon et fait planter le noyau. Avec un travail supplémentaire, cela pourrait être développé en un exploit RCE.