Inledning¶
den här artikeln är inriktad på att ge tydlig, handlingsbar vägledning för att säkert deserialisera otillförlitliga data i dina applikationer.
Vad är deserialisering¶
serialisering är processen att förvandla ett objekt till ett dataformat som kan återställas senare. Människor serialiserar ofta objekt för att spara dem till lagring, eller att skicka som en del av kommunikationen.,
deserialisering är baksidan av den processen, tar data strukturerad från något format och bygger om det till ett objekt. Idag är det mest populära dataformatet för serialisering av data JSON. Innan det var det XML.
många programmeringsspråk erbjuder dock en inbyggd förmåga att serialisera objekt. Dessa ursprungliga format erbjuder vanligtvis fler funktioner än JSON eller XML, inklusive anpassningsbarhet av serialiseringsprocessen.
tyvärr kan funktionerna i dessa inbyggda deserialiseringsmekanismer återanvändas för skadlig effekt när de arbetar på otillförlitliga data., Attacker mot deserializers har visat sig tillåta överbelastningsattacker, åtkomstkontroll och RCE-attacker (remote code execution).
Guidance on Deserializing Objects Safely¶
följande Språkspecifika vägledning försöker räkna upp säkra metoder för att deserialisera data som inte kan lita på.
PHP¶
Whitebox Review¶
kontrollera användningen av funktionen unserialize() och granska hur de externa parametrarna accepteras., Använd ett säkert, standardformat för datautbyte som JSON (via json_decode()
och json_encode()
) om du behöver skicka serialiserade data till användaren.
Python¶
Blackbox Review¶
om trafikdata innehåller symbolpunkten.
I slutet är det mycket troligt att data skickades i serialisering.
WhiteBox Review¶
följande API i Python kommer att vara sårbar för serialisering attack. Sök kod för mönstret nedan.,
- användningarna av
pickle/c_pickle/_pickle
medload/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- användningar av
PyYAML
medload
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- användningar av
jsonpickle
medencode
ellerstore
metoder.
Java¶
följande tekniker är alla bra för att förhindra attacker mot deserialisering mot Javas Serialiserbara format.,
Implementation advices:
- i din kod åsidosätter du metoden
ObjectInputStream#resolveClass()
för att förhindra att godtyckliga klasser deserialiseras. Detta säkra beteende kan förpackas i ett bibliotek som SerialKiller. - använd en säker ersättning för den generiska
readObject()
– metoden som visas här. Observera att det här adresserar ”billion laughs” – attacker genom att kontrollera inmatningslängd och antal objekt som deserialiserats.
Whitebox Review¶
var medveten om följande Java API-användningsområden för potentiell serialiseringssårbarhet.,
XMLdecoder
with external user defined parameters
XStream
with fromXML
method (xstream version <= v1.46 is vulnerable to the serialization issue)
ObjectInputStream
with readObject
4.,rns kan föreslå att data skickades i Java-serialiseringsströmmar
-
AC ED 00 05
I Hex -
rO0
I Base64 -
Content-type
huvud för ett HTTP-svar påapplication/x-java-serialized-object
förhindra dataläckage och trusted field clobbering¶
om det finns datamedlemmar i ett objekt som aldrig ska kontrolleras av slutanvändare under deserialisering eller exponeras för användare under serialisering, bör de deklareras som nyckelordet transient
(avsnitt som skyddar känslig information).,
för en klass som definierats som serialiserbar ska den känsliga informationsvariabeln deklareras somprivate transient
.
till exempel deklarerades klassen myAccount, variabeln”profit”och” margin ”som övergående för att undvika att serialiseras:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
förhindra deserialisering av Domänobjekt¶
några av dina applikationsobjekt kan tvingas implementera Serialiserbara på grund av deras hierarki., För att garantera att dina applikationsobjekt inte kan deserialiseras ska enreadObject()
– metod deklareras (med enfinal
modifierare) som alltid kastar ett undantag:
härda din egen java.Io. ObjectInputStream¶
klassen java.io.ObjectInputStream
används för att deserialisera objekt. Det är möjligt att härda sitt beteende genom att underklassa det., Det här är den bästa lösningen om:
- Du kan ändra koden som gör deserialiseringen
- du vet vilka klasser du förväntar dig att deserialisera
den allmänna tanken är att åsidosättaObjectInputStream.html#resolveClass()
för att begränsa vilka klasser som får deserialiseras.
eftersom det här samtalet inträffar innan enreadObject()
anropas kan du vara säker på att ingen deserialiseringsaktivitet kommer att inträffa om inte typen är en som du vill tillåta.,
ett enkelt exempel på detta som visas här, där klassen LookAheadObjectInputStream
garanteras att inte deserialisera någon annan typ förutom klassen Bicycle
:
mer fullständiga implementeringar av detta tillvägagångssätt har föreslagits av olika diskussionsgruppmedlemmar:
- NibbleSec – ett bibliotek som tillåter vitlistning och svartlistning av klasser som får användas för att deserialized
- IBM – seminal protection, skrivna år innan de mest förödande exploateringsscenarierna föreställdes.,
- Apache Commons IO klasser
härda alla java.Io.ObjectInputStream användning med en Agent¶
som nämnts ovan, klassenjava.io.ObjectInputStream
används för att deserialisera objekt. Det är möjligt att härda sitt beteende genom att underklassa det. Men om du inte äger koden eller inte kan vänta på en patch, med hjälp av ett medel för att väva i härdning till java.io.ObjectInputStream
är den bästa lösningen.,
globalt ändra ObjectInputStream
är endast säker för svartlistning kända skadliga typer, eftersom det inte är möjligt att veta för alla program vad de förväntade klasserna som ska deserialiseras är. Lyckligtvis finns det väldigt få klasser som behövs i den svarta listan för att vara säker från alla kända attackvektorer, idag.
det är oundvikligt att fler ”gadget” – klasser kommer att upptäckas som kan missbrukas. Det finns dock en otrolig mängd sårbar programvara utsatt idag, i behov av en fix., I vissa fall, ”fastställande” sårbarheten kan innebära re-architecting meddelandesystem och bryta bakåtkompatibilitet som utvecklare går mot att inte acceptera serialiserade objekt.
för att aktivera dessa agenter, lägg bara till en ny JVM-parameter:
-javaagent:name-of-agent.jar
agenter som tar detta tillvägagångssätt har släppts av olika diskussionsgruppmedlemmar:
- rO0 med Kontrastsäkerhet
ett liknande, men mindre skalbart tillvägagångssätt skulle vara att manuellt lappa och starta din JVM: s Objektinputstream. Vägledning om detta tillvägagångssätt finns här.
.,Net csharp¶
Whitebox Review¶
Sök källkoden för följande termer:
TypeNameHandling
JavaScriptTypeResolver
leta efter serialiserare där typen ställs in av en användarstyrd variabel.,
Blackbox Review¶
Sök efter följande base64-kodat innehåll som börjar med:
AAEAAAD/////
Sök efter innehåll med följande text:
TypeObject
$type:
Allmänna försiktighetsåtgärder¶
Tillåt inte dataströmmen att definiera vilken typ av objekt som strömmen kommer att deserialiseras till. Du kan förhindra detta genom att till exempel använda DataContractSerializer
eller XmlSerializer
om möjligt.,
därJSON.Net
används se till attTypeNameHandling
endast är inställd påNone
.
TypeNameHandling = TypeNameHandling.None
omJavaScriptSerializer
ska användas ska den inte användas med enJavaScriptTypeResolver
.
om du måste avserialisera dataströmmar som definierar sin egen typ, begränsa sedan de typer som får avserialiseras. Man bör vara medveten om att detta fortfarande är riskabelt som många infödda.Net typer potentiellt farliga i sig. ex.,
System.IO.FileInfo
FileInfo
objekt som referensfiler som faktiskt finns på servern kan när deserialiseras, ändra egenskaperna för dessa filer, t.ex. skrivskyddad, skapa en potentiell överbelastningsattack.
även om du har begränsat de typer som kan deserialiseras, kom ihåg att vissa typer har egenskaper som är riskabla. System.ComponentModel.DataAnnotations.ValidationException
, till exempel har en egenskap Value
av typen Object
., om den här typen är den typ som tillåts för deserialisering kan en angripare ställa in egenskapen Value
till vilken objekttyp de väljer.
angripare bör förhindras från att styra den typ som kommer att instansieras. Om detta är möjligt kan även DataContractSerializer
eller XmlSerializer
undermatas t.ex.
// Action below is dangerous if the attacker can change the data in the databasevar typename = GetTransactionTypeFromDatabase();var serializer = new DataContractJsonSerializer(Type.GetType(typename));var obj = serializer.ReadObject(ms);
utförande kan ske inom vissa Net-typer under deserialisering. Att skapa en kontroll som den som visas nedan är ineffektiv.,
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);//Check below is too late! Execution may have already occurred.if (suspectObject is SomeDangerousObjectType){ //generate warnings and dispose of suspectObject}
förBinaryFormatter
ochJSON.Net
det är möjligt att skapa en säkrare form av vitlista kontroll med hjälp av en anpassadSerializationBinder
.
försök att hålla dig uppdaterad om kända.Net osäkra deserialiseringsprylar och var särskilt uppmärksam där sådana typer kan skapas av dina deserialiseringsprocesser. En deserializer kan bara instantiate typer som den vet om.
försök att hålla någon kod som kan skapa potentiella prylar åtskilda från vilken kod som helst som har internetanslutning., Som ett exempel System.Windows.Data.ObjectDataProvider
används i WPF-program är en känd gadget som tillåter godtycklig metod anrop. Det skulle vara riskabelt att ha detta en hänvisning till denna församling i ett REST service-projekt som deserialiserar opålitliga data.
känd .,NET RCE Gadgets¶
System.Configuration.Install.AssemblyInstaller
System.Activities.Presentation.WorkflowDesigner
System.Windows.ResourceDictionary
System.Windows.Data.ObjectDataProvider
System.Windows.Forms.BindingSource
Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider
System.Data.DataViewManager, System.Xml.XmlDocument/XmlDataDocument
System.Management.Automation.PSObject
Language-Agnostic Methods for Deserializing Safely¶
Using Alternative Data Formats¶
A great reduction of risk is achieved by avoiding native (de)serialization formats., Genom att byta till ett rent dataformat som JSON eller XML minskar du chansen att Anpassad deserialiseringslogik återanvänds mot skadliga ändar.
många program förlitar sig på ett objektmönster för dataöverföring som innebär att man skapar en separat domän för objekt för den explicita dataöverföringen. Det är självklart fortfarande möjligt att programmet kommer att göra säkerhetsfel efter att ett rent dataobjekt har analyserats.,
endast Avserialisera signerad Data¶
Om programmet vet innan deserialisering vilka meddelanden som måste behandlas, kan de signera dem som en del av serialiseringsprocessen. Programmet kunde då välja att inte avserialisera något meddelande som inte hade en autentiserad signatur.,
Mitigation Tools/Libraries¶
- Java secure deserialization library
- SWAT (Serial Whitelist Application Trainer)
- NotSoSerial
Detection Tools¶
- Java deserialization cheat sheet aived at pen testers
- ett proof-of-concept verktyg för att generera nyttolast som utnyttjar osäkra Java object deserialization.
- Java de-serialization toolkits
- Java de-serialization tool
- .,n
- JavaSerialKiller
- Java Deserialization Scanner
- Burp-ysoserial
- SuperSerial
- SuperSerial-Active
referenser¶
- Java-Deserialization-Cheat-Sheet
- Deserialization av otillförlitliga data
- Java deserialization Attacks – German OWASP Day 2016
- Appseccali 2015 – marshalling pickles
- foxglove security – sårbarhet tillkännagivande
- Java deserialization Cheat Sheet riktar sig till Pen testare
- ett bevis på konceptet verktyg för att generera nyttolaster som utnyttjar osäkra Java objekt deserialisering.,
- Java de-serialization toolkits
- Java de-serialization tool
- Burp Suite extension
- Java secure deserialization library
- Serianyzer är en statisk bytekodanalysator för deserialisering
- Nyttolastgenerator
- Android Java Deserialization Vulnerability Tester
- Burp Suite Extension
- javaserialkiller
- Java deserialization scanner
- burp-ysoserial
- superserial
- superserial-active
- . NET
- Alvaro Muñoz:.,NET Serialisering: Upptäcka och försvara utsatta endpoints
- James Forshaw – Black Hat USA 2012 – Är Du Min Typ? Bryta. Net sandlådor genom serialisering
- Jonathan Birch BlueHat v17 – farligt innehåll – säkra. Net Deserialization
- Alvaro Muñoz & Oleksandr Mirosh-fredag den 13: attackerande JSON-AppSecUSA 2017