hacktricks/mobile-pentesting/ios-pentesting/ios-serialisation-and-encoding.md
2024-02-11 01:46:25 +00:00

6.2 KiB

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Kod i więcej informacji na stronie https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

Serializacja obiektów w rozwoju iOS

W iOS, serializacja obiektów polega na konwertowaniu obiektów na format, który można łatwo przechowywać lub przesyłać, a następnie odtwarzaniu ich z tego formatu, gdy są potrzebne. Dwa główne protokoły, NSCoding i NSSecureCoding, ułatwiają ten proces dla klas Objective-C lub NSObject, pozwalając na serializację obiektów do formatu NSData, który zawiera bufor bajtów.

Implementacja NSCoding

Aby zaimplementować NSCoding, klasa musi dziedziczyć po NSObject lub być oznaczona jako @objc. Ten protokół wymaga implementacji dwóch metod do kodowania i dekodowania zmiennych instancji:

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

Wzmacnianie bezpieczeństwa za pomocą NSSecureCoding

Aby złagodzić podatności, w których atakujący wstrzykują dane do już skonstruowanych obiektów, NSSecureCoding oferuje ulepszony protokół. Klasy zgodne z NSSecureCoding muszą zweryfikować typ obiektów podczas dekodowania, zapewniając, że są tworzone tylko oczekiwane typy obiektów. Jednak ważne jest zauważenie, że chociaż NSSecureCoding zwiększa bezpieczeństwo typów, nie szyfruje danych ani nie zapewnia ich integralności, co wymaga dodatkowych środków ochrony poufnych informacji:

static var supportsSecureCoding: Bool {
return true
}

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

Archiwizacja danych za pomocą NSKeyedArchiver

NSKeyedArchiver i jego odpowiednik, NSKeyedUnarchiver, umożliwiają kodowanie obiektów do pliku i późniejsze ich odtworzenie. Mechanizm ten jest przydatny do trwałego przechowywania obiektów:

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

Używanie Codable do uproszczonej serializacji

Protokół Codable w języku Swift łączy Decodable i Encodable, ułatwiając kodowanie i dekodowanie obiektów takich jak String, Int, Double, itp., bez dodatkowego wysiłku:

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

To podejście obsługuje proste serializowanie do i z listy właściwości oraz JSON, poprawiając obsługę danych w aplikacjach Swift.

Alternatywy dla kodowania JSON i XML

Oprócz natywnej obsługi, istnieje kilka bibliotek innych firm, które oferują możliwość kodowania/odkodowywania JSON i XML, z różnymi charakterystykami wydajnościowymi i uwzględniającymi bezpieczeństwo. Ważne jest dokładne wybieranie tych bibliotek, zwłaszcza w celu zminimalizowania podatności na ataki XXE (XML External Entities) poprzez konfigurację parserów w celu zapobiegania przetwarzaniu zewnętrznych jednostek.

Uwagi dotyczące bezpieczeństwa

Podczas serializowania danych, zwłaszcza do systemu plików, ważne jest zachowanie czujności wobec potencjalnego uwzględnienia poufnych informacji. Serializowane dane, jeśli zostaną przechwycone lub nieprawidłowo obsłużone, mogą narazić aplikacje na ryzyko takie jak nieautoryzowane działania lub wyciek danych. Zaleca się szyfrowanie i podpisywanie serializowanych danych w celu poprawy bezpieczeństwa.

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: