Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ฝ”๋“œ ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด๋Š” 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

Swift์˜ Codable ํ”„๋กœํ† ์ฝœ์€ Decodable๊ณผ Encodable์„ ๊ฒฐํ•ฉํ•˜์—ฌ String, Int, Double ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์˜ ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉ์„ ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ ์—†์ด ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

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

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์†์„ฑ ๋ชฉ๋ก ๋ฐ JSON ๊ฐ„์˜ ๊ฐ„๋‹จํ•œ ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜์—ฌ Swift ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

JSON ๋ฐ XML ์ธ์ฝ”๋”ฉ ๋Œ€์•ˆ

๋„ค์ดํ‹ฐ๋ธŒ ์ง€์› ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ JSON ๋ฐ XML ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ณ ์œ ํ•œ ์„ฑ๋Šฅ ํŠน์„ฑ๊ณผ ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฉฐ, ํŠนํžˆ ์™ธ๋ถ€ ์—”ํ‹ฐํ‹ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ XXE (XML ์™ธ๋ถ€ ์—”ํ‹ฐํ‹ฐ) ๊ณต๊ฒฉ๊ณผ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ์™„ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ

๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•  ๋•Œ, ํŠนํžˆ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์ง๋ ฌํ™”ํ•  ๋•Œ๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๋กœ์ฑ„์ด๊ฑฐ๋‚˜ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฌด๋‹จ ์ž‘์—…์ด๋‚˜ ๋ฐ์ดํ„ฐ ์œ ์ถœ๊ณผ ๊ฐ™์€ ์œ„ํ—˜์— ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  ์„œ๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธํ—Œ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ