Deserialisatierisico's bij gebruik van BinaryFormatter en gerelateerde typen
Dit artikel is van toepassing op de volgende typen:
Dit artikel is van toepassing op de volgende .NET-implementaties:
- .NET Framework alle versies
- .NET Core 2.1 - 3.1
- .NET 5 en hoger
Let op
Het BinaryFormatter type is gevaarlijk en wordt niet aanbevolen voor gegevensverwerking. Toepassingen moeten zo snel mogelijk stoppen met gebruik BinaryFormatter
, zelfs als ze geloven dat de gegevens die ze verwerken betrouwbaar zijn. BinaryFormatter
is onveilig en kan niet veilig worden gemaakt.
Notitie
Vanaf .NET 9 genereert de in-box-implementatie BinaryFormatter uitzonderingen voor gebruik, zelfs met de instellingen die eerder het gebruik ervan hebben ingeschakeld. Deze instellingen worden ook verwijderd. Raadpleeg de handleiding voor de migratie van BinaryFormatter voor meer informatie.
Deserialisatieproblemen
Deserialisatieproblemen zijn een bedreigingscategorie waarbij nettoladingen van aanvragen onveilig worden verwerkt. Een aanvaller die deze beveiligingsproblemen tegen een app gebruikt, kan denial of service (DoS), openbaarmaking van informatie of uitvoering van externe code in de doel-app veroorzaken. Deze risicocategorie maakt de OWASP Top 10 consistent. Doelen zijn onder andere apps die zijn geschreven in verschillende talen, waaronder C/C++, Java en C#.
In .NET is het grootste risicodoel apps die gebruikmaken van het BinaryFormatter type om gegevens te deserialiseren. BinaryFormatter
wordt veel gebruikt in het hele .NET-ecosysteem vanwege de kracht en het gebruiksgemak ervan. Dezelfde kracht biedt aanvallers echter de mogelijkheid om de controlestroom binnen de doel-app te beïnvloeden. Geslaagde aanvallen kunnen ertoe leiden dat de aanvaller code kan uitvoeren binnen de context van het doelproces.
Als eenvoudigere analogie wordt ervan uitgegaan dat het aanroepen BinaryFormatter.Deserialize
van een nettolading het equivalent is van het interpreteren van die nettolading als zelfstandig uitvoerbaar bestand en het starten ervan.
Beveiligingsproblemen met BinaryFormatter
Waarschuwing
De BinaryFormatter.Deserialize
methode is nooit veilig wanneer deze wordt gebruikt met niet-vertrouwde invoer. We raden consumenten ten zeerste aan een van de alternatieven te gebruiken die verderop in dit artikel worden beschreven.
BinaryFormatter
is geïmplementeerd voordat beveiligingsproblemen met deserialisatie een goed begrepen bedreigingscategorie waren. Als gevolg hiervan volgt de code geen moderne aanbevolen procedures. De Deserialize
methode kan worden gebruikt als vector voor aanvallers om DoS-aanvallen uit te voeren tegen het gebruik van apps. Deze aanvallen kunnen ertoe leiden dat de app niet meer reageert of leidt tot onverwachte procesafbreking. Deze aanvalscategorie kan niet worden verzacht met een SerializationBinder
of andere BinaryFormatter
configuratieswitch. .NET beschouwt dit gedrag als standaard en geeft geen code-update uit om het gedrag te wijzigen.
BinaryFormatter.Deserialize
kan vatbaar zijn voor andere aanvalscategorieën, zoals openbaarmaking van informatie of uitvoering van externe code. Het gebruik van functies zoals een aangepaste SerializationBinder functie is mogelijk onvoldoende om deze risico's goed te beperken. De mogelijkheid bestaat dat een aanvaller een nieuwe aanval ontdekt die bestaande oplossingen omzeilt. .NET verbindt zich niet tot het publiceren van patches als reactie op dergelijke bypasss. Bovendien kan het ontwikkelen of implementeren van dergelijke patches technisch onhaalbaar zijn. U moet uw scenario's beoordelen en rekening houden met uw potentiële blootstelling aan deze risico's.
We raden consumenten aan BinaryFormatter
afzonderlijke risicobeoordelingen uit te voeren op hun apps. Het is de enige verantwoordelijkheid van de consument om te bepalen of deze moet worden gebruikt BinaryFormatter
. Als u overweegt deze te gebruiken, moet u de gevolgen van beveiliging, technische, reputatie, juridische en regelgeving beoordelen.
Voorkeursalternatieven
.NET biedt verschillende in-box serializers waarmee niet-vertrouwde gegevens veilig kunnen worden verwerkt:
- XmlSerializer en DataContractSerializer om objectgrafieken in en uit XML te serialiseren. Verwar
DataContractSerializer
het niet met NetDataContractSerializer. - BinaryReader en BinaryWriter voor XML en JSON.
- De System.Text.Json API's voor het serialiseren van objectgrafieken in JSON.
Gevaarlijke alternatieven
Vermijd de volgende serializers:
De voorgaande serializers voeren allemaal onbeperkte polymorfe deserialisatie uit en zijn gevaarlijk, net als BinaryFormatter
.
De risico's van het aannemen van gegevens die betrouwbaar zijn
Een app-ontwikkelaar kan vaak geloven dat ze alleen vertrouwde invoer verwerken. De veilige invoercase is in zeldzame gevallen waar. Maar het is veel gebruikelijker dat een nettolading een vertrouwensgrens overschrijdt zonder dat de ontwikkelaar dit realiseert.
Overweeg een on-premises server waarbij werknemers een bureaubladclient van hun werkstations gebruiken om te communiceren met de service. Dit scenario kan naïef worden gezien als een 'veilige' installatie waarbij het gebruik BinaryFormatter
acceptabel is. Dit scenario biedt echter een vector voor malware die toegang krijgt tot de machine van één werknemer om zich in de hele onderneming te kunnen verspreiden. Deze malware kan gebruikmaken van het gebruik van BinaryFormatter
de onderneming om lateraal van het werkstation van de werknemer naar de back-endserver te gaan. Vervolgens kunnen de gevoelige gegevens van het bedrijf worden geëxfiltreerd. Dergelijke gegevens kunnen handelsgeheimen of klantgegevens omvatten.
Overweeg ook een app die wordt gebruikt BinaryFormatter
om de opslagstatus te behouden. Dit lijkt in eerste instantie een veilig scenario te zijn, omdat het lezen en schrijven van gegevens op uw eigen harde schijf een kleine bedreiging vormt. Het delen van documenten via e-mail of internet is echter gebruikelijk en de meeste eindgebruikers zouden het openen van deze gedownloade bestanden niet als riskant gedrag ervaren.
Dit scenario kan worden gebruikt voor kwaadwillend effect. Als de app een game is, kunnen gebruikers die bestanden delen, zichzelf onbewust risico lopen. De ontwikkelaars zelf kunnen ook worden gericht. De aanvaller kan de technische ondersteuning van de ontwikkelaars e-mailen, een schadelijk gegevensbestand toevoegen en het ondersteuningspersoneel vragen het te openen. Dit soort aanvallen kan de aanvaller een voet in de onderneming geven.
Een ander scenario is waarin het gegevensbestand wordt opgeslagen in cloudopslag en automatisch wordt gesynchroniseerd tussen de computers van de gebruiker. Een aanvaller die toegang kan krijgen tot het cloudopslagaccount kan het gegevensbestand vergiftigen. Dit gegevensbestand wordt automatisch gesynchroniseerd met de computers van de gebruiker. De volgende keer dat de gebruiker het gegevensbestand opent, wordt de nettolading van de aanvaller uitgevoerd. De aanvaller kan dus inbreuk maken op een cloudopslagaccount om volledige machtigingen voor het uitvoeren van code te verkrijgen.
Overweeg een app die wordt verplaatst van een desktop-installatiemodel naar een cloud-first model. Dit scenario omvat apps die overstappen van een desktop-app of uitgebreid clientmodel naar een webmodel. Bedreigingsmodellen die zijn getekend voor de desktop-app, zijn niet noodzakelijkerwijs van toepassing op de cloudservice. Het bedreigingsmodel voor de bureaublad-app kan een bepaalde bedreiging negeren als 'niet interessant voor de client om zichzelf aan te vallen'. Maar diezelfde bedreiging kan interessant worden wanneer deze een externe gebruiker (de client) beschouwt die de cloudservice zelf aanvalt.
Notitie
In het algemeen is het de bedoeling van serialisatie om een object naar of uit een app te verzenden. Een bedreigingsmodelleringsoefening markeert dit soort gegevensoverdracht bijna altijd als het overschrijden van een vertrouwensgrens.
Zie ook
- Migratiehandleiding voor BinaryFormatter
- Binaire serialisatie
- YSoSerial.Net voor onderzoek naar hoe aanvallers apps aanvallen die gebruikmaken van
BinaryFormatter
. - Algemene achtergrond van beveiligingsproblemen met deserialisatie: