Slide 1

Slide 1 text

あの日のHotReloadは なぜ動かなかったのか? 〜OSセキュリティ(W^X)とJITコンパイラの攻防〜 Kazuki CHIGITA(chigichan24) 2025/11/13 #FlutterKaigi 1

Slide 2

Slide 2 text

自己紹介 名前 : Kazuki CHIGITA / @chigichan24 仕事 : 株式会社MIXI でソフトウェアエンジニア 好きなDartの言語仕様 : Extension Types FlutterKaigiとの関わり : 昨年登壇しました! 2

Slide 3

Slide 3 text

アイスブレーク Q. 皆さんのプロジェクトでは、Flutterバージョンをどこまで追従 してますか? - 3.38.0 (stable) - 3.35.x (stable) - 3.32.x (stable) 3

Slide 4

Slide 4 text

アイスブレーク Q. 皆さんのプロジェクトでは、Flutterバージョンをどこまで追従 してますか? - 3.38.0 (stable) - 3.35.x (stable) - 3.32.x (stable) 4 ここより下はiOS26かつ実機では ホットリロードが動かない!

Slide 5

Slide 5 text

アイスブレーク Q. 皆さんのプロジェクトでは、Flutterバージョンをどこまで追従 してますか? - 3.38.0 (stable) - 3.35.x (stable) - 3.32.x (stable) 5 ここより下はiOS26かつ実機では ホットリロードが動かない! 今日はそんな話をします!

Slide 6

Slide 6 text

おしながき - Chapter1. 予兆 - Chapter2. Liquid Glassの盛り上がりの裏で起きていたこと - Chapter3. どう解決したのか - HotReloadの仕組み - 解決のコンセプト - Simulator fallback - Dual mapping - Chapter4. 複数のプラットフォームを支えるということ 6

Slide 7

Slide 7 text

おしながき - Chapter1. 予兆 - Chapter2. Liquid Glassの盛り上がりの裏で起きていたこと - Chapter3. どう解決したのか - HotReloadの仕組み - 解決のコンセプト - Simulator fallback - Dual mapping - Chapter4. 複数のプラットフォームを支えるということ 7 今日の目標は何が起きたかを 追体験すること

Slide 8

Slide 8 text

ところでホットリロード 8

Slide 9

Slide 9 text

ところでホットリロード 9 当たり前に 便利!

Slide 10

Slide 10 text

ところでホットリロード 10 当たり前に 便利! これが使えなくなった?

Slide 11

Slide 11 text

予兆 Chapter1. 11

Slide 12

Slide 12 text

予兆 - 2025/02/14: iOS 18.4 beta1 の発表後以下のような Issueがたてられる https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス 12

Slide 13

Slide 13 text

予兆 - 2025/02/14: iOS 18.4 beta1 の発表後以下のような Issueがたてられる https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス 13 従来debug modeを動作させるために 使っていた穴が閉じられる

Slide 14

Slide 14 text

予兆 - 2025/02/14: iOS 18.4 beta1 の発表後以下のような Issueがたてられる https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス 14 従来JIT modeを動作させるために使っ ていた穴が閉じられる debug modeってなに??

Slide 15

Slide 15 text

debug modeとは? - Dartのコンパイルのパイプラインは以下のようになっている 15 .dartファイル 字句・構文 意味解析 pubspec.yamlの 各種依存 Kernel IR (.dill) ASTの生成 Frontend (CFE)

Slide 16

Slide 16 text

debug modeとは? 16 Kernel IR (.dill) dart2js dart2wasm DartVM (AOT) DartVM (JIT) release mode: native ARM/x86-64 librariesへの変換 今日はここは割愛 debug mode: DartVMによって dillが直接実行され、 動的にマシンコードに変換 Backend

Slide 17

Slide 17 text

debug modeとは? 17 Kernel IR (.dill) dart2js dart2wasm DartVM (AOT) DartVM (JIT) release mode: native ARM/x86-64 librariesへの変換 今日はここは割愛 debug mode: DartVMによって dillが直接実行され、 動的にマシンコードに変換 Backend debug mode = 普段の開発で使っているビルド 超ざっくり言えばこれ

Slide 18

Slide 18 text

予兆 - 2025/02/14: iOS 18.4 beta1 の発表後以下のような Issueがたてられる https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス 18 そんなdebug modeを動作させるために 使っていた穴が閉じられる

Slide 19

Slide 19 text

予兆 - 2025/02/25 : 識者が調査後、dart-lang/sdk の方にも大枠の方針と ともに何をするべきかのAction Itemsが作成される - Priorityは P1 として設定される - この頃にはすでにどうすれば、この問題を解決するかの アイデアの一つがコミュニティでは提唱されている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス https://infosec.exchange/@jjtech/114067037367821976, 2025/10/19アクセス https://gist.github.com/JJTech0130/142aee0f7bda9c61a421140d17afbdeb, 2025/10/19アクセス 19

Slide 20

Slide 20 text

予兆 - 2025/02/25 : 識者が調査後、dart-lang/sdk の方にも大枠の方針と ともに何をするべきかのAction Itemsが作成される - Priorityは P1 として設定される - この頃にはすでにどうすれば、この問題を解決するかの アイデアの一つがコミュニティでは提唱されている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス https://infosec.exchange/@jjtech/114067037367821976, 2025/10/19アクセス https://gist.github.com/JJTech0130/142aee0f7bda9c61a421140d17afbdeb, 2025/10/19アクセス 20

Slide 21

Slide 21 text

予兆 - 2025/02/25 : 識者が調査後、dart-lang/sdk の方にも大枠の方針と ともに何をするべきかのAction Itemsが作成される - Priorityは P1 として設定される - この頃にはすでにどうすれば、この問題を解決するかの アイデアの一つがコミュニティでは提唱されている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス https://infosec.exchange/@jjtech/114067037367821976, 2025/10/19アクセス https://gist.github.com/JJTech0130/142aee0f7bda9c61a421140d17afbdeb, 2025/10/19アクセス 21 iOS 18.4では開発が実質できないので、 アップデートしないように アナウンスする必要がある

Slide 22

Slide 22 text

予兆 - 2025/02/25 : 識者が調査後、dart-lang/sdk の方にも大枠の方針と ともに何をするべきかのAction Itemsが作成される - Priorityは P1 として設定される - この頃にはすでにどうすれば、この問題を解決するかの アイデアの一つがコミュニティでは提唱されている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス https://infosec.exchange/@jjtech/114067037367821976, 2025/10/19アクセス https://gist.github.com/JJTech0130/142aee0f7bda9c61a421140d17afbdeb, 2025/10/19アクセス 22 iOS 18.4では開発が実質できないので、 アップデートしないように アナウンスする必要がある えっやばいやん 大変だ〜

Slide 23

Slide 23 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 23 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud.

Slide 24

Slide 24 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 24 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. この変更の影響を受けたプロジェクトが 対応できるように一時的に戻したよ

Slide 25

Slide 25 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 25 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. 将来のiOSのリリースでは、 またこの制限をかけるよ

Slide 26

Slide 26 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 26 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. この変更はDebugモードを悪用する怪しい アプリに対抗するために必要だ

Slide 27

Slide 27 text

予兆 - とりあえず、何も修正していないが問題が解決したのでよしっ👌 - 将来とは具体的にいつなのかはわからないが、平穏が訪れた 27 https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス

Slide 28

Slide 28 text

完 28 本日はありがとうございました。あとは好きなグミの雑談でもしましょう。

Slide 29

Slide 29 text

時は過ぎ、人類はすっかりこの問題を忘れた 29

Slide 30

Slide 30 text

Liquid Glassの盛り上がりの裏で起きていたこと Chapter2. 30

Slide 31

Slide 31 text

iOS26の発表 - WWDC 2025にて、iOS26がアナウンスされる。 - Liquid Glass、Flutterでどうやっていくといいんだろうが 盛り上がる。 - その裏でもう一つの話題がもりあがる。 31

Slide 32

Slide 32 text

iOS26の発表 - WWDC 2025にて、iOS26がアナウンスされる。 - Liquid Glass、Flutterでどうやっていくといいんだろうが 盛り上がる。 - その裏でもう一つの話題がもりあがる。 32 https://x.com/3ta0212/status/1932348975878897821, 2025/10/19アクセス

Slide 33

Slide 33 text

そして - 例のissueがreopenされる 33 https://github.com/flutter/flutter/issues/163984, 2025/10/19アクセス

Slide 34

Slide 34 text

挙動ベースで確かめてみよう! 34 - iOS 18.7.2 と iOS 26.1 を用意する - Flutter 3.32.8 で確認する - https://github.com/chigichan24/FlutterKaigi2025 本当にdebug modeは動かないの?

Slide 35

Slide 35 text

35 iOS 18.7.2 iOS 26.1

Slide 36

Slide 36 text

36 iOS 18.7.2 iOS 26.1

Slide 37

Slide 37 text

37 iOS 18.7.2 iOS 26.1 おや、なぜ白い画面なんだい?

Slide 38

Slide 38 text

38

Slide 39

Slide 39 text

39 オワタ\(^o^)/

Slide 40

Slide 40 text

タイムライン 40 2/14 2/25 3/5 6/10 iOS18.4 beta1公開、debug modeが動かなくなる 主にDartVM周りの開発者がどう対応するかの方針を 立てる iOS 18.4 beta2公開、debug modeが動くようになる iOS 26.0 beta1公開、debug modeが動かなくなる

Slide 41

Slide 41 text

どう解決したのか Chapter3. 41

Slide 42

Slide 42 text

タイムライン 42 2/14 2/25 3/5 6/10 iOS18.4 beta1公開、debug modeが動かなくなる 主にDartVM周りの開発者がどう対応するかの方針を 立てる iOS 18.4 beta2公開、debug modeが動くようになる iOS 26.0 beta1公開、debug modeが動かなくなる 直後、Xが割と盛り上がる

Slide 43

Slide 43 text

タイムライン 43 2/14 2/25 3/5 6/10 iOS18.4 beta1公開、debug modeが動かなくなる 主にDartVM周りの開発者がどう対応するかの方針を 立てる iOS 18.4 beta2公開、debug modeが動くようになる iOS 26.0 beta1公開、debug modeが動かなくなる 直後、Xが割と盛り上がる これがホントならFlutterを技術選択候補 から外すかも... ベンダーロックじゃないの? Flutterチームは対応できるの? 助けて (切実) これは流石に致命的じゃないかい?

Slide 44

Slide 44 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 44 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. 再掲

Slide 45

Slide 45 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 45 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. 将来のiOSのリリースでは、 またこの制限をかけるよ 再掲

Slide 46

Slide 46 text

予兆 - 2025/03/05 : AppleがiOS 18.4 Beta2 を発表し、Beta1で 導入されたJIT modeの厳しい制限を撤回した - 何もせずに、問題が解決 - 一方、以下のように明言もしている https://github.com/dart-lang/sdk/issues/60202, 2025/10/19アクセス 46 This EXC_BAD_ACCESS was removed from iOS 18.4 to give affected folks time to deal with this, but the behavior will be making a come back in a future iOS release. JIT code actually provided to the process by the debugger is expected to continue to function, while code JIT compiled in the process being debugged will not function. This change was added to iOS as a mitigation against abuse of debug capabilities for App Fraud. 将来のiOSのリリースでは、 またこの制限をかけるよ 再掲 そういえば前から言うてたわ Ω\ζ°)チーン

Slide 47

Slide 47 text

どう解決したのか? - 最終的にflutter/flutter 3.35.0のrelease noteに載った差分は以下 https://github.com/flutter/flutter/pull/170835, 2025/10/19アクセス https://docs.flutter.dev/release/release-notes/release-notes-3.35.0, 2025/10/19アクセス 47

Slide 48

Slide 48 text

どう解決したのか? - 最終的にflutter/flutter 3.35.0のrelease noteに載った差分は以下 https://github.com/flutter/flutter/pull/170835, 2025/10/19アクセス https://docs.flutter.dev/release/release-notes/release-notes-3.35.0, 2025/10/19アクセス 48 条件に合致したらフラグをonにする

Slide 49

Slide 49 text

どう解決したのか? - 最終的にflutter/flutter 3.35.0のrelease noteに載った差分は以下 https://github.com/flutter/flutter/pull/170835, 2025/10/19アクセス https://docs.flutter.dev/release/release-notes/release-notes-3.35.0, 2025/10/19アクセス 49 これだけ?

Slide 50

Slide 50 text

どう解決したのか? - 大部分はDartVM側の修正 - flutter/flutter だけを追うだけでは、深い理由が追求できない 50 今回はこの部分を深ぼってみよう!

Slide 51

Slide 51 text

どう解決したのか? - 大部分はDartVM側の修正 - flutter/flutter だけを追うだけでは、深い理由が追求できない 51 今回はこの部分を深ぼってみよう! JITの流れを知る必要がある!

Slide 52

Slide 52 text

JIT/HotReloadの仕組み 52 Kernel IR (.dill) DartVM (AOT) DartVM (JIT) release mode: native ARM/x86-64 librariesへの変換 debug mode: DartVMによって dillが直接実行され、 動的にマシンコードに変換 Backend

Slide 53

Slide 53 text

53 Kernel IR (.dill) DartVM (AOT) DartVM (JIT) release mode: native ARM/x86-64 librariesへの変換 debug mode: DartVMによって dillが直接実行され、 動的にマシンコードに変換 Backend JIT/HotReloadの仕組み

Slide 54

Slide 54 text

JIT/HotReloadの仕組み 54 DartVM Flutter Engine host OS

Slide 55

Slide 55 text

JIT/HotReloadの仕組み 55 Kernel IR (.dill) DartVM Flutter Engine host OS 1. バイナリ形式のIRを DartVMにそのまま渡す。

Slide 56

Slide 56 text

host OS JIT/HotReloadの仕組み 56 Kernel IR (.dill) DartVM Flutter Engine 2. Flutter Engineは DartVMのpublic APIを 経由してDartを実行 DartEntry::InvokeFunction()

Slide 57

Slide 57 text

host OS JIT/HotReloadの仕組み 57 Kernel IR (.dill) DartVM Flutter Engine 3. DartVMのJIT compilerがhost deviceに 合わせて必要な マシンコードを吐き出す iOSデバイスなら arm64 DartEntry::InvokeFunction()

Slide 58

Slide 58 text

host OS JIT/HotReloadの仕組み 58 Kernel IR (.dill) DartVM Flutter Engine 3. DartVMのJIT compilerがhost deviceに 合わせて必要な マシンコードを吐き出す iOSデバイスなら arm64 DartEntry::InvokeFunction()

Slide 59

Slide 59 text

マシンコードを吐き出すの詳細 59 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory

Slide 60

Slide 60 text

マシンコードを吐き出すの詳細 60 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory ここの領域に対応させるぞ ※ POSIXでのmmapと考えて問題ない ですが、実際はもっとリッチです

Slide 61

Slide 61 text

マシンコードを吐き出すの詳細 61 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory 実行可能! JITコンパイル結果をもらってきて、 メモリ保護モードを書き込み可能(RW) にして書き込む

Slide 62

Slide 62 text

マシンコードを吐き出すの詳細 62 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory (読み込んで)書き込むぞ! メモリ保護モードを実行可能(RX)にし てCPUにメモリ領域のコードを 実行できることを伝える

Slide 63

Slide 63 text

host OS JIT/HotReloadの仕組み 63 Kernel IR (.dill) DartVM Flutter Engine 3. DartVMのJIT compilerがhost deviceに 合わせて必要な マシンコードを吐き出す iOSデバイスなら arm64 DartEntry::InvokeFunction()

Slide 64

Slide 64 text

host OS JIT/HotReloadの仕組み 64 Kernel IR (.dill) DartVM Flutter Engine 3. DartVMのJIT compilerがhost deviceに 合わせて必要な マシンコードを吐き出す iOSデバイスなら arm64 DartEntry::InvokeFunction() わーいこれでDartコード実行できた!

Slide 65

Slide 65 text

host OS JIT/HotReloadの仕組み 65 Kernel IR (.dill) DartVM Flutter Engine 3. DartVMのJIT compilerがhost deviceに 合わせて必要な マシンコードを吐き出す iOSデバイスなら arm64 DartEntry::InvokeFunction() わーいこれでDartコード実行できた! これが大まかなJIT compileの動き

Slide 66

Slide 66 text

JIT/HotReloadの仕組み 66 Kernel IR (.dill) DartVM Flutter Engine host device JITがベースなので、 この仕組みの応用で 考えられる!

Slide 67

Slide 67 text

JIT/HotReloadの仕組み 67 Kernel IR (.dill) DartVM Flutter Engine host device HotReload発生

Slide 68

Slide 68 text

JIT/HotReloadの仕組み 68 Kernel IR (.dill) DartVM Flutter Engine host device HotReload発生 影響のある関数を無効化 -> スタブに変更

Slide 69

Slide 69 text

JIT/HotReloadの仕組み 69 Kernel IR (.dill) DartVM Flutter Engine host device HotReload発生 差分の Kernel IR (.dill) が生成される

Slide 70

Slide 70 text

JIT/HotReloadの仕組み 70 Kernel IR (.dill) DartVM Flutter Engine host device HotReload発生 差分の Kernel IR (.dill) が生成される あとはJITと一緒の動き

Slide 71

Slide 71 text

これで深堀るための事前知識はもう完璧! 71

Slide 72

Slide 72 text

なぜiOS実機でDebugModeが動かなくなった? 72

Slide 73

Slide 73 text

なぜiOS実機でDebugModeが動かなくなった? 73 iOS 26 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory

Slide 74

Slide 74 text

なぜiOS実機でDebugModeが動かなくなった? 74 iOS 26 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory

Slide 75

Slide 75 text

なぜiOS実機でDebugModeが動かなくなった? 75 iOS 26 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory !?!?

Slide 76

Slide 76 text

なぜiOS実機でDebugModeが動かなくなった? 76 iOS 26 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory そんなモードで メモリ確保したらあかんで

Slide 77

Slide 77 text

Appleプラットフォームのセキュリティ 77 Apple Socは多層に様々な形(SPTM、TXM、PPL等)でコード実行を保護している。 そのうちの一部(コード署名制限)がiOS26で厳格化された。 https://support.apple.com/ja-jp/guide/security/sec8b776536b/1/web/1#sec314c3af61, 2025/11/13 アクセス

Slide 78

Slide 78 text

なぜiOS実機でDebugModeが動かなくなった? 78 iOS 26 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory 同一のメモリで 権限をRXからRWに 切り替えることがNGになった

Slide 79

Slide 79 text

2つのアプローチ - DartVMのチームは大きく以下の多層的な2つのアプローチを取る ことで解決を図った - Simulator fallback - Dual Mapping 79

Slide 80

Slide 80 text

Simulator fallback - flutter/flutterに含まれていたパッチの正体。動作しないときには simulatorモードにさせて無理やり動作させる。 - hostOSの機能ではなく、simulatorをDartVMに載せておき、 これを使う。 80

Slide 81

Slide 81 text

Simulator fallback - flutter/flutterに含まれていたパッチの正体。動作しないときには simulatorモードにさせて無理やり動作させる。 - hostOSの機能ではなく、simulatorをDartVMに載せておき、 これを使う。 81 iOS 26 DartVM Memory Virtual Memory このパス自体をなくしてしまう

Slide 82

Slide 82 text

Simulator fallbackの問題点 - 遅い 82

Slide 83

Slide 83 text

Simulator fallbackの問題点 - 遅い - が後述する方法も動かなかったときの最後の防波堤として設定される 83

Slide 84

Slide 84 text

Dual Mapping 84 - 同一のメモリに対して 1. 読み取り、2.書き込み、3.実行を 割り振るべからずにはW^Xという考え方がある。 - メモリは、2.書き込み xor 1,3.読み取り実行 といういずれかの ステータスになるべき。 - これまでは mrotect systemcallでこれが実現できていた https://en.wikipedia.org/wiki/W%5EX, 2025/11/13 アクセス

Slide 85

Slide 85 text

Dual Mapping 85 - 同一のメモリに対して 1. 読み取り、2.書き込み、3.実行を 割り振るべからずにはW^Xという考え方がある。 - メモリは、2.書き込み xor 1,3.読み取り実行 といういずれかの ステータスになるべき。 - これまでは mrotect systemcallでこれが実現できていた https://en.wikipedia.org/wiki/W%5EX, 2025/11/13 アクセス Write Read/Execute

Slide 86

Slide 86 text

Dual Mapping 86 - 同一のメモリに対して 1. 読み取り、2.書き込み、3.実行を 割り振るべからずにはW^Xという考え方がある。 - メモリは、2.書き込み xor 1,3.読み取り実行 といういずれかの ステータスになるべき。 - これまでは mrotect systemcallでこれが実現できていた https://en.wikipedia.org/wiki/W%5EX, 2025/11/13 アクセス Write Read/Execute

Slide 87

Slide 87 text

Dual Mapping 87 - 同一のメモリに対して 1. 読み取り、2.書き込み、3.実行を 割り振るべからずにはW^Xという考え方がある。 - メモリは、2.書き込み xor 1,3.読み取り実行 といういずれかの ステータスになるべき。 - これまでは mrotect systemcallでこれが実現できていた https://en.wikipedia.org/wiki/W%5EX, 2025/11/13 アクセス Write Read/Execute mprotectが塞がれたので これと類似の状況を実現する

Slide 88

Slide 88 text

Dual Mapping 88 - 書き込みのみできるメモリと、読み取り実行ができるメモリを 仮想アドレス上にマッピングするようにした

Slide 89

Slide 89 text

Dual Mapping 89 - 書き込みのみできるメモリと、読み取り実行ができるメモリを 仮想アドレス上にマッピングするようにした Write Read/Execute

Slide 90

Slide 90 text

Dual Mapping 90 - 書き込みのみできるメモリと、読み取り実行ができるメモリを 仮想アドレス上にマッピングするようにした Write Read/Execute Write Read / Execute

Slide 91

Slide 91 text

Dual Mapping 91 iOS 26 DartVM Memory Virtual Memory 書き込み

Slide 92

Slide 92 text

Dual Mapping 92 iOS 26 DartVM Memory Virtual Memory 読み取り実行 書き込み

Slide 93

Slide 93 text

Dual Mapping 93 iOS 26 DartVM Memory Virtual Memory 読み取り実行 書き込み vm_remap で実現 https://developer.apple.com/documentation/kernel/1585336-vm_remap

Slide 94

Slide 94 text

マシンコードを吐き出すの詳細(改) 94 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory

Slide 95

Slide 95 text

マシンコードを吐き出すの詳細(改) 95 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory W RX ここの領域にWとRXを対応させるぞ

Slide 96

Slide 96 text

マシンコードを吐き出すの詳細(改) 96 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory W RX Wを使って書き込み JITコンパイル結果をもらってきて、 Writeにマップしたアドレスを経由して 書き込みを行う

Slide 97

Slide 97 text

マシンコードを吐き出すの詳細(改) 97 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory W RX ここの領域にWとRXを対応させるぞ 実行可能(RX)のアドレスを経由して CPUにメモリ領域のコードを 実行できることを伝える

Slide 98

Slide 98 text

マシンコードを吐き出すの詳細(改) 98 host OS 1. 仮想メモリの確保 2. コードの生成と書き込み 3. 実行メモリへの変換 DartVM Memory Virtual Memory W RX ここの領域にWとRXを対応させるぞ 実行可能(RX)のアドレスを経由して CPUにメモリ領域のコードを 実行できることを伝える このWとRXのflip操作にvm_remapを使用

Slide 99

Slide 99 text

2つのアプローチ参考にしたコミット 99 - Simulator fallback - 434982: [vm] Runtime option to not use the simulator for simarm64_arm64. | https://dart-review.googlesource.com/c/sdk/+/434982 - 435562: [vm] Rename USING_SIMULATOR to DART_INCLUDE_SIMULATOR. | https://dart-review.googlesource.com/c/sdk/+/435562 - 435640: [vm] Disable simulator when we detect we can JIT. | https://dart-review.googlesource.com/c/sdk/+/435640 - Dual Mapping - 433940: [vm] Use dual mapping of code pages on certain OS versions | https://dart-review.googlesource.com/c/sdk/+/433940 - 435120: [vm] Rework RX workarounds | https://dart-review.googlesource.com/c/sdk/+/435120 - 435780: [vm] Fix implementation of IsAtLeastIOS | https://dart-review.googlesource.com/c/sdk/+/435780 - 435860: [vm] Fix freelist interaction with dual mapping | https://dart-review.googlesource.com/c/sdk/+/435860

Slide 100

Slide 100 text

これらを適用して解決! 100 https://github.com/dart-lang/sdk/issues/60202, 2025/11/12アクセス

Slide 101

Slide 101 text

実際に見てみよう 101

Slide 102

Slide 102 text

解決までのタイムライン 102 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 6/21

Slide 103

Slide 103 text

解決までのタイムライン 103 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 6/21

Slide 104

Slide 104 text

解決までのタイムライン 104 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける 6/21

Slide 105

Slide 105 text

解決までのタイムライン 105 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21

Slide 106

Slide 106 text

解決までのタイムライン 106 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る

Slide 107

Slide 107 text

解決までのタイムライン 107 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる

Slide 108

Slide 108 text

解決までのタイムライン 108 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる コミュニティから特定条件で動作 しないフィードバックが来る

Slide 109

Slide 109 text

解決までのタイムライン 109 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる フィードバックをもとに、 修正のコミットが積まれる コミュニティから特定条件で動作 しないフィードバックが来る

Slide 110

Slide 110 text

解決までのタイムライン 110 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる フィードバックをもとに、 修正のコミットが積まれる コミュニティから特定条件で動作 しないフィードバックが来る masterで修正が完了

Slide 111

Slide 111 text

解決までのタイムライン 111 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる フィードバックをもとに、 修正のコミットが積まれる コミュニティから特定条件で動作 しないフィードバックが来る masterで修正が完了 Flutter 3.35 stableリリース

Slide 112

Slide 112 text

解決までのタイムライン 112 2/14 2/25 3/5 6/10 6/13 6/19 6/20 8/16 iOS 18.4 b1/debug mode動かなくなる 開発者が根本原因の発見・ 解決策の方向性をみつける iOS 18.4 b2/debug mode動くようになる 6/21 iOS 26の発表、問題が再発す る 修正のための最初のコミット が積まれる フィードバックをもとに、 修正のコミットが積まれる コミュニティから特定条件で動作 しないフィードバックが来る masterで修正が完了 Flutter 3.35 stableリリース iOS26発表からでは わずか11日で解決!

Slide 113

Slide 113 text

複数のプラットフォームを支えるということ Chapter4. 113

Slide 114

Slide 114 text

複数のプラットフォームを支えるということ - Kernel IRやDartVMのレイヤーでplatform差分を吸収している 114

Slide 115

Slide 115 text

複数のプラットフォームを支えるということ - Kernel IRやDartVMのレイヤーでplatform差分を吸収している - 今回の問題以外にも様々対応してきている。 115 各種OS向けの バイナリフォーマット FuchsiaOSでの VMEXリソースの初期化 macOSでの スレッド割り込み処理 他にも様々...

Slide 116

Slide 116 text

複数のプラットフォームを支えるということ - Kernel IRやDartVMのレイヤーでplatform差分を吸収している - 今回の問題以外にも様々対応してきている。 - Appleが今後もKernelを変えてくる可能性はある。 それに対応する方式もすでに検討中のよう (fast modular AOT compilation with an interpretation fallback) 116 各種OS向けの バイナリフォーマット FuchsiaOSでの VMEXリソースの初期化 macOSでの スレッド割り込み処理 他にも様々...

Slide 117

Slide 117 text

おしながき - Chapter1. 予兆 - Chapter2. Liquid Glassの盛り上がりの裏で起きていたこと - Chapter3. どう解決したのか - HotReloadの仕組み - 解決のコンセプト - Simulator fallback - Dual mapping - Chapter4. 複数のプラットフォームを支えるということ 117 今日の目標は何が起きたかを 追体験すること

Slide 118

Slide 118 text

おしながき - Chapter1. 予兆 - Chapter2. Liquid Glassの盛り上がりの裏で起きていたこと - Chapter3. どう解決したのか - HotReloadの仕組み - 解決のコンセプト - Simulator fallback - Dual mapping - Chapter4. 複数のプラットフォームを支えるということ 118 追体験できた?

Slide 119

Slide 119 text

おしながき - Chapter1. 予兆 - Chapter2. Liquid Glassの盛り上がりの裏で起きていたこと - Chapter3. どう解決したのか - HotReloadの仕組み - 解決のコンセプト - Simulator fallback - Dual mapping - Chapter4. 複数のプラットフォームを支えるということ 119 追体験できた? JITの仕組みの裏側 セキュリティ要件 問題の突然の発覚 修正までの速度感 メモリ管理 原因の追求 将来への拡張 数多のフィードバック 突然の問題解消

Slide 120

Slide 120 text

Flutter / Dart チームに大感謝 120

Slide 121

Slide 121 text

ライセンス - だしゅまる©2024 by FlutterKaigi 本作品は [CC BY-NC-ND 4.0 国際ライセン ス](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja) に基づいています。 121

Slide 122

Slide 122 text

参考資料(1) - https://github.com/flutter/flutter/issues/163984 - https://gist.github.com/osy/8940e5ae5f24646b808f58d197883ca5 - https://github.com/dart-lang/sdk/issues/60202 - https://github.com/dart-lang/sdk/tree/main/runtime/vm - https://github.com/apple-oss-distributions/xnu - https://en.wikipedia.org/wiki/W%5EX - https://deepwiki.com/dart-lang/sdk - https://developer.apple.com/documentation/kernel/1585336-vm_remap - https://zenn.dev/tsuruo/articles/48909d22d49ffe - https://support.apple.com/ja-jp/guide/security/sec8b776536b/1/web/1#secd022396fb - https://gist.github.com/JJTech0130/142aee0f7bda9c61a421140d17afbdeb - https://github.com/flutter/flutter/issues/170312 - https://infosec.exchange/@jjtech/114067037367821976 - https://docs.flutter.dev/resources/faq 122

Slide 123

Slide 123 text

参考資料(2) - https://github.com/chigichan24/FlutterKaigi2025 - https://mrale.ph/dartvm/#how-does-dart-vm-run-your-code - https://nxmnpg.lemoda.net/ja/2/mprotect - https://dart-review.googlesource.com/c/sdk/+/433940 - https://dart-review.googlesource.com/c/sdk/+/435120 - https://dart-review.googlesource.com/c/sdk/+/435780 - https://dart-review.googlesource.com/c/sdk/+/435860 - https://dart-review.googlesource.com/c/sdk/+/434982 - https://dart-review.googlesource.com/c/sdk/+/435562 - https://dart-review.googlesource.com/c/sdk/+/435640 123