iOS Serialisation and Encoding

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Código e mais informações em https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

Serialização de Objetos no Desenvolvimento iOS

No iOS, a serialização de objetos envolve a conversão de objetos em um formato que pode ser facilmente armazenado ou transmitido, e depois reconstruí-los a partir desse formato quando necessário. Dois protocolos principais, NSCoding e NSSecureCoding, facilitam esse processo para subclasses Objective-C ou NSObject, permitindo que objetos sejam serializados em NSData, um formato que envolve buffers de bytes.

Implementação de NSCoding

Para implementar NSCoding, uma classe deve herdar de NSObject ou ser marcada como @objc. Este protocolo exige a implementação de dois métodos para codificar e decodificar variáveis de instância:

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

Aprimorando a Segurança com NSSecureCoding

Para mitigar vulnerabilidades onde atacantes injetam dados em objetos já construídos, o NSSecureCoding oferece um protocolo aprimorado. Classes que se conformam com NSSecureCoding devem verificar o tipo de objetos durante a decodificação, garantindo que apenas os tipos de objetos esperados sejam instanciados. No entanto, é crucial observar que, enquanto o NSSecureCoding aprimora a segurança de tipos, ele não criptografa dados ou garante sua integridade, sendo necessárias medidas adicionais para proteger informações sensíveis:

static var supportsSecureCoding: Bool {
return true
}

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

Arquivamento de Dados com NSKeyedArchiver

NSKeyedArchiver e seu contraparte, NSKeyedUnarchiver, permitem codificar objetos em um arquivo e posteriormente recuperá-los. Esse mecanismo é útil para persistir objetos:

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

Usando Codable para Serialização Simplificada

O protocolo Codable do Swift combina Decodable e Encodable, facilitando a codificação e decodificação de objetos como String, Int, Double, etc., sem esforço adicional:

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

Esta abordagem suporta a serialização direta para e a partir de listas de propriedades e JSON, aprimorando o manuseio de dados em aplicativos Swift.

Alternativas de Codificação JSON e XML

Além do suporte nativo, várias bibliotecas de terceiros oferecem capacidades de codificação/decodificação JSON e XML, cada uma com suas próprias características de desempenho e considerações de segurança. É imperativo selecionar cuidadosamente essas bibliotecas, especialmente para mitigar vulnerabilidades como ataques XXE (Entidades Externas XML) configurando os analisadores para evitar o processamento de entidades externas.

Considerações de Segurança

Ao serializar dados, especialmente para o sistema de arquivos, é essencial estar atento à possível inclusão de informações sensíveis. Dados serializados, se interceptados ou manipulados de forma inadequada, podem expor aplicativos a riscos como ações não autorizadas ou vazamento de dados. Recomenda-se criptografar e assinar dados serializados para aumentar a segurança.

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Last updated