iOS Serialisation and Encoding

Support HackTricks

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

Swift의 Codable 프로토콜은 DecodableEncodable을 결합하여 String, Int, Double 등과 같은 객체의 인코딩 및 디코딩을 추가적인 노력 없이 용이하게 합니다:

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

이 접근 방식은 속성 목록 및 JSON으로의 간단한 직렬화를 지원하여 Swift 애플리케이션의 데이터 처리를 향상시킵니다.

JSON 및 XML 인코딩 대안

네이티브 지원 외에도 여러 서드파티 라이브러리가 JSON 및 XML 인코딩/디코딩 기능을 제공하며, 각 라이브러리는 고유한 성능 특성과 보안 고려 사항을 가지고 있습니다. 이러한 라이브러리를 신중하게 선택하는 것이 중요하며, 특히 외부 엔티티 처리를 방지하기 위해 파서를 구성하여 XXE(XML External Entities) 공격과 같은 취약점을 완화해야 합니다.

보안 고려 사항

데이터를 직렬화할 때, 특히 파일 시스템으로 직렬화할 때는 민감한 정보가 포함될 가능성에 대해 경계를 유지하는 것이 필수적입니다. 직렬화된 데이터는 가로채이거나 부적절하게 처리될 경우 애플리케이션을 무단 작업이나 데이터 유출과 같은 위험에 노출시킬 수 있습니다. 보안을 강화하기 위해 직렬화된 데이터를 암호화하고 서명하는 것이 권장됩니다.

References

Support HackTricks

Last updated