fastlane 2.241.2で直った脆弱性3件|match・Apple IDのcookie・Swift版Fastfileで影響を受ける使い方と、更新後に確かめること
fastlane 2.241.2で、深刻度Highの脆弱性3件が直った
iOSとAndroidのアプリのビルド、署名、ストアへの提出を自動化するツール「fastlane」の2.241.2が、2026年10月27日(日本時間)に公開されました(2.241.2のリリースノート)。同じ日に、fastlaneの開発チームは深刻度Highのセキュリティ勧告を3件公開しています。どれも2.241.1以前に影響し、2.241.2で直りました。
3件は、証明書を共有するmatch、Apple IDでのサインインの情報を保存するspaceship、Swiftで書いたFastfile(Fastfile.swift)にそれぞれ関係します。影響を受けやすいのは、ほかのアカウントと共有しているMacやビルド用のサーバー、証明書をgit以外のストレージ(Google Cloud Storage、S3、GitLab Secure Files)に置いているチーム、Swiftで書いたFastfileにCIがブランチ名などを渡しているチームです。
この記事では、2.241.1と2.241.2を手元のMacに並べて入れ、勧告が指摘した3つの動作(cookieなどのファイルの権限、matchの書き込み先、Swift版のFastfileのレーンの引数)を同じ条件で比べました。Apple IDへのサインインや実際のクラウドには接続せず、架空のcookieと手元の架空のサーバーを使っています。自分の使い方が当てはまるか、更新したあとに何をするかを判断する材料にしてください。
要点
fastlaneを2.241.2以上へ上げ、共有のマシンでは古いcookieを消し、Swift版のFastfileではランナーを作り直す
3件とも2.241.1以前に影響し、2.241.2で直りました。各カードの見出しは、手元で2つの版を比べた結果です。
Apple IDのcookie
644から600に
共有のマシンでは、古いcookieを消し、そのマシンで書かれたAPIキーを再発行します。
match
作業フォルダーの外へ書かない
外を指す名前(../など)のファイルを、2.241.2は「Refusing to download」で止めます。
Swift版のFastfile
レーンの引数がコマンドにならない
ランナーとの通信をトークンで守るには、FastlaneRunnerの作り直しも要ります。
影響を受けるのは、共有のマシン、git以外に保存するmatch、Swift版のFastfile
悪用の前提は勧告ごとに違います。cookieとAPIキーの問題では同じマシンの別のアカウント、matchの問題では証明書のストレージへの書き込みの権限、Swift版のFastfileの問題では、CIがレーンに渡す文字列(ブランチ名やプルリクエストのタイトル)を決められる立場か、同じマシンの別のアカウントが必要です。プルリクエストのタイトルをレーンに渡しているCIなら、プルリクエストを出せる人がこの立場に当たります。
| 勧告 | 影響を受ける使い方 | 起きること | 影響する版 |
|---|---|---|---|
| GHSA-m67f-ghvw-j7qp Apple IDのcookieなど | ほかのアカウントと共有しているMacやビルド用サーバーで、Apple IDでサインインするか、TransporterにAPIキーを渡す(APIキーは、WindowsかFASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPTを設定した環境のとき) | ほかのアカウントがcookieを読み、パスワードと2段階認証なしにApp Store Connectを操作できる。APIキーも読める | 2.241.1以前(APIキーは2.227.2〜2.241.1) |
| GHSA-hqmj-jmgc-wmwp match | matchの保存先がGoogle Cloud Storage、S3、GitLab Secure Files(GitLabは15.5以前の自前のサーバー) | ストレージに書き込める人が、matchを動かすアカウントが書ける場所にファイルを置ける(保存先ごとの名前の制約の範囲で) | 2.110.0〜2.241.1(保存先で異なる) |
| GHSA-gqqf-9mh3-3578 Swift版のFastfile | レーンをFastfile.swiftで書く、またはfastlaneをSwiftパッケージとして使う | Fastfile.swiftでは、レーンの引数に入れた文字列がビルドマシンでコマンドとして動く。共有のマシンでは、ランナーとの通信を横取りされる | 2.69.0〜2.241.1 |
勧告の公開は2026年10月27日(日本時間)。深刻度は3件ともHigh。matchの影響の始まりはGoogle Cloud Storageが2.110.0、S3が2.143.0、GitLab Secure Filesが2.207.0。表の内容は各勧告の記載から要約。
自分ひとりで使うMacで、matchの保存先がgitで、FastfileをRubyで書いている場合は、3件とも当てはまる条件がありません。それでも、あとでほかのアカウントと共有するマシンやCIで使うときに備えて2.241.2へ上げておくと、cookieとログは最初から本人だけが読めるファイルになります。
Apple IDのcookieは、2.241.2から本人だけが読める
fastlaneは、Apple IDでサインインしたときのセッションをcookieとして~/.fastlane/spaceship/<Apple ID>/cookieに保存し、次の実行で2段階認証を省きます。2.241.1までは、このファイルをmacOSの既定の権限で作っていました。macOSの通常のアカウントは全員「staff」グループに入り、ホームフォルダーはこのグループが中を読める権限(drwxr-x---)なので、同じMacのほかのアカウントがcookieを読めます。勧告によると、そのcookieをFASTLANE_SESSIONに入れると、パスワードも2段階認証もなしに、その開発者としてApp Store Connectを操作できます。
Apple IDにはサインインせず、架空のcookieを1つ入れて保存の処理だけを動かし、できたファイルの権限を比べました。
| fastlaneが書くファイル | 2.241.1 | 2.241.2 |
|---|---|---|
| セッションのcookie(とそのフォルダー) | 644(755) | 600(700) |
| 2.241.1で保存した644のcookieを読み込んだあと | 644(755)のまま | 600(700)に変わる |
リクエストのログ(spaceship<時刻>_….log) | 644 | 600 |
シェルスクリプト版のTransporterが書くAPIキー(AuthKey_…p8) | 644(755) | 600(新しく作るフォルダーは700) |
数字はファイルの権限(644は本人が読み書き、ほかの人も読める。600は本人だけが読み書き)。括弧内はフォルダーの権限。macOS 27.0.1、Ruby 3.4.3、fastlane 2.241.1と2.241.2で2026年11月11日に確認。
2.241.2は、前の版で保存したcookieも、読み込んだ時点で600に変えました。
リクエストのログは、送受信の本文を書くファイルです。パスワードは伏せられますが、2段階認証のコードやチームとアプリの情報はそのまま書かれます。macOSでは置き場所の一時フォルダー($TMPDIR)が本人だけのフォルダーなので、他人に読まれやすいのは、一時フォルダーが/tmpで全員の共有になるLinuxのビルド用サーバーです。2.241.2が600にするのは新しく作るログなので、共有のLinuxのサーバーでは/tmpに残った古いspaceship*.logも消しておくと、ほかのアカウントに読まれる古いログが残りません。
Transporterは、アプリをApp Store Connectへアップロードするときに使うAppleのツールです。fastlaneがAPIキーを~/.appstoreconnect/private_keysに書くのは、Windowsと、環境変数FASTLANE_ITUNES_TRANSPORTER_USE_SHELL_SCRIPTを設定したmacOS・Linuxの場合です。
手元のcookieの権限は、次のコマンドで確かめられます。先頭が-rw-r--r--なら、2.241.1以前に保存され、まだ2.241.2で読み込んでいないファイルです。SPACESHIP_COOKIE_PATHを設定している環境では、cookieは<そのパス>/spaceship/<Apple ID>/cookieにあります。
ls -l ~/.fastlane/spaceship/*/cookie
共有のマシンでは、2.241.2へ上げたあと、古いcookieを消すかサインインし直すよう勧告が求めています。そのマシンで書かれたApp Store ConnectのAPIキーは、App Store Connectで取り消して新しいキーを発行し、CIなどに設定したキーを差し替えます。どのジョブも同じアカウントで動くビルド用サーバーでは、同じアカウントで動くほかのジョブが600のcookieもそのまま読めます。勧告は、ジョブごとに新しい仮想マシンやコンテナで動かすか、ジョブごとにSPACESHIP_COOKIE_PATHを分けてジョブの終わりに消すか、ジョブの終わりに~/.fastlane/spaceshipを消す方法を挙げています。
2.241.1までのmatchは、ファイル名の../をたどって作業フォルダーの外へ書いていた
matchは、チームで共有する証明書とプロビジョニングプロファイルをストレージから取り出して、手元にインストールするコマンドです。保存先がGoogle Cloud Storage、S3、GitLab Secure Filesのとき、2.241.1までは、ストレージ上のファイル名をそのまま一時的な作業フォルダーの後ろにつないで書き込んでいました。名前に../が入っていると、作業フォルダーの外へ書かれます。保存先がgitの場合は、gitが..を含むパスを受け付けないため影響しません。
手元に、GitLab Secure FilesのAPIの形で答える架空のサーバーを立て、ファイルの一覧に../../outside/escaped-by-match.txtという名前を1つ混ぜました。中身は無害な文字列です。両方の版で、読み取り専用のfastlane match development --readonly trueを実行しました。
2.241.1
作業フォルダーの外にファイルができた
作業フォルダー(一時フォルダーのd2026…)の2つ上にoutside/escaped-by-match.txtが作られました。書き込むときにエラーや警告は出ません。このあと、架空のストレージに本物の証明書がないためmatchは終了コード1で終わりましたが、書き込みはその前に済んでいます。
2.241.2
書く前にエラーで止まった
外にはファイルができず、matchは次のエラーで止まりました。CIのジョブは失敗になります。
[!] Refusing to download "../../outside/escaped-by-match.txt": it would be written outside <作業フォルダー>
2.241.1での書き込みは、証明書の復号より前に起きます。readonly: trueで証明書を読むだけの開発者のMacや、CIのビルドマシンでも、ダウンロードの段階で書かれます。勧告によると、この細工ができるのはストレージに書き込める人で、チームの管理者のほか、漏れたトークンやアクセスキーを持つ第三者も含まれます。細工したファイルが~/.zshrcなどのシェルの起動ファイルやCIのスクリプトを上書きすると、その次の起動で中のコマンドが動きます。
書ける範囲は保存先の名前の決まりで変わります。勧告によると、Google Cloud Storageは../を含む名前を受け付けます。AWSのS3は、キーの先頭より上へ出る../を受け付けないため、作業フォルダーから上へさかのぼれるのはs3_object_prefixの階層の数までです。ただし勧告によると、作業フォルダーが/tmpの下にできるLinuxでは2階層、macOSでは6階層のプレフィックスで/まで届きます。AWS以外のS3互換サービスがこの決まりを守るかは、勧告では確かめられていません。GitLab Secure FilesはGitLab 15.6からAPIの側で..を含む名前を拒否するので、影響が残るのは15.5以前の自前のGitLabです。
2.241.2へ上げると、つないだ結果が作業フォルダーの外を指す名前のファイルは書き込まれず、matchはエラーで止まります。CIのログで「Refusing to download」を見たら、ストレージに見覚えのないファイルがないか、書き込みの権限を持つトークンやキーが漏れていないかを確かめます。
2.241.1までのSwift版Fastfileは、レーンの引数をそのままシェルに渡していた
レーンをFastfile.swiftで書くと、fastlaneはFastlaneRunnerというSwiftのプログラムを起動し、手元のポート(2.241.1までの既定は2000番)で通信しながらアクションを実行します。2.241.1までは、このランナーを起動するコマンドに、レーン名と引数をエスケープせずに埋め込んでいました。CIがfastlane beta branch:$BRANCH_NAMEのようにブランチ名やプルリクエストのタイトルを引数に入れると、その中の;や$(...)がビルドマシンでコマンドとして動きます。
Xcodeでランナーをビルドする代わりに、受け取った引数を書き出すだけのスクリプトをランナーの場所に置き、両方の版のランナー起動の処理にnotes: "release a; touch INJECTED"を渡しました。
# 2.241.1 がシェルに渡したコマンド
FastlaneRunner lane beta notes release a; touch INJECTED swiftServerPort 2000
→ ランナーが受け取った引数: lane / beta / notes / release / a
→ touch が別のコマンドとして実行され、INJECTED ファイルができた
# 2.241.2 がシェルに渡したコマンド
FastlaneRunner lane beta notes release\ a\;\ touch\ INJECTED swiftServerPort 2000 swiftServerTokenFile …/token
→ ランナーが受け取った引数: lane / beta / notes / "release a; touch INJECTED" / …
→ INJECTED ファイルはできない
FastlaneRunnerとINJECTEDの前に付く作業用フォルダーのパスと、末尾の> /dev/nullは省略。ポート番号は、検証でランナー起動の処理へ2000を直接渡したため、2.241.2でも2000になっている(通常の実行では、2.241.2は空いたポートの番号を渡す)。macOS 27.0.1、fastlane 2.241.1と2.241.2で2026年11月11日に確認。
勧告には、共有のマシンでの問題もあと2つ書かれています。ほかのアカウントのプロセスが先に2000番ポートで待ち受けると、ランナーの通信(アクションに渡したパスワードやAPIキーを含む)がそちらへ流れることと、fastlane側の待ち受けに先につないだプロセスのコマンドをfastlaneが実行することです。2.241.2は、--swift_server_portで番号を指定しないかぎり空いたポートを選び、実行のたびに本人だけが読めるファイルへトークンを書いて、トークンのないコマンドを断ります。
ただし、トークンを確かめるのは、ランナーを2.241.2に合わせて作り直したあと(ランナーのプロトコルの版が2になったあと)です。古いランナーのままだと、引数のエスケープと空いたポートの選択は働きますが、fastlaneはYour FastlaneRunner is outdated for this version of fastlane.という警告を出し、トークンを確かめずにコマンドを受け付けます。CIの中ではランナーを更新しないので、CIの外で、disable_runner_upgradesを付けずに、ビルドやアップロードを伴わないレーンを一度実行します。Should we try to upgrade just your `FastlaneSwiftRunner` project?と聞かれたら承認し、プロジェクトのfastlane/swiftなどで変わったファイルをコミットします。
fastlaneをSwiftパッケージとして使っている場合は、トークンを作るのはSwiftパッケージ側のランナーです。gemに加えて、Package.swiftで指定しているfastlaneも2.241.2へ上げて、ランナーをビルドし直します。gemだけを上げると、fastlaneはNo --token_file given: any local process that connects first can run actionsと警告し、トークンなしで動きます。
2.241.2へ上げたあとに確かめる4つのこと
1. 使っている版
Gemfileで入れているならbundle update fastlaneで上げ、bundle exec fastlane --versionかGemfile.lockのfastlane (2.241.2)で確かめます。Homebrewのfastlaneも2.241.2です(2026年11月11日時点)。CIのイメージと、チーム全員のMacで上げます。
2. 共有のマシンのcookieとAPIキー
ほかのアカウントがあるMacやビルド用サーバーでは、古いcookieを消すかサインインし直します。そのマシンで書かれたApp Store ConnectのAPIキーは、App Store Connectで取り消して新しいキーを発行し、CIなどの設定を差し替えます。
3. matchのストレージ
Google Cloud Storage、S3、GitLab Secure Filesに、名前に..を含むファイルがないかを見ます。書き込みの権限は必要な人だけに絞り、証明書を読むだけのCIには読み取りの権限だけを渡します。
4. Swift版のFastfileのランナー
「Your FastlaneRunner is outdated」の警告が出ているあいだは、トークンの確認が働きません。CIの外で、ビルドやアップロードを伴わないレーンを一度実行してランナーを作り直し、変わったファイルをコミットします。Swiftパッケージとして使っているなら、Package.swiftのfastlaneも2.241.2へ上げます。
自分ひとりのMacでも、2.241.1以前に保存したcookieは644のまま残っています。このMacにあとでほかのアカウントを作ったときにも読まれないように、2.241.2へ上げてから一度サインインし直すと、cookieは600のファイルとして保存し直されます。
参考資料
- fastlane 2.241.2のリリースノート(2026年10月27日、日本時間)
- GHSA-m67f-ghvw-j7qp:Other local users can read fastlane's Apple ID session cookie and App Store Connect API key files
- GHSA-hqmj-jmgc-wmwp:match writes downloaded files outside its working directory when a storage file name contains ..
- GHSA-gqqf-9mh3-3578:Swift Fastfiles: other local users can intercept or take over the runner channel, and lane options are run by a shell
- 2.241.1と2.241.2の差分(fastlane/fastlane)
検証環境
- macOS 27.0.1(Apple Silicon)
- Ruby 3.4.3、Bundler 2.6.8
- fastlane 2.241.1と2.241.2
- 検証日: 2026年11月11日
この記事は、AIが調査と下書きを担当し、上記の環境で実際に動かして結果を確かめ、下書きとは別の担当が公開前に本文と出典を確認しています。制作と訂正の方針は編集・訂正方針で公開しています。












