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

88 lines
6.1 KiB
Markdown
Raw Normal View History

{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
Código y más información en [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](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:
2023-06-05 18:33:24 +00:00
```swift
class CustomPoint: NSObject, NSCoding {
var x: Double = 0.0
var name: String = ""
2023-06-05 18:33:24 +00:00
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)
}
2023-06-05 18:33:24 +00:00
}
```
### **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:
2023-06-05 18:33:24 +00:00
```swift
static var supportsSecureCoding: Bool {
return true
2023-06-05 18:33:24 +00:00
}
let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey")
2023-06-05 18:33:24 +00:00
```
## 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:
2023-06-05 18:33:24 +00:00
```swift
NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? CustomPoint
2023-06-05 18:33:24 +00:00
```
### 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:
2023-06-05 18:33:24 +00:00
```swift
struct CustomPointStruct: Codable {
var x: Double
var name: String
2023-06-05 18:33:24 +00:00
}
```
Este enfoque admite la serialización directa hacia y desde listas de propiedades y JSON, mejorando el manejo de datos en aplicaciones Swift.
2023-06-05 18:33:24 +00:00
## 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.
2023-06-05 18:33:24 +00:00
### 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.
2023-06-05 18:33:24 +00:00
## Referencias
* [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence)
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary>Support HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}