iOS Serialisation and Encoding

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Codice e ulteriori informazioni su https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

Serializzazione degli oggetti nello sviluppo iOS

In iOS, la serializzazione degli oggetti consiste nella conversione degli oggetti in un formato che può essere facilmente memorizzato o trasmesso, e quindi nella loro ricostruzione da questo formato quando necessario. Due protocolli principali, NSCoding e NSSecureCoding, facilitano questo processo per le sottoclassi di Objective-C o NSObject, consentendo agli oggetti di essere serializzati in NSData, un formato che avvolge i buffer di byte.

Implementazione di NSCoding

Per implementare NSCoding, una classe deve ereditare da NSObject o essere contrassegnata come @objc. Questo protocollo richiede l'implementazione di due metodi per la codifica e la decodifica delle variabili di istanza:

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

Migliorare la sicurezza con NSSecureCoding

Per mitigare le vulnerabilità in cui gli attaccanti iniettano dati in oggetti già costruiti, NSSecureCoding offre un protocollo avanzato. Le classi che si conformano a NSSecureCoding devono verificare il tipo di oggetti durante la decodifica, garantendo che vengano istanziati solo gli oggetti di tipo previsto. Tuttavia, è importante notare che mentre NSSecureCoding migliora la sicurezza del tipo, non crittografa i dati o ne garantisce l'integrità, rendendo necessarie ulteriori misure per proteggere le informazioni sensibili:

static var supportsSecureCoding: Bool {
return true
}

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

Archiviazione dati con NSKeyedArchiver

NSKeyedArchiver e il suo controparte, NSKeyedUnarchiver, consentono di codificare gli oggetti in un file e successivamente recuperarli. Questo meccanismo è utile per persistere gli oggetti:

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

Utilizzo di Codable per la serializzazione semplificata

Il protocollo Codable di Swift combina Decodable e Encodable, facilitando la codifica e decodifica di oggetti come String, Int, Double, ecc., senza sforzo aggiuntivo:

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

Questo approccio supporta la serializzazione diretta in e da liste di proprietà e JSON, migliorando la gestione dei dati nelle applicazioni Swift.

Alternative di codifica JSON e XML

Oltre al supporto nativo, diverse librerie di terze parti offrono funzionalità di codifica/decodifica JSON e XML, ognuna con le proprie caratteristiche di prestazioni e considerazioni sulla sicurezza. È fondamentale selezionare attentamente queste librerie, specialmente per mitigare vulnerabilità come gli attacchi XXE (XML External Entities) configurando i parser per impedire l'elaborazione di entità esterne.

Considerazioni sulla sicurezza

Quando si serializzano dati, specialmente nel file system, è essenziale essere vigili sulla potenziale inclusione di informazioni sensibili. I dati serializzati, se intercettati o gestiti in modo improprio, possono esporre le applicazioni a rischi come azioni non autorizzate o perdita di dati. Si consiglia di crittografare e firmare i dati serializzati per migliorare la sicurezza.

Riferimenti

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated