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

9.7 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 %}

Code and more information in https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/#object-persistence.

iOS рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди

iOS рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдЕрд░реНрде рд╣реИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХ рдРрд╕реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдлрд┐рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрдорд┐рдд рдХрд░рдирд╛ред рджреЛ рдореБрдЦреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓, NSCoding рдФрд░ NSSecureCoding, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ Objective-C рдпрд╛ NSObject рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ NSData рдореЗрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдЗрдЯ рдмрдлрд░ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред

NSCoding рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

NSCoding рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрдХреНрд╖рд╛ рдХреЛ NSObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ @objc рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдорд╛рдВрдЧ рдХрд░рддрд╛ рд╣реИ:

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

NSSecureCoding рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдирд╛

рд╣рдорд▓рд╛рд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, NSSecureCoding рдПрдХ рдЙрдиреНрдирдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред NSSecureCoding рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдХреЗрд╡рд▓ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЬрдмрдХрд┐ NSSecureCoding рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдпрд╣ рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХреА рдЕрдЦрдВрдбрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд╛рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

static var supportsSecureCoding: Bool {
return true
}

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

Data Archiving with NSKeyedArchiver

NSKeyedArchiver рдФрд░ рдЗрд╕рдХрд╛ рд╕рдордХрдХреНрд╖, NSKeyedUnarchiver, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рддрдВрддреНрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдпреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ:

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

Using Codable for Simplified Serialization

рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ Codable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ Decodable рдФрд░ Encodable рдХреЛ рдорд┐рд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ String, Int, Double рдЖрджрд┐ рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ JSON рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрди рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

JSON рдФрд░ XML рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк

рд╕реНрдерд╛рдиреАрдп рд╕рдорд░реНрдерди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп JSON рдФрд░ XML рдПрдиреНрдХреЛрдбрд┐рдВрдЧ/рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЪрдпрди рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ XXE (XML рдПрдХреНрд╕рдЯрд░реНрдирд▓ рдПрдВрдЯрд┐рдЯреАрдЬрд╝) рд╣рдорд▓реЛрдВ рдЬреИрд╕реА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдПрдВрдЯрд┐рдЯреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдирд╛ред

рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░

рдбреЗрдЯрд╛ рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬ рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рд╡реЗрд╢ рдХреЗ рдкреНрд░рддрд┐ рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдбреЗрдЯрд╛, рдпрджрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрдирдзрд┐рдХреГрдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдпрд╛ рдбреЗрдЯрд╛ рд▓реАрдХ рдЬреИрд╕реЗ рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рдкреНрд░рддрд┐ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдбреЗрдЯрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рд╛рдЗрди рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред

рд╕рдВрджрд░реНрдн

{% 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 %}