{{#include ../../banners/hacktricks-training.md}} Code und weitere Informationen unter [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence). ## Objektserialisierung in der iOS-Entwicklung In iOS umfasst **Objektserialisierung** die Umwandlung von Objekten in ein Format, das leicht gespeichert oder übertragen werden kann, und deren Rekonstruktion aus diesem Format bei Bedarf. Zwei Hauptprotokolle, **`NSCoding`** und **`NSSecureCoding`**, erleichtern diesen Prozess für Objective-C oder `NSObject`-Unterklassen, sodass Objekte in **`NSData`** serialisiert werden können, ein Format, das Byte-Puffer umschließt. ### **`NSCoding`** Implementierung Um `NSCoding` zu implementieren, muss eine Klasse von `NSObject` erben oder mit `@objc` gekennzeichnet sein. Dieses Protokoll verlangt die Implementierung von zwei Methoden zum Kodieren und Dekodieren von Instanzvariablen: ```swift class CustomPoint: NSObject, NSCoding { var x: Double = 0.0 var name: String = "" func encode(with aCoder: NSCoder) { aCoder.encode(x, forKey: "x") aCoder.encode(name, forKey: "name") } required convenience init?(coder aDecoder: NSCoder) { guard let name = aDecoder.decodeObject(forKey: "name") as? String else { return nil } self.init(x: aDecoder.decodeDouble(forKey: "x"), name: name) } } ``` ### **Sicherheit verbessern mit `NSSecureCoding`** Um Schwachstellen zu mindern, bei denen Angreifer Daten in bereits konstruierte Objekte injizieren, bietet **`NSSecureCoding`** ein verbessertes Protokoll. Klassen, die `NSSecureCoding` entsprechen, müssen den Typ der Objekte während der Dekodierung überprüfen, um sicherzustellen, dass nur die erwarteten Objekttypen instanziiert werden. Es ist jedoch wichtig zu beachten, dass, während `NSSecureCoding` die Typsicherheit verbessert, es keine Daten verschlüsselt oder deren Integrität gewährleistet, was zusätzliche Maßnahmen zum Schutz sensibler Informationen erforderlich macht: ```swift static var supportsSecureCoding: Bool { return true } let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey") ``` ## Datenarchivierung mit `NSKeyedArchiver` `NSKeyedArchiver` und sein Pendant, `NSKeyedUnarchiver`, ermöglichen das Kodieren von Objekten in eine Datei und das spätere Abrufen. Dieser Mechanismus ist nützlich, um Objekte zu persistieren: ```swift NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive") let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? CustomPoint ``` ### Verwendung von `Codable` für vereinfachte Serialisierung Das `Codable`-Protokoll von Swift kombiniert `Decodable` und `Encodable` und erleichtert das Kodieren und Dekodieren von Objekten wie `String`, `Int`, `Double` usw. ohne zusätzlichen Aufwand: ```swift struct CustomPointStruct: Codable { var x: Double var name: String } ``` Dieser Ansatz unterstützt eine unkomplizierte Serialisierung zu und von Property-Listen und JSON, was die Datenverarbeitung in Swift-Anwendungen verbessert. ## JSON- und XML-Codierungsalternativen Neben der nativen Unterstützung bieten mehrere Drittanbieter-Bibliotheken JSON- und XML-Codierungs-/Decodierungsfunktionen, jede mit ihren eigenen Leistungsmerkmalen und Sicherheitsüberlegungen. Es ist unerlässlich, diese Bibliotheken sorgfältig auszuwählen, insbesondere um Schwachstellen wie XXE (XML External Entities)-Angriffe zu mindern, indem Parser so konfiguriert werden, dass die Verarbeitung externer Entitäten verhindert wird. ### Sicherheitsüberlegungen Bei der Serialisierung von Daten, insbesondere zum Dateisystem, ist es wichtig, wachsam gegenüber der potenziellen Einbeziehung sensibler Informationen zu sein. Serialisierte Daten können, wenn sie abgefangen oder unsachgemäß behandelt werden, Anwendungen Risiken wie unbefugte Aktionen oder Datenlecks aussetzen. Es wird empfohlen, serialisierte Daten zu verschlüsseln und zu signieren, um die Sicherheit zu erhöhen. ## Referenzen - [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence) {{#include ../../banners/hacktricks-training.md}}