hacktricks/mobile-pentesting/ios-pentesting/ios-serialisation-and-encoding.md

6.1 KiB

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Código y más información en https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

Serialización de Objetos en el Desarrollo de iOS

En iOS, la serialización de objetos implica convertir objetos en un formato que se puede almacenar o transmitir fácilmente, y luego reconstruirlos a partir de este formato cuando sea necesario. Dos protocolos principales, NSCoding y NSSecureCoding, facilitan este proceso para Objective-C o subclases de NSObject, permitiendo que los objetos se serialicen en NSData, un formato que envuelve búferes de bytes.

Implementación de NSCoding

Para implementar NSCoding, una clase debe heredar de NSObject o estar marcada como @objc. Este protocolo exige la implementación de dos métodos para codificar y decodificar variables de instancia:

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

Mejorando la Seguridad con NSSecureCoding

Para mitigar vulnerabilidades donde los atacantes inyectan datos en objetos ya construidos, NSSecureCoding ofrece un protocolo mejorado. Las clases que cumplen con NSSecureCoding deben verificar el tipo de objetos durante la decodificación, asegurando que solo se instancien los tipos de objetos esperados. Sin embargo, es crucial notar que, aunque NSSecureCoding mejora la seguridad de tipos, no cifra los datos ni garantiza su integridad, lo que requiere medidas adicionales para proteger la información sensible:

static var supportsSecureCoding: Bool {
return true
}

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

Archivado de Datos con NSKeyedArchiver

NSKeyedArchiver y su contraparte, NSKeyedUnarchiver, permiten codificar objetos en un archivo y recuperarlos más tarde. Este mecanismo es útil para persistir objetos:

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

Usando Codable para Serialización Simplificada

El protocolo Codable de Swift combina Decodable y Encodable, facilitando la codificación y decodificación de objetos como String, Int, Double, etc., sin esfuerzo adicional:

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

Este enfoque admite la serialización directa hacia y desde listas de propiedades y JSON, mejorando el manejo de datos en aplicaciones Swift.

Alternativas de Codificación JSON y XML

Más allá del soporte nativo, varias bibliotecas de terceros ofrecen capacidades de codificación/decodificación JSON y XML, cada una con sus propias características de rendimiento y consideraciones de seguridad. Es imperativo seleccionar cuidadosamente estas bibliotecas, especialmente para mitigar vulnerabilidades como ataques XXE (XML External Entities) configurando los analizadores para prevenir el procesamiento de entidades externas.

Consideraciones de Seguridad

Al serializar datos, especialmente en el sistema de archivos, es esencial estar atento a la posible inclusión de información sensible. Los datos serializados, si son interceptados o manejados de manera inapropiada, pueden exponer a las aplicaciones a riesgos como acciones no autorizadas o filtraciones de datos. Se recomienda cifrar y firmar los datos serializados para mejorar la seguridad.

Referencias

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}