iOS Serialisation and Encoding

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Code et plus d'informations sur https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

Sérialisation d'objets dans le développement iOS

En iOS, la sérialisation d'objets consiste à convertir des objets dans un format pouvant être facilement stocké ou transmis, puis à les reconstruire à partir de ce format en cas de besoin. Deux protocoles principaux, NSCoding et NSSecureCoding, facilitent ce processus pour les sous-classes Objective-C ou NSObject, permettant aux objets d'être sérialisés en NSData, un format qui enveloppe des tampons d'octets.

Implémentation de NSCoding

Pour implémenter NSCoding, une classe doit hériter de NSObject ou être marquée comme @objc. Ce protocole exige l'implémentation de deux méthodes pour encoder et décoder les variables d'instance :

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)
}
}

Améliorer la sécurité avec NSSecureCoding

Pour atténuer les vulnérabilités où les attaquants injectent des données dans des objets déjà construits, NSSecureCoding offre un protocole amélioré. Les classes conformes à NSSecureCoding doivent vérifier le type d'objets lors du décodage, garantissant que seuls les types d'objets attendus sont instanciés. Cependant, il est crucial de noter que bien que NSSecureCoding améliore la sécurité des types, il n'encrypte pas les données ou n'assure pas leur intégrité, nécessitant des mesures supplémentaires pour protéger les informations sensibles:

static var supportsSecureCoding: Bool {
return true
}

let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey")

Archivage de données avec NSKeyedArchiver

NSKeyedArchiver et son homologue, NSKeyedUnarchiver, permettent d'encoder des objets dans un fichier et de les récupérer ultérieurement. Ce mécanisme est utile pour persister des objets :

NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? CustomPoint

Utilisation de Codable pour une sérialisation simplifiée

Le protocole Codable de Swift combine Decodable et Encodable, facilitant l'encodage et le décodage d'objets tels que String, Int, Double, etc., sans effort supplémentaire :

struct CustomPointStruct: Codable {
var x: Double
var name: String
}

Cet approche prend en charge la sérialisation simple vers et depuis des listes de propriétés et du JSON, améliorant la manipulation des données dans les applications Swift.

Alternatives d'encodage JSON et XML

Au-delà du support natif, plusieurs bibliothèques tierces offrent des capacités d'encodage/décodage JSON et XML, chacune avec ses propres caractéristiques de performance et considérations de sécurité. Il est impératif de sélectionner soigneusement ces bibliothèques, en particulier pour atténuer les vulnérabilités telles que les attaques XXE (Entités Externes XML) en configurant les analyseurs pour empêcher le traitement des entités externes.

Considérations de sécurité

Lors de la sérialisation des données, en particulier vers le système de fichiers, il est essentiel de rester vigilant quant à l'éventuelle inclusion d'informations sensibles. Les données sérialisées, si elles sont interceptées ou mal gérées, peuvent exposer les applications à des risques tels que des actions non autorisées ou des fuites de données. Il est recommandé de chiffrer et de signer les données sérialisées pour renforcer la sécurité.

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour