Introduction¶
Ez a cikk arra összpontosít, hogy egyértelmű, megvalósítható útmutatást biztosítson a nem megbízható adatok biztonságos megsemmisítéséhez az alkalmazásokban.
mi a Deserialization¶
Serialization az a folyamat, amely valamilyen objektumot később visszaállítható adatformátummá alakít. Az emberek gyakran szerializálják az objektumokat annak érdekében, hogy mentsék őket tárolásra, vagy a kommunikáció részeként küldjenek.,
Deserialization a fordított, hogy a folyamat, figyelembe adatok strukturált valamilyen formátumban, majd újjáépítése egy objektum. Ma az adatok sorozatának legnépszerűbb adatformátuma a JSON. Ezt megelőzően XML volt.
azonban sok programozási nyelv natív képességet kínál az objektumok sorosítására. Ezek a natív formátumok általában több funkciót kínálnak, mint a JSON vagy az XML, beleértve a sorosítási folyamat testreszabhatóságát.
sajnos ezeknek a natív deserializációs mechanizmusoknak a jellemzői rosszindulatú hatás esetén újra felhasználhatók, ha nem megbízható adatokon működnek., A dezerializátorok elleni támadásokról megállapították, hogy lehetővé teszik a szolgáltatás megtagadását, a hozzáférés-vezérlést és a távoli kód-végrehajtást (RCE).
Guidance on Deserializing Objects Safely¶
a következő Nyelvspecifikus útmutató megkísérli felsorolni a biztonságos módszereket a megbízhatatlan adatok megsemmisítésére.
PHP¶
WhiteBox Review¶
ellenőrizze az unserialize() függvény használatát, és vizsgálja meg, hogyan fogadják el a külső paramétereket., Használjon biztonságos, szabványos adatcsereformátumot, mint például a JSON (via json_decode()
és json_encode()
), ha serializált adatokat kell átadnia a felhasználónak.
Python¶
BlackBox Review¶
Ha a forgalmi adatok a dot szimbólumot tartalmazzák .
a végén nagyon valószínű, hogy az adatokat serializációban küldték el.
WhiteBox Review¶
a következő API a Python-ban érzékeny lesz a serializációs támadásra. Keresse meg az alábbi minta kódját.,
- a
pickle/c_pickle/_pickle
load/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
-
PyYAML
load
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
-
jsonpickle
encode
vagyid=”9c180180dd”>módszerek.
Java¶
a következő technikák mind alkalmasak a Java Serializálható formátuma elleni deserializációs támadások megelőzésére.,
implementációs tanácsok:
- a kódban felülírja a
ObjectInputStream#resolveClass()
módszert, hogy megakadályozza az önkényes osztályok dezerializációját. Ezt a biztonságos viselkedést be lehet csomagolni egy olyan könyvtárba, mint a SerialKiller. - a generikus
readObject()
metódus biztonságos helyettesítése az itt látható módon. Megjegyzendő, hogy ez a” milliárd nevet ” típusú támadások ellenőrzésével bemeneti hossza és objektumok száma deserialized.
WhiteBox Review¶
vegye figyelembe a következő Java API-t a potenciális serializációs sebezhetőség érdekében.,
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 azt sugallják, hogy az adatokat küldött Java sorozatkészítés patakok
-
AC ED 00 05
a Hex -
rO0
Base64 -
Content-type
fejléc a HTTP válasz beállításaapplication/x-java-serialized-object
Megakadályozza az Szivárgás, Megbízható Mezőt Felülírja ś
Ha vannak adatok tagjai egy tárgy, hogy soha nem szabad által ellenőrzött végfelhasználók során deserialization vagy téve, hogy a felhasználók alatt, sorozatkészítés, azt be kell jelenteni, mint a transient
kulcsszó (lásd Védi az Érzékeny Információkat).,
egy Sorosítható osztály esetében az érzékeny információ változót private transient
– nek kell nyilvánítani.
például az osztály myAccount, a változó ‘profit”, valamint a ” mozgástér nyilvánították, mint átmeneti kerülni, hogy a fejezetei:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
Megakadályozzák Deserialization a Domain Tárgyak ś
Néhány alkalmazás tárgyak is kénytelen végrehajtani Serializable miatt a hierarchia., Garantálja, hogy a kérelem tárgyakat nem lehet deserialized, egy readObject()
módszert kell nyilvánítani (egy final
módosító), amely mindig kivételt dob:
Harden A Saját java.io.ObjectInputStream ś
A java.io.ObjectInputStream
class használt deserialize tárgyakat. Lehetséges, hogy megkeményíti a viselkedését az alosztályozással., Ez a legjobb megoldás, ha:
- megváltoztathatja azt a kódot, amely a deserializációt teszi
- tudod, hogy milyen osztályokat vársz el a
az általános elképzelés az, hogy felülbírálja aObjectInputStream.html#resolveClass()
– ot annak korlátozása érdekében, hogy mely osztályokat hagyjuk deserializálni.
mivel ez a hívás a readObject()
előtt történik, biztos lehet benne, hogy nem történik dezerializációs tevékenység, kivéve, ha a típus az, amelyet engedélyezni kíván.,
egyszerű példa erre az itt látható, ahol a LookAheadObjectInputStream
osztály garantáltan nem deserialize bármely más típus mellett a Bicycle
osztály:
Több teljes implementáció ezt a megközelítést javasolt a különböző közösségi tagok:
- NibbleSec – egy könyvtár, amely lehetővé teszi, whitelisting pedig feketelistára osztályok, amelyek lehetővé tette, hogy deserialized
- az IBM – a híres védelem, írásbeli évvel azelőtt, hogy a legpusztítóbb kizsákmányolás forgatókönyveket is elképzelt.,
- Apache Commons Io classes
Harden All java.io.ObjectInputStream Usage with an Agent¶
mint már említettük, a java.io.ObjectInputStream
class is used to deserialize objects. Lehetséges, hogy megkeményíti a viselkedését az alosztályozással. Ha azonban nem rendelkezik a kóddal, vagy nem tud várni egy javításra, akkor a java.io.ObjectInputStream
szövéshez használt szer használata a legjobb megoldás.,
globálisan változóObjectInputStream
csak akkor biztonságos feketelistára ismert rosszindulatú típusok, mert nem lehet tudni, hogy minden alkalmazás, amit a várható osztályok deserialized vannak. Szerencsére nagyon kevés osztályra van szükség a feketelistán, hogy biztonságban legyenek az összes ismert támadóvektortól, ma.
elkerülhetetlen, hogy több” gadget ” osztályt fedezzenek fel, amelyek visszaélhetnek. Azonban van egy hihetetlen mennyiségű sebezhető szoftver kitéve ma, szüksége van egy fix., Bizonyos esetekben a biztonsági rés” rögzítése ” magában foglalhatja az üzenetküldő rendszerek újratervezését, valamint a visszafelé kompatibilitás megszakítását, mivel a fejlesztők a sorosított objektumok nem elfogadása felé mozdulnak el.
lehetővé teszi, Hogy ezek a szerek, egyszerűen egy új JVM paraméter:
-javaagent:name-of-agent.jar
Ügynökök véve ez a megközelítés már megjelent a különböző közösségi tagok:
- rO0 ezzel Szemben a Biztonsági
Egy hasonló, de kevesebb skálázható megközelítés lenne, ha kézzel javítás, valamint bootstrap a JVM az ObjectInputStream. A megközelítésre vonatkozó útmutatás itt érhető el.
.,Net CSharp¶
Whitebox Review¶
keresse meg a forráskódot a következő kifejezésekre:
TypeNameHandling
JavaScriptTypeResolver
keresse meg azokat a szerializátorokat, ahol a típust egy felhasználó által vezérelt változó állítja be.,
BlackBox Review¶
keresse meg a következő base64 kódolt tartalmat, amely a következővel kezdődik:
AAEAAAD/////
tartalom keresése a következő szöveggel:
TypeObject
$type:
általános óvintézkedések¶
ne engedje, hogy az adatfolyam meghatározza az objektum típusát, amelyre a patak deserializálódik. Ezt megakadályozhatja például a DataContractSerializer
vagy XmlSerializer
, ha lehetséges.,
aholJSON.Net
van használatban győződjön meg róla, hogy aTypeNameHandling
csakNone
.
TypeNameHandling = TypeNameHandling.None
Ha JavaScriptSerializer
akkor ne használja JavaScriptTypeResolver
.
ha törölnie kell a saját típusukat meghatározó adatfolyamokat, akkor korlátozza azokat a típusokat, amelyek dezerializálhatók. Tisztában kell lennünk azzal, hogy ez még mindig kockázatos, mivel sok natív.Net-típus önmagában potenciálisan veszélyes. pl.,
System.IO.FileInfo
FileInfo
objektumok referencia fájlok ténylegesen a szerveren, amikor deserialized, tulajdonságainak módosítása azokat a fájlokat pl. csak olvasható, ami egy potenciális szolgáltatásmegtagadási támadás.
még akkor is, ha korlátozta a dezerializálható típusokat, ne feledje, hogy egyes típusoknak kockázatos tulajdonságai vannak. System.ComponentModel.DataAnnotations.ValidationException
, például van egy tulajdonság Value
Object
., ha ez a típus a dezerializációhoz engedélyezett típus, akkor a támadó beállíthatja a Value
tulajdonságot bármely választott objektumtípusra.
a támadókat meg kell akadályozni abban, hogy az instantált típust irányítsák. Ha ez lehetséges ,akkor még a DataContractSerializer
vagy XmlSerializer
is felforgatható, pl.
// 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);
végrehajtás előfordulhat bizonyos.Net típusokon a deserializáció során. Egy olyan vezérlés létrehozása, mint az alább látható, Hatástalan.,
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}
mert BinaryFormatter
és JSON.Net
a fehér lista vezérlésének biztonságosabb formáját lehet létrehozni egy egyéni SerializationBinder
.
próbáljon naprakészen tartani az ismert. Net bizonytalan deserializációs modulokat, és fordítson különös figyelmet arra, hogy ilyen típusokat a deserializációs folyamatok hozhassanak létre. A dezerializátor csak példányos típusú, hogy tud róla.
próbáljon meg minden olyan kódot megtartani, amely elválaszthatja a potenciális modulokat az internetkapcsolattal rendelkező kódoktól., Példaként System.Windows.Data.ObjectDataProvider
használt WPF alkalmazások egy ismert szerkentyű, amely lehetővé teszi az önkényes módszer hívása. Kockázatos lenne, ha ez a hivatkozás erre az összeszerelésre egy olyan REST service projektben lenne, amely dezerializálja a nem megbízható adatokat.
ismert .,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., Ha tiszta adatformátumra vált, mint például a JSON vagy az XML, csökkenti annak esélyét, hogy az egyéni deserializációs logikát rosszindulatú végek felé repurposálják.
sok alkalmazás egy adatátviteli objektummintára támaszkodik, amely magában foglalja az objektumok külön tartományának létrehozását az explicit célú adatátvitelhez. Természetesen továbbra is lehetséges, hogy az alkalmazás biztonsági hibákat követ el a tiszta adatobjektum elemzése után.,
csak deserialize aláírt adatok¶
Ha az alkalmazás tudja, mielőtt deserialization mely üzeneteket kell feldolgozni, tudták aláírni őket részeként a serialization folyamat. Az alkalmazás ezután dönthet úgy, hogy nem törli azokat az üzeneteket, amelyeknek nincs hitelesített aláírása.,
enyhítő eszközök/könyvtárak¶
- Java secure deserialization library
- SWAT (Serial Whitelist Application Trainer)
- NotSoSerial
Detection Tools¶
- Java deserialization cheat sheet célzó toll tesztelők
- a proof-of-concept tool tool for payloads that exploit nem biztonságos generáló Java object deserialization.
- Java de-serialization toolkits
- Java de-serialization tool
- .,n
- JavaSerialKiller
- Java Deserialization Szkenner
- Böfög-ysoserial
- SuperSerial
- SuperSerial-Aktív
Hivatkozások ś
- Java-Deserialization-Cheat-Lap
- Deserialization a nem megbízható adatok
- Java Deserialization Támadások – német OWASP Nap 2016
- AppSecCali 2015 – Rendező Uborkát
- Gyűszűvirág Biztonsági Rés Bejelentés
- Java deserialization puskát, amelynek célja toll tesztelők
- Egy proof-of-concept eszköz generáló rakományának, hogy kihasználják a nem biztonságos Java objektum deserialization.,
- Java-De-sorozatkészítés segédanyagokat
- Java-de-sorozatkészítés eszköz
- Böfög Suite kiterjesztését
- Java biztonságos deserialization könyvtár
- Serianalyzer egy statikus bytecode analyzer deserialization
- Hasznos generátor
- Android Java Deserialization biztonsági Rés Teszter
- Böfög Suite Kiterjesztését
- JavaSerialKiller
- Java Deserialization Szkenner
- Böfög-ysoserial
- SuperSerial
- SuperSerial-Aktív
- .Nettó
- Alvaro Muñoz: .,NET Serialization: detecting and defending sebezhető végpontok
- James Forshaw-Black Hat USA 2012-Are You My Type? Breaking .nettó homokszóró berendezéseket Át Sorszámozás
- Jonathan Nyírfa BlueHat v17 – Veszélyes Tartalom – Biztosítása .Nettó Deserialization
- Alvaro Muñoz & Oleksandr Mirosh – péntek 13: Támadó JSON – AppSecUSA 2017