Risques de désérialisation liés à l’utilisation de BinaryFormatter et des types associés
Cet article s’applique aux types suivants :
Cet article s’applique aux implémentations .NET suivantes :
- .NET Framework, toutes les versions
- .NET Core 2.1 à 3.1
- .NET 5 et versions ultérieures
Attention
Le type BinaryFormatter est dangereux et n’est pas recommandé pour le traitement des données. Les applications doivent cesser d’utiliser BinaryFormatter
dès que possible, même si elles considèrent que les données qu’elles traitent sont fiables. BinaryFormatter
n’est pas sécurisé et ne peut pas être sécurisé.
Remarque
À partir de .NET 9, l’implémentation de la boîte de dialogue BinaryFormatter génère des exceptions lors de son utilisation, même avec les paramètres qui permettaient auparavant de l’utiliser. Ces paramètres sont également supprimés. Pour plus d’informations, consultez le guide de migration BinaryFormatter.
Vulnérabilités de désérialisation
Les vulnérabilités de désérialisation sont une catégorie de menace dans laquelle les charges utiles de requête sont traitées de manière non sécurisée. Un attaquant qui tire parti de ces vulnérabilités sur une application peut provoquer un déni de service (DoS), la divulgation d’informations ou l’exécution de code à distance à l’intérieur de l’application cible. Cette catégorie de risque fait systématiquement partie du Top 10 de l’OWASP. Les cibles incluent les applications écrites dans divers langages, notamment C/C++, Java et C#.
Dans .NET, les applications qui utilisent le type BinaryFormatter pour désérialiser des données sont la cible à risque la plus importante. BinaryFormatter
est largement utilisé dans l’écosystème .NET en raison de sa puissance et de sa facilité d’utilisation. Toutefois, cette même puissance permet aux attaquants d’influencer le flux de contrôle au sein de l’application cible. Les attaques réussies peuvent permettre à l’attaquant d’exécuter du code dans le contexte du processus cible.
En guise d’analogie plus simple, supposons que l’appel de BinaryFormatter.Deserialize
sur une charge utile équivaut à interpréter cette charge utile comme un exécutable autonome et à la lancer.
Failles de sécurité de BinaryFormatter
Avertissement
La méthode BinaryFormatter.Deserialize
n’est jamais sécurisée lorsqu’elle est utilisée avec une entrée non approuvée. Nous recommandons vivement aux consommateurs d’utiliser l’une des alternatives décrites plus loin dans cet article.
BinaryFormatter
a été implémenté avant que les vulnérabilités de désérialisation soient une catégorie de menace bien comprise. Par conséquent, le code ne suit pas les bonnes pratiques modernes. La méthode Deserialize
peut être utilisée comme vecteur pour permettre aux attaquants d’effectuer des attaques DoS contre les applications consommatrices. Ces attaques peuvent entraîner l’absence de réponse de l’application ou la fin inattendue du processus. Cette catégorie d’attaque ne peut pas être atténuée avec un SerializationBinder
ou tout autre commutateur de configuration BinaryFormatter
. .NET considère ce comportement comme étant inhérent et ne proposera pas de mise à jour de code pour modifier ce comportement.
BinaryFormatter.Deserialize
peut être vulnérable à d’autres catégories d’attaques, telles que la divulgation d’informations ou l’exécution de code à distance. L’utilisation de fonctionnalités telles qu’une personnalisée SerializationBinder peut être insuffisante pour atténuer correctement ces risques. Il existe la possibilité qu’un attaquant découvre un exploit nouveau qui contourne les atténuations existantes. .NET ne s’engage pas à publier des correctifs en réponse à de tels contournements. En outre, le développement ou le déploiement de tels correctifs peuvent être techniquement infeasibles. Vous devez évaluer vos scénarios et prendre en compte votre exposition potentielle à ces risques.
Nous recommandons aux consommateurs de BinaryFormatter
d’effectuer des évaluations des risques individuels sur leurs applications. Il incombe entièrement au consommateur de déterminer s’il convient d’utiliser BinaryFormatter
. Si vous envisagez de l’utiliser, vous devez évaluer les risques liés aux conséquences en matière de sécurité, techniques, de réputation, juridiques et réglementaires.
Alternatives préférées
.NET propose plusieurs sérialiseurs prêts à l’emploi qui peuvent gérer les données non approuvées de façon sécurisée :
- XmlSerializer et DataContractSerializer pour sérialiser des graphes d’objets en et à partir de XML. Ne confondez pas
DataContractSerializer
avec NetDataContractSerializer. - BinaryReader et BinaryWriter pour XML et JSON.
- Les API System.Text.Json pour sérialiser des graphes d’objets au format JSON.
Alternatives dangereuses
Évitez les sérialiseurs suivants :
Les sérialiseurs précédents effectuent tous une désérialisation polymorphe sans restriction et sont dangereux, tout comme BinaryFormatter
.
Les risques liés à l’hypothèse que les données sont dignes de confiance
Souvent, un développeur d’applications peut croire qu’il traite uniquement des entrées de confiance. Le cas d’une entrée sécurisée est vrai dans de rares circonstances. Mais il est beaucoup plus courant qu’une charge utile dépasse une limite d’approbation sans que le développeur s’en rende compte.
Prenons l’exemple d’un serveur local, où les employés utilisent un client de bureau à partir de leurs stations de travail pour interagir avec le service. Ce scénario peut être considéré naïvement comme une configuration « sécurisée » où l’utilisation de BinaryFormatter
est acceptable. Toutefois, il présente un vecteur pour les programmes malveillants qui accèdent à la machine d’un seul employé pour pouvoir se propager dans l’entreprise. Ce programme malveillant peut tirer parti de l’utilisation de BinaryFormatter
par l’entreprise pour passer latéralement de la station de travail de l’employé au serveur principal. Il peut ensuite exfiltrer les données sensibles de l’entreprise. Ces données peuvent inclure des secrets commerciaux ou des données client.
Considérez également une application qui utilise BinaryFormatter
pour conserver l’état de sauvegarde. Cela peut sembler à première vue un scénario sûr, car la lecture et l’écriture de données sur votre propre disque dur représentent une menace mineure. Toutefois, le partage de documents par e-mail ou sur Internet est courant, et la plupart des utilisateurs finaux ne perçoivent pas l’ouverture de ces fichiers téléchargés comme un comportement risqué.
Ce scénario peut être exploité pour avoir un effet néfaste. Si l’application est un jeu, les utilisateurs qui partagent des fichiers de sauvegarde sans le savoir se mettent en danger. Les développeurs eux-mêmes peuvent également être ciblés. L’attaquant peut envoyer un e-mail au support technique des développeurs, en joignant un fichier de données malveillant et en demandant au personnel du support technique de l’ouvrir. Ce type d’attaque peut lui donner un accès à l’entreprise.
Un autre scénario est celui où le fichier de données est stocké dans le stockage cloud et synchronisé automatiquement entre les machines de l’utilisateur. Un attaquant qui est en mesure d’accéder au compte de stockage cloud peut empoisonner le fichier de données. Ce fichier de données est automatiquement synchronisé avec les appareils de l’utilisateur. La prochaine fois que l’utilisateur ouvre le fichier de données, la charge utile de l’attaquant s’exécute. Ainsi, l’attaquant peut tirer parti d’une compromission de compte de stockage cloud pour obtenir des autorisations d’exécution de code complètes.
Prenons l’exemple d’une application qui passe d’un modèle d’installation de bureau à un modèle « cloud-first ». Ce scénario inclut des applications qui passent d’une application de bureau ou d’un modèle client riche à un modèle web. Les modèles de menace présentés pour l’application de bureau ne sont pas nécessairement applicables au service cloud. Le modèle de menace pour l’application de bureau peut ignorer une menace donnée s’il n’est « pas intéressant pour le client de s’attaquer lui-même ». Mais cette même menace peut devenir intéressante quand on considère qu’un utilisateur distant (le client) attaque le service cloud lui-même.
Notes
En termes généraux, l’objectif de la sérialisation est de transmettre un objet dans ou hors d’une application. Un exercice de modélisation des menaces marque presque toujours ce type de transfert de données comme franchissant une limite d’approbation.
Voir aussi
- Guide de migration BinaryFormatter
- Sérialisation binaire
- YSoSerial.Net pour plus d’informations sur la façon dont les acteurs malveillants attaquent les applications qui utilisent
BinaryFormatter
. - Informations générales sur les vulnérabilités de désérialisation :