Serializálás

Az IT , a sorszámozás (az amerikai angol serialization ) a kódolás az információ, mint eredményeként kisebb információkat (úgynevezett atomi lásd etimológiáját atom ) például a biztonsági mentés ( perzisztencia ), illetve szállítása a hálózaton ( proxy , RPC …). A viszonossági tevékenységet, amelynek célja ennek a szekvenciának a dekódolása az eredeti információ pontos másolatának létrehozása érdekében, deserializációnak (vagy letörlésnek ) nevezzük .

A rendezés (mobilizálás, csatornázás, szervezés) kifejezést gyakran szinonimákként használják, csakúgy, mint a linearizációt . A rendezés és a lebontás kifejezéseket leggyakrabban a számítógépes programok közötti csere összefüggésében használják , míg a sorozatosítás és a deserializáció kifejezés általánosabb.

A megjelenés egyszerű, ezek a műveletek valójában bizonyos számú problémát vetnek fel, például az objektumok közötti referenciák kezelése vagy a kódolások hordozhatósága. Ezenkívül a különféle sorosítási technikák közötti választás befolyásolja a teljesítmény kritériumait, például a sorosított bájt karakterláncok méretét vagy feldolgozásuk sebességét.

Kontextus

Mint sok algoritmikus választásnál, minél specializáltabb a sorosítási mechanizmus egy adott adattípusra, annál jobban fog teljesíteni. Például, ha csak tíz számot akar átadni, amelyek értéke 0 és 255 között van, akkor elegendő számenként 1 bájt. Ha viszont a továbbítandó objektumok mennyisége nem ismert előre, akkor egy vagy több további bájtot kell megadni ennek a mennyiségnek a továbbítására. Ha ezenkívül nem csak egész számokat, hanem bármely objektumot akar továbbítani, akkor meg kell tervezni, hogy társítsuk hozzájuk azokat az információkat, amelyek lehetővé teszik az egyes objektumok pontos típusának kódolását.

Általánosabban meg kell adni a priori a deszerializáció idején rendelkezésre álló erőforrásokat, hogy meghatározzuk az egyszerű referencia segítségével rekonstruálható információkat és azokat, amelyeket kódolni szükséges. Ez a helyzet például a PDF fájlban található betűtípusokkal  : attól függően, hogy az összes gépen a megjelenítés pontosságát vagy a létrehozott fájl méretét szeretné-e előnyben részesíteni, lehetőség van a telek teljes meghatározásának továbbítására karaktereket, vagy egyszerűen továbbítja a betűtípus nevét és néhány egyéb alapvető jellemzőt, a célgépekre bízva, hogy megtalálja a legmegfelelőbb betűtípust az elérhetőek között.

Végül vannak olyan információk, amelyek természete nem teszi lehetővé sorosítást, és amelyeket úgyis rekonstruálni kell. Ez a helyzet például egy fájlleíróval . Egyik gépről a másikra, sőt, ugyanazon a gépen a program egyik végrehajtásától a másikig, ezeket a leírásokat az operációs rendszer önkényesen hozzárendeli  : nincs értelme sorosítani a tartalmukat, és ehelyett olyan információkat kell kódolni, amelyek lehetővé teszi a deszerializáció során történő rekonstruálását (például a leírón keresztül elérhető fájl teljes neve ). Egy másik tipikus eset a mutatók sorosítása , amely egy speciális technika tárgya: a mutatók mutációja  (be) ( angolul  : swizzling ).

Kódolás

Az alapvető választás a bináris és a szöveges formátum között van  :

Bináris kódolások

A bináris kódolások egyik korlátja a hordozhatóság. Például egy olyan gépnek, amely más processzor-modellt használ, mint az eredeti számítógép, képesnek kell lennie az adatblokk deserializálására, figyelembe véve az adatok összehangolásának és végességének problémáit . Ezért, még akkor is, ha az objektumnak nincsenek mutatói, az objektum memóriájának ujjlenyomatának egyszerű másolása általában nem elfogadható megoldás.

Ezért itt is szükség van hagyományos kódolások használatára. Elég gyakori a következő konvenciók használata: nincs igazítás; a C egész számok memóriaterületük szerinti kódolása, mind nagy endián formátumban , a lebegőpontos számok az IEEE 754 szabványt használják .

Az olyan protokollok, mint a CORBA GIOP vagy a Java RMI , mind bináris kódolásokat használnak.

Szöveges kódolások

A szöveges kódolás definiálásához meg kell választani egy protokollt a mezők elválasztására, a bináris adatok kódolására (például uuencode , base64 vagy nem ASCII karakterek elkerülése ) ...

Viszonylag gyakori volt az XML formátum származékának használata . 2019-ben a leggyakoribb szövegkódolási formátum a JSON .

Az XML szöveges fájlokon alapuló protokollok a SOAP , a FIX és az XML-RPC . A SOAP bináris formátumot közös adatábrázolásnak hívják .

A PHP sorosítása egy meghatározott formátumot használ.

Internet sorosítás és kódolás

A szöveges fájlok átvitele az Internet megjelenésével utat engedett az ügyfél / szerver protokolloknak, amelyek osztályok formájában kezelik az adatátvitelt. A korábbi ügyfeleknek korlátozott méretű és eredetű sütik voltak . Az objektumok a cookie-k evolúcióját jelentik, és menthetők is a webböngésző munkaterületébe.

Egy atomi objektum sorosítása

Az atomi objektum olyan tárgy, amely nem hivatkozik más objektumokra.

Objektumtípus

A nyelv lehetőségeitől függően az újraélesztés a nyelv vagy egy adott gyár által biztosított metaklass mechanizmust alkalmazhatja . Minden esetben meg kell őrizni azokat az információkat, amelyek lehetővé teszik a létrehozandó objektum típusának kiválasztását.

Ha a sorosítandó objektumtípusok száma előre ismert, a típusinformáció nagyon kompaktan kódolható (például egyetlen bájton, ha nem haladja meg a 256-ot).

Ellenkező esetben szükség lesz olyan konvenciók használatára, mint például a Java nyelvi csomagok . Mivel ezek a hagyományos nevek nagyok lehetnek, hasznos lehet egy álnévmechanizmus létrehozása az ismétlések elkerülése érdekében több azonos típusú objektum feldolgozása során.

A kódolt típust megvalósító kód közvetlen továbbítása is lehetséges. Ez a helyzet például a Python nyelv szabványos könyvtárának marsall moduljával , és ez egy olyan mechanizmus, amelyet általában minden értelmezett nyelv támogat, támogatva a bájtkódjuk gyorsítótárát .

Adat

Minden adattípus felelős a tagadatok archiválásáért és visszaállításáért. Összetett típusoknál ez magában foglalja az egyes mezők sorosítását előre meghatározott sorrendben.

Hierarchikus típusok

Az objektum-orientált programozás során az alaptípus által kezelt adatokat fel kell dolgozni, mielőtt a levezetett típus adatait archiválnánk.

Objektumdiagram böngészése

Ez egy meglehetősen gyakori probléma, amelyet például akkor találunk meg, amikor megpróbálunk klónozni vagy szemetet gyűjteni .

Többé-kevésbé hatékony algoritmusok választhatók a gráf topológiáján elvégezhető a priori szerint:

Kézi útvonal

Általános esetben a bejárt objektumok memorizálása szükséges a ciklusok felismerése érdekében.

Nem jó ötlet, ha magukat az objektumokat mutatják meg látogatott állapotukra:

Előnyösebb egy hash-tábla (az objektum címe, számláló) használata, amelyet szintén használnak a mutatómutáció megvalósítására. Ezután ügyelni kell az egyes objektumok megtartására, hogy elkerüljük a címek ütközését az új objektumokkal.

Utazás önvizsgálattal

Az önvizsgálatot támogató nyelvek alapértelmezés szerint szerializációs mechanizmust biztosíthatnak.

Deserializáció

A deszerializáció számos kérdést felvet, például egy megváltoztathatatlan tárgy újraélesztését . Az objektumok nem használhatók a deserializáció során.

A deszerializáció tipizáló biztonsági problémákat is felvet .

Biztonság

A biztonsági problémák elkerülése érdekében a sorosítást és különösen a dezerializációt nagy körültekintéssel kell alkalmazni.

Megbízhatatlan adatok deszerializálása

A támadó, aki ellenőrzi az alkalmazáshoz továbbított adatokat, majd deszerializálja, tulajdonképpen saját objektumait is befecskendezheti az alkalmazásba. A rendelkezésre álló osztályoktól és a deszerializált adatokhoz felhasznált módszerektől függően a kockázatok a kényes adatok nyilvánosságra hozatalától az önkényes kód futtatásáig terjednek.

Az ilyen típusú biztonsági réseket a CWE-502 kategóriába sorolják. Habár kevesebb a sebezhetőség, mint más típusú sebezhetőség, 2020 elején mégis 252 jelent meg.

A bizalmas adatok sorosítása

Ezzel szemben egy támadó, aki megszerezheti a bizalmas adatokat tartalmazó osztályok deszerializációját, megszerezheti annak nyilvánosságra hozatalát. Ezeknek az osztályoknak ezért meg kell tiltaniuk sorosítást, vagy legalábbis meg kell védeniük az érzékeny adatokat a megfelelő módszerek túlterhelésével.

Ezek a biztonsági rések a CWE-499 kategóriába vannak csoportosítva.

Verziókezelés

Gyakran szükség van a visszamenőleges vagy a visszamenőleges kompatibilitás garantálására , vagyis az adatok újbóli elolvasására a szoftver új verziójával, vagy annak lehetővé tételével, hogy a szoftver egy régi verziója elolvassa a szoftver új verziójából létrehozott adatokat újabb verzió. Ehhez egyrészt egy verzióváltási módra van szükség, amely lehetővé teszi a kompatibilis verziók megismerését, másrészt pedig a legrégebbi verziók figyelmen kívül hagyja az általuk nem értelmezhető adatokat.

Alternatívák

A szerializálás atomi kódolási mechanizmus: nem célja, hogy hozzáférést engedélyezzen egy adathoz anélkül, hogy mindent dekódolna.

Egyes mechanizmusok, például a Kakaó Könyvtár NSKeyedArchiver , lehetővé teszik az objektumok részleges újraélesztését. Hasonlóak az adatbázis-rendszerekhez .

Megjegyzések és hivatkozások

  1. Marcelo d'Amorim , Hatékony explicit állapotú modellellenőrzés a dinamikusan allokált adatokkal rendelkező programok számára , ProQuest,2007( online olvasás )
  2. Deserialization Cheat Sheet az OWASP webhelyen: https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
  3. (en) AMFPHP .
  4. (en) openamf .
  5. (en) FlashORB .
  6. (en) FLAP .
  7. tbowan , „  Object delinearizálás és injekció  PHP, ” a Arsouyes.org (elérhető április 2, 2020 )
  8. "  CWE - CWE-502: A nem megbízható adatok deserializálása ( 4.0)  " , a cwe.mitre.org címen (hozzáférés : 2020. április 2. )
  9. "  CWE (Common Weakness Enumeration) 502-hez kapcsolódó CVE biztonsági rések  " , www.cvedetails.com (elérhető : 2020. április 2. )
  10. „  CWE - CWE-499: Serializálható osztály, amely érzékeny adatokat tartalmaz (4.0)  ” , a cwe.mitre.org oldalon (elérhető : 2020. április 2. )

Lásd is