🤏

XCFrameworkを配布したらプライベートな情報がポロリしていた話

2023/11/03に公開

「フレームワーク更新したしバイナリ上げとこ〜」

「う〜ん?なんか差分が多いなぁ…えっ!?」

現象

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を使用する側にとって全く価値がない
  • 定数の値が、バイナリ上における長さややオフセットとともに出力されている
    • これは、internalprivate のものも含む
    • バイナリを覗けばわかることではあるが、平易に記述してひけらかす必要はない

なぜそんなことが起こる?

  • Framework に出力される ABI Descriptor は、 .swiftmodule 配下の JSON にシンボル情報などの情報を出力する。
    • これは、 BUILD_LIBRARY_FOR_DISTRIBUTIONYES の場合に出力される

XCFramework を生成するにあたって、Appleのドキュメントに従って上述の設定を有効にしていることだろう。

https://developer.apple.com/documentation/xcode/creating-a-multi-platform-binary-framework-bundle

対処方法

  • これらの情報は、Swiftのコンパイラフラグによって出力を制御できることがわかった。
  • build settings にて、OTHER_SWIFT_FLAGS に以下のオプションを追加すると出力されなくなる。
    • -Xfrontend -empty-abi-descriptor

https://forums.swift.org/t/xcode-14-creates-arm64-apple-ios-abi-json-by-default/65380

References

GitHubで編集を提案

Discussion