Johdanto¶
Tämä artikkeli on keskittynyt tarjoamaan selkeitä, käytännöllisiä ohjeita turvallisesti android epäluotettavia tietoja oman sovelluksia.
Mikä on Deserialization¶
Serialization on prosessi kääntää joitakin objektin tiedot muotoon, joka voidaan palauttaa myöhemmin. Ihmiset usein sarjallistavat esineitä tallentaakseen ne varastoon tai lähettääkseen osana viestintää.,
Deserialization on käänteinen, että prosessi, jossa tiedot jäsennelty joitakin muoto, ja uudelleenrakentaminen sen objektin. Nykyään suosituin sarjatiedon tietomuoto on JSON. Sitä ennen se oli XML.
kuitenkin monet ohjelmointikielet tarjoavat natiivin kyvyn sarjallistamiseen. Nämä native-formaatit tarjoavat yleensä enemmän ominaisuuksia kuin JSON tai XML, mukaan lukien muokattavuutta ja serialization prosessi.
Valitettavasti nämä ominaisuudet native deserialization mekanismeja voidaan repurposed haitallista vaikutusta, kun toiminta perustuu luotettaviin tietoihin., Deserializereihin kohdistuvien hyökkäysten on todettu mahdollistavan palvelunestohyökkäykset, kulunvalvonnan ja etäkoodin suorittamisen (RCE).
Ohjeet Android Esineitä Turvallisesti¶
seuraavat kieli-erityisiä ohjeita yrittää luetella turvallinen menetelmien android tietoja, jotka ei voi luottaa.
PHP – ¶
WhiteBox Arvostelu¶
Tarkista käyttö unserialize () – toimintoa ja tarkastella sitä, miten ulkoiset parametrit hyväksytään., Käyttää turvallisia, standard data interchange format, kuten JSON (via json_decode()
ja json_encode()
), jos sinun täytyy siirtää serialized tiedot käyttäjälle.
Python¶
BlackBox Arvostelu¶
Jos liikennetietoja sisältää symboli piste .
lopussa, se on hyvin todennäköistä, että tiedot lähetettiin serialization.
WhiteBox Review¶
Pythonin seuraava API on altis serialisaatiohyökkäykselle. Etsi koodi kuvio alla.,
- käyttää
pickle/c_pickle/_pickle
load/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- Käyttää
PyYAML
load
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- Käyttää
jsonpickle
encode
taistore
menetelmiä.
Java – ¶
seuraava tekniikoita ovat kaikki hyviä estämään hyökkäyksiä vastaan deserialization vastaan Javan Serializable-muodossa.,
Täytäntöönpanon neuvoja:
- koodissa, korvata
ObjectInputStream#resolveClass()
tapa estää mielivaltainen luokat olemasta deserialized. Tämä turvallinen käytös voidaan kääriä kirjastoon kuten SerialKiller. - Käytä turvallinen korvaaja geneerinen
readObject()
menetelmä katsottuna täällä. Huomaa, että tämä osoitteet ”miljardi nauraa” tyyppi hyökkäyksiä tarkistamalla tulo pituus ja määrä esineitä deserialized.
WhiteBox Arvostelu¶
Ole tietoinen seuraavista Java API käyttää mahdollisten serialization haavoittuvuus.,
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 voi ehdottaa, että tiedot lähetetään Java serialization virrat
-
AC ED 00 05
Hex -
rO0
Base64 -
Content-type
header HTTP-vastauksen asetettuapplication/x-java-serialized-object
Estää Tietojen Vuotaminen ja Luotettavien Alan Clobbering¶
Jos on olemassa tietoja jäsenten esine, joka pitäisi koskaan olla määräysvallassa loppukäyttäjiä aikana deserialization tai alttiina aikana käyttäjiä serialization, ne olisi julistettava transient
avainsana (kohta Suojella Arkaluonteisia Tietoja).,
– luokan, joka on määritelty Serializable, arkaluonteisia tietoja muuttuja olisi julistettava private transient
.
esimerkiksi luokan myAccount-tilille, muuttujan ’voitto’ ja ’marginaali’ oli ilmoitettu ohimeneviä välttää sarjoitettava:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
Estää Deserialization Verkkotunnuksen Esineitä¶
Jotkut hakemuksesi esineitä voi olla pakko toteuttaa Serializable, koska niiden hierarkia., Taata, että hakemuksesi esineitä voi olla deserialized, a readObject()
menetelmä olisi julistettava (jossa final
modifier), joka aina heittää poikkeus:
Harden Oman java.io.ObjectInputStream¶
java.io.ObjectInputStream
luokan käytetään deserialize esineitä. Sen käyttäytymistä on mahdollista kovettaa alikersanteilla., Tämä on paras ratkaisu, jos:
- Voit muuttaa koodia, joka ei deserialization
- Et tiedä, mitä luokat sinun odottaa deserialize
yleinen ajatus on korvata ObjectInputStream.html#resolveClass()
rajoittamiseksi jossa luokat voivat olla deserialized.
Koska tämä puhelu tapahtuu ennen readObject()
kutsutaan, voit olla varma, että ei deserialization toiminta tapahtuu, jos tyyppi on sellainen, jonka haluat sallia.,
yksinkertainen esimerkki tästä kuvassa, jossa LookAheadObjectInputStream
luokka on taattu ei deserialize mikä tahansa muu paitsi Bicycle
class:
Lisää loppuun toteutukset tämä lähestymistapa on ehdottanut yhteisön eri jäsenet:
- NibbleSec – kirjasto, joka mahdollistaa whitelisting ja mustalle listalle luokkia, jotka voivat olla deserialized
- IBM – uraauurtava suojaa, kirjoitettu vuotta ennen tuhoisin hyödyntämisen skenaariot olivat visioi.,
- Apache Commons-IO-luokat
Harden Kaikki java.io.ObjectInputStream Käyttö Agentti¶
Kuten edellä mainittiin, java.io.ObjectInputStream
luokan käytetään deserialize esineitä. Sen käyttäytymistä on mahdollista kovettaa alikersanteilla. Kuitenkin, jos et omista koodi tai voi odottaa laastari, käyttäen agentti kutoa karkaisu java.io.ObjectInputStream
on paras ratkaisu.,
Globaalisti muuttuvassa ObjectInputStream
on vain turvallista mustalle listalle tunnettujen haittaohjelmien tyyppejä, koska se ei ole mahdollista tietää kaikkia sovelluksia, mitä odotettavissa luokkien deserialized ovat. Onneksi, on olemassa hyvin vähän luokkia tarvitaan blacklist olla turvassa kaikki tunnettuja hyökkäystapoja, tänään.
on väistämätöntä, että löydetään lisää ”gadget” – luokkia, joita voidaan käyttää väärin. On kuitenkin uskomattoman paljon haavoittuvia ohjelmistoja altistuvat tänään, tarvitsevat korjata., Joissakin tapauksissa, ”e” haavoittuvuus voi liittyä uudelleen architecting messaging-järjestelmät ja breaking taaksepäin yhteensopivuus kehittäjinä kohti hyväksy sarjoittaa esineitä.
Jotta nämä aineet, yksinkertaisesti lisätä uuden JVM parametri:
-javaagent:name-of-agent.jar
– Aineet ottaen tämä lähestymistapa on julkaistu eri yhteisöjen jäseniä:
- rO0 sen Sijaan Turvallisuus
samanlainen, mutta vähemmän skaalautuva lähestymistapa olisi manuaalisesti laastari ja bootstrap JVM on ObjectInputStream. Ohjeita tähän lähestymistapaan on saatavilla täältä.
.,Net CSharp¶
WhiteBox Arvostelu¶
Haku lähdekoodin seuraavasti:
TypeNameHandling
JavaScriptTypeResolver
Etsiä mitään serializers, jossa tyyppi on asetettu käyttäjän hallinnassa muuttuja.,
BlackBox Arvostelu¶
Hae seuraavat base64-koodattu sisältö, joka alkaa näin:
AAEAAAD/////
Hae sisältöä, jossa on seuraava teksti:
TypeObject
$type:
Yleiset Varotoimet¶
Älä anna datastream määrittää objektin tyypin, että virta on deserialized mukaan. Voit estää tämän ottamalla esimerkiksi käyttämällä DataContractSerializer
tai XmlSerializer
jos suinkin mahdollista.,
Jossa JSON.Net
käytetään varmista, että TypeNameHandling
vain None
.
TypeNameHandling = TypeNameHandling.None
– Jos JavaScriptSerializer
käytetään niin älä käytä se JavaScriptTypeResolver
.
Jos sinun täytyy deserialisoida tietovirrat, jotka määrittelevät oman tyyppinsä, rajoita niiden tyyppien käyttöä, jotka on sallittu deserialisoida. Pitäisi olla tietoinen siitä, että tämä on edelleen riskialtista kuin monet native.Net tyypit mahdollisesti vaarallisia itsessään. esim.,
System.IO.FileInfo
FileInfo
esineitä, jotka viittaavat tiedostot itse palvelimella voi kun deserialized, muuttaa ominaisuuksia ne tiedostot, esim. read-only, luoda mahdollisuuksia denial of service hyökkäys.
vaikka olet rajoittanut niitä tyyppejä, jotka voidaan deserialisoida, muista, että joillakin tyypeillä on riskialttiita ominaisuuksia. System.ComponentModel.DataAnnotations.ValidationException
esimerkiksi on ominaisuus Value
tyyppi Object
., jos tämä tyyppi on tyyppi, sallittu deserialization sitten hyökkääjä voi asettaa Value
omaisuutta objektin tyyppi he valitsevat.
hyökkääjiä tulisi estää ohjaamasta asennettavaa tyyppiä. Jos tämä on mahdollista niin jopa DataContractSerializer
tai XmlSerializer
voidaan kumota esim.
// 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);
Toteutus voi esiintyä tiettyjä .Net tyypit aikana deserialization. Alla olevan kaltaisen kontrollin luominen on tehotonta.,
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}
Esimerkiksi BinaryFormatter
ja JSON.Net
on mahdollista luoda turvallisempi muoto valkoinen lista hallita käyttämällä mukautettua SerializationBinder
.
yritä pysyä ajan tasalla tiedossa.Net epävarma deserialization vempaimia ja kiinnittää erityistä huomiota, jos tällaiset tyypit voidaan luoda teidän deserialization prosesseja. Deserializer voi vain instantiate tyypit, että se tietää.
yritä pitää kaikki koodi, joka saattaa luoda potentiaalisia vempaimia erillään mistään koodista, jolla on internetyhteys., Esimerkkinä System.Windows.Data.ObjectDataProvider
WPF-sovelluksissa käytetty vempain on tunnettu vempain, joka mahdollistaa mielivaltaisen metodihyökkäyksen. Olisi riskialtista, jos tämä viittaisi tähän kokoonpanoon LEPOPALVELUPROJEKTISSA, joka karsii epäluotettavia tietoja.
tunnettu .,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., Vaihtamalla puhdasta tiedot muodossa, kuten JSON tai XML, voit vähentää mahdollisuutta custom deserialization logiikka on repurposed kohti ilkeä päättyy.
monet sovellukset luottavat tiedonsiirtoobjektikuvioon, johon kuuluu erillisen objektien verkkotunnuksen luominen eksplisiittistä tarkoitusta varten tapahtuvaa tiedonsiirtoa varten. Toki on edelleen mahdollista, että sovellus tekee tietoturvavirheitä puhtaan dataobjektin jäsentämisen jälkeen.,
Vain Deserialize Allekirjoitettu Data¶
Jos sovellus tietää ennen deserialization, mitkä viestit tulee käsitellä, he voivat allekirjoittaa ne osana serialization prosessi. Sovellus voi sitten valita olla deserialize mitään viestiä, joka ei ole aito allekirjoitus.,
Lieventävät Työkaluja/Kirjastoja¶
- Java secure deserialization kirjasto
- SWAT (Serial Whitelist Sovellus Kouluttaja)
- NotSoSerial
Havaitseminen Työkaluja¶
- Java deserialization huijata arkin, jolla pyritään kynä testaajat
- proof-of-concept työkalu tuottaa hyötykuormia, jotka hyödyntävät vaarallinen Java-objekti deserialization.
- Java-De-serialization työkaluja
- Java-de-serialization työkalu
- .,n
- JavaSerialKiller
- Java Deserialization Scanner
- Röyh-ysoserial
- SuperSerial
- SuperSerial-Aktiivinen
Viitteet¶
- Java-Deserialization-Huijata Arkin
- Deserialization epäluotettava data
- Java Deserialization Hyökkäyksiä – saksan OWASP Päivä 2016
- AppSecCali 2015 – Opastaminen Suolakurkkua
- FoxGlove Security – Haavoittuvuuden Julkistuksen
- Java deserialization huijata arkin, jolla pyritään kynä testaajat
- proof-of-concept työkalu tuottaa hyötykuormia, jotka hyödyntävät vaarallinen Java-objekti deserialization.,
- Java-De-serialization työkaluja
- Java-de-serialization työkalu
- Burp Suite-tiedostotunnistetta
- Java secure deserialization kirjasto
- Serianalyzer on staattinen bytecode analysaattori deserialization
- Kantavuus generaattori
- Android Java Deserialization Haavoittuvuus Testaaja
- Burp Suite-Tiedostotunnistetta
- JavaSerialKiller
- Java Deserialization Scanner
- Röyh-ysoserial
- SuperSerial
- SuperSerial-Aktiivinen
- .Net
- Alvaro Muñoz: .,NET Serialization: Havaita ja puolustaa haavoittuva päätepisteet
- James Forshaw – Black Hat USA 2012 – Oletko Minun tyyppiäni? Rikkomatta .net Sandboxien Kautta Serialization
- Jonathan Koivu BlueHat v17 – Vaarallinen Sisältö – Turvaaminen .Net Deserialization
- Alvaro Muñoz & Oleksandr Mirosh – perjantai 13: Hyökkää JSON – AppSecUSA 2017