🤏
XCFrameworkを配布したらプライベートな情報がポロリしていた話
「フレームワーク更新したしバイナリ上げとこ〜」
「う〜ん?なんか差分が多いなぁ…えっ!?」
現象
Framework および、それを同梱する XCFramework に、開発者のプライベートな情報が混入してしまう。
具体的には、Framework を作る元になったソースコードのフルパスである。
つまり、コードがユーザーディレクトリ配下に置いてあれば、端末のアカウント名やリポジトリがまとめてあるパスをポロリしてしまう。
前提
- Xcode 14.0 以降
-
Swiftでコードを書いている -
XCFrameworkを生成し、配布している
詳細
具体的には、Example.framework/Modules/Example.swiftmodule/arm64-apple-ios.abi.json といった JSON ファイルが生成される。
そして、内容は以下のようになっている。
{
"ABIRoot": { /* ... */ },
"ConstValues": [
{
"filePath": "/Users/username/path/to/SourceFile.swift",
"kind": "IntegerLiteral",
"length": 1,
"offset": 123,
"value": "0"
},
// ...
]
}
- バイナリサイズが変わり、多数の設定値のオフセットも発覚した
- 定数が記述されているソースコードについて、Framework開発者の環境のフルパスが出力されている
- 配布されたFrameworkを使用する側にとって全く価値がない
- 定数の値が、バイナリ上における長さややオフセットとともに出力されている
- これは、
internal〜privateのものも含む - バイナリを覗けばわかることではあるが、平易に記述してひけらかす必要はない
- これは、
なぜそんなことが起こる?
-
Frameworkに出力されるABI Descriptorは、.swiftmodule配下のJSONにシンボル情報などの情報を出力する。- これは、
BUILD_LIBRARY_FOR_DISTRIBUTIONがYESの場合に出力される
- これは、
XCFramework を生成するにあたって、Appleのドキュメントに従って上述の設定を有効にしていることだろう。
対処方法
- これらの情報は、Swiftのコンパイラフラグによって出力を制御できることがわかった。
-
build settingsにて、OTHER_SWIFT_FLAGSに以下のオプションを追加すると出力されなくなる。-Xfrontend -empty-abi-descriptor
Discussion