Rekonstrukce tahák¶

Úvod¶

Tento článek se zaměřuje na poskytování jasné, žalovatelné pokyny pro bezpečné při rekonstrukci nedůvěryhodných dat ve vašich aplikacích.

co je Deserializace¶

serializace je proces přeměny nějakého objektu na datový formát, který lze později obnovit. Lidé často serializovat objekty, aby je uložit na úložiště nebo poslat jako součást komunikace.,

Deserializace je opakem tohoto procesu, přičemž data jsou strukturována z nějakého formátu a přestavěna na objekt. Dnes je nejoblíbenějším datovým formátem pro serializaci dat JSON. Předtím to byl XML.

mnoho programovacích jazyků však nabízí nativní schopnost serializace objektů. Tyto nativní formáty obvykle nabízejí více funkcí než JSON nebo XML, včetně přizpůsobení procesu serializace.

Bohužel, vlastnosti těchto nativní rekonstrukci mechanismy mohou být repurposed pro škodlivý účinek při provozu na nedůvěryhodné údaje., Bylo zjištěno, že útoky proti dezerializátorům umožňují útoky typu odmítnutí služby, řízení přístupu a vzdálené spuštění kódu (RCE).

Návod na při rekonstrukci Objektů Bezpečně¶

následující jazyk-zvláštní pokyny pokusy o výčet bezpečný metodiky při rekonstrukci dat, které se nedá věřit.

PHP¶

Whitebox Review¶

zkontrolujte použití funkce unserialize() a zkontrolujte, jak jsou přijímány externí parametry., Pokud potřebujete předat serializovaná data uživateli, použijte bezpečný standardní formát výměny dat, jako je JSON (via json_decode() a json_encode()).

Pythonu¶

BlackBox Recenze¶

Pokud provozních údajů obsahuje symbol dot . na konci, je velmi pravděpodobné, že data byla odeslána v serializaci.

Whitebox Review¶

následující API v Pythonu bude náchylné k serializaci útoku. Vyhledávací kód pro vzor níže.,

  1. použití pickle/c_pickle/_pickle load/loads:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
  1. Použití PyYAML load:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
  1. Použití jsonpickle encode nebo store metody.

Java¶

tyto techniky jsou dobré pro prevenci útoků proti deserializace proti Java je Serializable formátu.,

implementační rady:

  • ve vašem kódu přepište metodu ObjectInputStream#resolveClass(), aby se zabránilo deserializaci libovolných tříd. Toto bezpečné chování může být zabaleno do knihovny jako SerialKiller.
  • použijte bezpečnou náhradu za generickou metodu readObject(), jak je vidět zde. Všimněte si, že se jedná o útoky typu „miliarda smíchů“ kontrolou délky vstupu a počtu objektů deserializovaných.

Whitebox Review¶

uvědomte si následující použití Java API pro potenciální zranitelnost serializace.,

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 může naznačovat, že data byla odeslána v Java serializace proudy

  • AC ED 00 05 Hex
  • rO0 v Base64
  • Content-type záhlaví HTTP odpověď nastavena na application/x-java-serialized-object

Zabránit Úniku Dat a Důvěryhodné Pole Přepisování¶

Pokud jsou datové členy objektu, který by nikdy neměl být kontrolován koncovým uživatelům při rekonstrukci nebo vystaveni uživatelé během serializace, že by měl být deklarován jako transient klíčové slovo (§Ochrana Citlivých Informací).,

pro třídu, která je definována jako Serializovatelná, by měla být proměnná citlivých informací deklarována jako private transient.

například, třídy myAccount, proměnnou „zisk“ a „rozpětí“ byly prohlášeny za přechodné, aby se zabránilo, které mají být serializován:

public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....

Zabránit Deserializace z Domény Objektů¶

Některé aplikace objekty mohou být nuceni provádět Serializable vzhledem k jejich hierarchie., Zaručit, že vaše žádost objekty nemohou být rekonstruován, readObject() metoda by měla být prohlášena za (s final modifikátor), která vždy vyvolá výjimku:

Harden Vlastní java.io.ObjectInputStream¶

java.io.ObjectInputStream třída se používá k deserializaci objektů. Je možné ztvrdnout jeho chování podtříděním., To je nejlepší řešení, pokud:

  • můžete změnit kód, který má rekonstrukci
  • víte, co kurzy budete očekávat, že rekonstruovat

obecná myšlenka je přepsat ObjectInputStream.html#resolveClass() za účelem omezení, které třídy mohou být rekonstruován.

Protože tato výzva stane před readObject() se nazývá, můžete si být jisti, že žádné deserializace činnost bude dojít, pokud typ je ten, který chcete povolit.,

jednoduchý příklad tohoto je znázorněno zde, kde LookAheadObjectInputStream třída je zaručeno, že nebudou rekonstruovat jakýkoli jiný typ kromě Bicycle třídy:

Více kompletní implementace tohoto přístupu byly navrženy podle různých členů komunity:

  • NibbleSec – knihovna, která umožňuje whitelisting a blacklisting tříd, které mohou být deserialized
  • IBM – semenné ochrany, písemné let, než nejničivější využívání scénáře byly představoval.,
  • Apache Commons IO tříd

Harden Všechny java.io.ObjectInputStream Použití s Agentem,¶

Jak bylo uvedeno výše, java.io.ObjectInputStream třída se používá k deserializaci objektů. Je možné ztvrdnout jeho chování podtříděním. Pokud však kód nevlastníte nebo nemůžete čekat na opravu, je nejlepším řešením použití agenta k tkaní v kalení na java.io.ObjectInputStream.,

Globálně mění ObjectInputStream je pouze bezpečný pro zapsání známé nebezpečné typy, protože to není možné pro všechny aplikace, co očekává, že třídy, které lze rekonstruovat. Naštěstí existuje jen velmi málo tříd potřebných v černé listině, aby byly v bezpečí před všemi známými útočnými vektory, dnes.

je nevyhnutelné, že budou objeveny další třídy „gadget“, které mohou být zneužity. Dnes je však vystaveno neuvěřitelné množství zranitelného softwaru, který potřebuje opravu., V některých případech, „upevnění“ zranitelnost může zahrnovat re-architecting messaging systémy a porušení zpětné kompatibility, jak vývojáři přesunout směrem k nepřijetí serializované objekty.

povolit tyto látky, jednoduše přidat nové JVM parametr:

-javaagent:name-of-agent.jar

Agenti se, že tento přístup byl propuštěn, podle různých členů komunity:

  • rO0 Naopak Bezpečnost

podobný, ale méně škálovatelné přístup by měl být ruční oprava a bootstrap JVM je ObjectInputStream. Pokyny k tomuto přístupu jsou k dispozici zde.

.,Net CSharp¶

WhiteBox Recenze¶

Hledat zdrojové kódy pro následující podmínky:

  1. TypeNameHandling
  2. JavaScriptTypeResolver

Podívejte se na každém serializers, kde typ je nastaven uživatelem řízené proměnné.,

BlackBox Recenze¶

Hledat pro následující base64 kódovaný obsah, který začíná:

AAEAAAD/////

Vyhledávat obsah s následující text:

  1. TypeObject
  2. $type:

Obecné Opatření,¶

nedovolte, aby datastream definovat typ objektu, že proud bude rekonstruován. Tomu můžete zabránit například použitím DataContractSerializernebo XmlSerializer, pokud je to vůbec možné.,

Kde JSON.Net je používán, ujistěte se, že TypeNameHandling je nastaven na None.

TypeNameHandling = TypeNameHandling.None

Pokud JavaScriptSerializer je třeba použít, pak nepoužívejte jej s JavaScriptTypeResolver.

Pokud musíte deserializovat datové proudy, které definují jejich vlastní typ, pak omezte typy, které mohou být deserializovány. Je třeba si uvědomit, že je to stále riskantní jako mnoho nativních typů.Net potenciálně nebezpečné samy o sobě. jako.,

System.IO.FileInfo

FileInfo objekty, které referenčními soubory na server, když rekonstruovat, změnit vlastnosti těchto souborů, např. pouze pro čtení, vytváří potenciální popření servisního útoku.

i když jste omezili typy, které lze deserializovat, nezapomeňte, že některé typy mají rizikové vlastnosti. System.ComponentModel.DataAnnotations.ValidationException, například má vlastnost Value typu Object., pokud je tento typ typem povoleným pro deserializaci, může útočník nastavit vlastnost Value na jakýkoli typ objektu, který zvolí.

útočníkům by mělo být zabráněno řídit typ, který bude instantován. Pokud je to možné, pak i DataContractSerializer nebo XmlSerializer může být subverted např.

// 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);

Provedení může dojít v některých .Čisté typy se během deserializace. Vytvoření kontroly, jako je ta níže uvedená, je neúčinné.,

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}

Na BinaryFormatter JSON.Net možné je vytvořit bezpečnější formě bílého seznamu ovládat pomocí vlastní SerializationBinder.

snažte se udržovat aktuální informace o známých miniaplikacích.Net insecure deserialization a věnujte zvláštní pozornost tam, kde tyto typy mohou být vytvořeny vašimi procesy deserializace. Deserializátor může pouze instancovat typy, o kterých ví.

pokuste se zachovat jakýkoli kód, který by mohl vytvářet potenciální gadgety odděleně od jakéhokoli kódu, který má připojení k internetu., Jako příklad System.Windows.Data.ObjectDataProvider používá se v aplikacích WPF je známý gadget, který umožňuje libovolnou metodu vyvolání. Bylo by riskantní mít tento odkaz na toto shromáždění v projektu REST service, který deserializuje nedůvěryhodná data.

známo .,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., Přepnutím na čistý datový formát, jako je JSON nebo XML, snížíte šanci, že logika vlastní deserializace bude repurposed směrem k škodlivým koncům.

mnoho aplikací se spoléhá na vzor objektu pro přenos dat, který zahrnuje vytvoření samostatné domény objektů pro explicitní přenos dat. Samozřejmě je stále možné, že aplikace provede bezpečnostní chyby po analýze čistého datového objektu.,

Pouze Rekonstruovat Podepsaných Dat¶

Pokud aplikace ví, před rekonstrukci, které zprávy budou muset být zpracovány, se mohl podepsat jako součást serializace proces. Aplikace se pak mohla rozhodnout, že nebude deserializovat žádnou zprávu, která neměla ověřený podpis.,

Zmírnění Nástroje/Knihovny¶

  • Java secure rekonstrukci knihovny
  • SWAT (Sériové Whitelist Aplikace, Trenér)
  • NotSoSerial

Nástroje pro Detekci¶

  • Java rekonstrukci tahák zaměřené na pero testerů
  • proof-of-concept nástroj pro generování užitečné zatížení, které využívají nebezpečné Java objekt deserializace.
  • Java De-serialization toolkits
  • Java de-serialization tool
  • .,n
    • JavaSerialKiller
    • Java Rekonstrukci Skeneru
    • Krkat-ysoserial
    • SuperSerial
    • SuperSerial-Aktivní

Odkazy¶

  • Java-Rekonstrukci-Cheat-List
  • Deserializace z nedůvěryhodných dat
  • Java Rekonstrukci Útoky – německý OWASP Den 2016
  • AppSecCali 2015 – Seřaďovací Okurky
  • Náprstník Zabezpečení – Zabezpečení Oznámení
  • Java rekonstrukci tahák zaměřené na pero testerů
  • proof-of-concept nástroj pro generování užitečné zatížení, které využívají nebezpečné Java objekt deserializace.,
  • Java De-serializace nástrojů
  • Java de-serializace nástroj
  • Burp Suite rozšíření
  • Java secure rekonstrukci knihovny
  • Serianalyzer je statická bytecode analyzátor pro rekonstrukci
  • Payload generator
  • Android Java Rekonstrukci Zranitelnost Tester
  • Burp Suite Rozšíření
    • JavaSerialKiller
    • Java Rekonstrukci Skeneru
    • Krkat-ysoserial
    • SuperSerial
    • SuperSerial-Aktivní
  • .Net
    • Alvaro Muñoz: .,Čistá serializace: detekce a obrana zranitelných koncových bodů
    • James Forshaw-Black Hat USA 2012 – jste můj typ? Lámání .čistá Pískoviště Prostřednictvím Serializace
    • Jonathan Bříza BlueHat v17 – Nebezpečný Obsah – Zajištění .Net Rekonstrukci
    • Alvaro Muñoz & Oleksandr Mirosh – pátek 13: Útočí JSON – AppSecUSA 2017

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Přejít k navigační liště