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において、オブジェクトシリアル化は、オブジェクトを簡単に保存または送信できる形式に変換し、必要に応じてこの形式から再構築することを含みます。主に2つのプロトコル、**NSCodingNSSecureCodingが、Objective-CまたはNSObjectのサブクラスに対してこのプロセスを容易にし、オブジェクトをNSData**にシリアル化できるようにします。この形式はバイトバッファをラップします。

**NSCoding**の実装

NSCodingを実装するには、クラスがNSObjectから継承するか、@objcとしてマークされる必要があります。このプロトコルは、インスタンス変数のエンコードとデコードのために2つのメソッドの実装を義務付けています:

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を組み合わせており、StringIntDoubleなどのオブジェクトのエンコードとデコードを追加の手間なしに容易にします:

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

このアプローチは、プロパティリストとJSONへのシンプルなシリアル化をサポートし、Swiftアプリケーションにおけるデータ処理を強化します。

JSONとXMLエンコーディングの代替

ネイティブサポートに加えて、いくつかのサードパーティライブラリがJSONおよびXMLのエンコーディング/デコーディング機能を提供しており、それぞれに独自のパフォーマンス特性とセキュリティ上の考慮事項があります。特に、外部エンティティ処理を防ぐためにパーサーを設定することで、XXE(XML外部エンティティ)攻撃のような脆弱性を軽減するために、これらのライブラリを慎重に選択することが重要です。

セキュリティ上の考慮事項

データをシリアル化する際、特にファイルシステムへのシリアル化においては、機密情報が含まれる可能性に注意を払うことが不可欠です。シリアル化されたデータは、傍受されたり不適切に処理されたりすると、アプリケーションを不正な操作やデータ漏洩のリスクにさらす可能性があります。セキュリティを強化するために、シリアル化されたデータの暗号化と署名を推奨します。

参考文献

Support HackTricks

Last updated