🤏
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