Slide 1

Slide 1 text

2025/06/07 数村憲治 © 2025 Fujitsu Limited JJUG CCC Spring 2025 @kkzr セキュリティマネジャー廃止と クラウドネイティブ型 サンドボックス活用

Slide 2

Slide 2 text

© 2025 Fujitsu Limited アジェンダ セキュリティマネジャー廃止 サンドボックスとは クラウドネイティブでのサンドボックス サマリ 本資料でセキュリティマネジャーのことを「SM」と記載する場合あり 2

Slide 3

Slide 3 text

© 2025 Fujitsu Limited 自己紹介 Jakarta EE 仕様策定委員 MicroProfile ステコミ委員 JCP Executive Committee メンバー Eclipse Foundation ボードディレクター OCX、JakartaOne、JJUGなどで登壇 3

Slide 4

Slide 4 text

© 2025 Fujitsu Limited アジェンダ セキュリティマネジャー廃止 サンドボックスとは クラウドネイティブでのサンドボックス サマリ 4

Slide 5

Slide 5 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited セキュリティマネジャーの段階的廃止 Java SE 24 Java SE 17 JEP 411: Deprecate the Security Manager for Removal JEP 486: Permanently Disable the Security Manager Java SE ?? 使用時にワーニング 使用時にエラー (ClassNotFoundではない) 削除?? 5

Slide 6

Slide 6 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited セキュリティマネジャー廃止でどうなるか $ java -Djava.security.manager Hello Error occurred during initialization of VM java.lang.Error: A command line option has attempted to allow or enable the Security Manager. Enabling a Security Manager is not supported. at java.lang.System.initPhase3([email protected]/System.java:1947) 「廃止」という言葉を使っているが、API・クラスファイル が削除されるわけではない セキュリティマネージャーをどうやっても有効にできなく なるということ 無理に有効にしようとするとエラーになる 6

Slide 7

Slide 7 text

© 2025 Fujitsu Limited プログラム中のAPI利用も不可 java.lang.System.setSecutiryManager (SecutrityManager sm) java.security.Policy.setPolicy(Policy p) public static Policy java.security.Policy.getPolicy() UnsuppotedOperationExceptionが発生 なんの許可も含まれないPolicyオブジェクトを返却 など など 7

Slide 8

Slide 8 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited OSSでのセキュリティマネジャー使用例 https://www.cs.cmu.edu/~clegoues/docs/coker15acsac.pdf アプレットだけではなく、サーバーサイドでも使用されている 8

Slide 9

Slide 9 text

© 2025 Fujitsu Limited セキュリティマネジャー使用有無の確認 すべてのプログラムを自身・自社で開発している すべてのソースコードが存在・利用可能である サードパーティープログラムの依存関係を把握している ソースがない 勝手にサードパーティライブラリがアップデート ソース検索すればよい jdeprscanコマンドが利用可能 9

Slide 10

Slide 10 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited jdeprscan コマンド JDK(OpenJDK)に含まれる標準ツール 使用しているdeprecation機能を検出する jarファイル、フォルダー、および単一クラスが対象 セキュリティマネジャー専用ツールではない 10

Slide 11

Slide 11 text

© 2025 Fujitsu Limited アジェンダ セキュリティマネジャー廃止 サンドボックスとは クラウドネイティブでのサンドボックス サマリ 11

Slide 12

Slide 12 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited セキュリティマネジャーのユースケース テスト(assert機能) アーキテクチャーの制限解除 サードパーティライブラリの動作制限 アプレットの動作制限 想定外用途 想定用途 サンドボックス 12

Slide 13

Slide 13 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Eclipse IDEの使用例(アーキテクチャ制限) Eclipse IDEではAntをライブラリとして使っている Antライブラリ内では回復不能状態になると System.exit()を呼ぶ Eclipse IDEは、Ant呼び出し時に、System.exit()の 呼び出しを動作制限 System.setSecurityManager(new AnetSecurityManager(originalSM)); // Antの実行 finally { System.setSecurityManager(originalSM); } 13

Slide 14

Slide 14 text

© 2025 Fujitsu Limited サンドボックスの経緯 信頼できないコード(アプレット)への対策 コードが実行できることを制限する サーバーサイドでは、通常、信頼できるコードが動いている サーバーサイドにおける危険は、信頼できないコードではなく 信頼できるコードに含まれる脆弱性をつく 悪意のあるデータが送られてくること JEP 411 / 486 のモチベーション Javaに導入された動機 時代を経ると 14

Slide 15

Slide 15 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited サードパーティーライブラリの動作制限 https://x.com/Cryolite/status/1774300154566455736 https://xkcd.com/2347/ xz事件 Java黎明期は想定してなかった? Javaエコシステムの複雑化とともに、防御が必要なケースも 15

Slide 16

Slide 16 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited サンドボックスの分類 Shallow サンドボックス Deep サンドボックス Simple Deep サンドボックス Path-Dependent Deep サンドボックス Thread-Dependent Deep サンドボックス サンドボックス 16

Slide 17

Slide 17 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Shallow / Deep サンドボックス main コール スタック Shallow Sandboxによる制限 (fooの呼出し) foo read Deep Sandboxによる制限 (readの呼出し) サンドボックス対象コード 17

Slide 18

Slide 18 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Path-Dependent Deep サンドボックス foo read bar経由の 呼び出しは制限 bar サンドボックス対象コード foo経由の 呼び出しは通過 main 18

Slide 19

Slide 19 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Path-Dependent サンドボックスの問題 性能面でのオーバーヘッド セキュリティコンテキスト追跡の難しさ スレッドプール バーチャルスレッド 19

Slide 20

Slide 20 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Javaポリシーファイルの例 https://docs.oracle.com/javase/jp/21/security/permissions-jdk1.html grant signedBy "sysadmin", codeBase "file:/home/sysadmin/*" { permission java.security.SecurityPermission "Security.insertProvider.*"; permission java.security.SecurityPermission "Security.removeProvider.*"; permission java.security.SecurityPermission "Security.setProperty.*"; }; grant principal javax.security.auth.x500.X500Principal "cn=Alice" { permission java.io.FilePermission "/home/Alice", "read, write"; }; 機能が豊富になると設定が複雑になる 誰に許可 するか 何にどの操作を 許可するか 20

Slide 21

Slide 21 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Path-Dependent サンドボックスの設定 何を誰に許可するかという細かな設定が可能 だけど、設定が複雑 複雑さは脆弱性の源 一見、セキュリティの向上に役立つ セキュリティの低下 21

Slide 22

Slide 22 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited 制限対象の指定方法 ことを 制限or禁止 3要素がすべて指定できるとは限らない 誰に どのコード が対象か? 例: 信頼できないコード 何を どのリソース が対象か? 例: /etc/passwd どうする どの操作 が対象か? 例: write 22

Slide 23

Slide 23 text

© 2025 Fujitsu Limited アジェンダ セキュリティマネジャー廃止 サンドボックスとは クラウドネイティブでのサンドボックス サマリ 23

Slide 24

Slide 24 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited コンテナ(Linux)の防御壁 namespace プロセス capability cgroup AppArmor seccomp カーネル 本資料で 紹介 24

Slide 25

Slide 25 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited クラウドネイティブ型のサンドボックス Secure Computing Mode seccomp Linuxカーネルが提供している機能 システムコールを制限可能 AppArmor Linuxカーネルが提供している機能 使用できるリソースを制限可能 Docker/Kubernetes seccompやAppArmorを利用したサンドボックスを提供 25

Slide 26

Slide 26 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited seccomp – 防御例 CVE-2022-0185 https://jfrog.com/blog/the-impact-of-cve-2022-0185-linux-kernel-vulnerability-on-popular-kubernetes-engines/ unshareの脆弱性をseccompで防御 26

Slide 27

Slide 27 text

© 2025 Fujitsu Limited seccompで制限・許可フィルタリング ユーザー空間 カーネル空間 read() 結果 エラー プロセス ファィル write() read() seccomp 許 可 制 限 © 2025 Fujitsu Limited 27

Slide 28

Slide 28 text

© 2025 Fujitsu Limited seccomp システムコールのパラメタ値でフィルタリング可能だが pass-by-valueで渡せる値だけ フィル名などの文字列でフィルタリングはできない open(“foo.txt”, O_RDWR)は、実際にはポインタが渡される。 ➔open(0x1234, 2) カーネルモジュールで動作 制限・許可するシステムコールを指定する Docker/Kubernetesでも利用可能 注意事項 28

Slide 29

Slide 29 text

© 2025 Fujitsu Limited TOCTOUの制限 ユーザー空間 カーネル空間 上書き open(0x1234, 0x1) open(0x1234, 0x1) © 2025 Fujitsu Limited スレッドA スレッドB メモリ Time of Check Time of Use seccomp コピー (上書き後のデータ) コピー 29

Slide 30

Slide 30 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited seccompで利用可能な代表的処理 SCMP_ACT_KILL_PROCESS: SIGSYSでプロセス終了 SCMP_ACT_ERRNO: 呼出しがエラーになる SCMP_ACT_LOG: ログされる(ホワイトリスト作成が可能) SCMP_ACT_ALLOW: 何も影響なし ・・・ https://man7.org/linux/man-pages/man3/seccomp_init.3.html 30

Slide 31

Slide 31 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited seccompのdockerでの利用例 { "defaultAction": "SCMP_ACT_ALLOW", " archMap" : [ { "architectures": "SCMP_ARCH_X86_64" } ], "syscalls": [ { "names" : [ "write" ], "action" : "SCMP_ACT_ERRNO" } ] } $ docker run --security-opt seccomp=write-error.json image 設定ファイル例 (write-error.json) dockerコマンド例 31

Slide 32

Slide 32 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmor カーネルモジュールで動作 制限・許可するリソースを指定する マウントデバイス ファイル・ディレクトリ シグナル ソケット 事前にリソースのリストをプロファイルとして登録する Docker/Kubernetesでも利用可能 32

Slide 33

Slide 33 text

© 2025 Fujitsu Limited AppArmorの仕組み ユーザー空間 カーネル空間 結果 エラー プロセス ファィル AppArmor © 2025 Fujitsu Limited profile A profile B read(“foo”) read(“bar”) apparmor _parser プロファイルの登録 33

Slide 34

Slide 34 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmorのdockerでの利用例 #include profile my-profile { #include # /tmp/specific-dirへの書き込みを禁止 deny /tmp/specific-dir/ rw, } $ docker run --security-opt apparmor=my-profile image 設定ファイル例 (my-profile) dockerコマンド例 34

Slide 35

Slide 35 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmor動作モード enforce モード プロファイルを適用する complain モード ログされるだけで制限されない ログ結果からホワイトリストの作成が可能 35

Slide 36

Slide 36 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited seccomp notify ただし、フィルタープログラムは自作しなければならない seccompからフィルタープログラム(ユーザ空間)へ通知 フィルタープログラムで実施可否を判断 Pass-By-Referenceまでチェック可能 36

Slide 37

Slide 37 text

© 2025 Fujitsu Limited seccomp notify 大まかな流れ ユーザー空間 カーネル空間 プロセス © 2025 Fujitsu Limited フィルタープログラム seccomp システムコール呼出し フィルターに通知 フィルター結果を返却 OK/NG OKならシステムコールを実施 結果を返却 システムコール 実施 5 1 4 2 3 1 2 3 4 5 37

Slide 38

Slide 38 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited システムコールパラメタ通知の仕組み UNIX ソケット 通知用 FD メモリ open(0x1234, O_RDWR) プロセス seccomp 0x1234: “/tmp/abc” 1 4 メモリ読込み (0x1234) “/tmp/abc” 5 6 判定結果 3 2 通知用FDの情報 フィルタープログラム PID,SC種別(open), 引数(0x1234) などの情報 38

Slide 39

Slide 39 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited フィルタープログラムをJavaで書く seccompのI/Fはシステムコール中心なので、 本来はCプログラムで書く 最近のJavaでは、FFMでシステムプログラミングが可能 #include ... struct msghdr msg = {0}; msg.msg_iov = &io; if (recvmsg(socfd, &msg, 0) < 0) printf("Failed to receive message¥n"); private static final MemoryLayout MSGHDR_LAYOUT = MemoryLayout.structLayout( ValueLayout.ADDRESS.withName("msg_name"), ValueLayout.JAVA_INT.withName("msg_namelen"), MemoryLayout.paddingLayout(4), ValueLayout.ADDRESS.withName("msg_iov"), ... MemorySegment msg = Arena.global().allocate(MSGHDR_LAYOUT); msg.fill((byte)0); msg.set(ADDRESS, MSGHDR_LAYOUT.byteOffset(PathElement.groupElement("msg_iov")), io); if ( recvmsgHandle.invokeExact(sockfd, msg, 0) < 0) { throw new Exception("Failed to receive message"); Cプログラム pure Javaプログラム https://gist.github.com/kazumura/aae857e754cfbc30283aa688d52f1ac7 39

Slide 40

Slide 40 text

© 2025 Fujitsu Limited アジェンダ セキュリティマネジャー廃止 サンドボックスとは クラウドネイティブでのサンドボックス サマリ 40

Slide 41

Slide 41 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited サンドボックス比較 フィルター機能 コンテナ 連携 設定 難易度 Java 親和性 誰に 何を どうする Java SM 複雑 難しい 良好 seccomp 簡単 やさしい ない AppAromor やや複雑 やさしい ない seccomp notify やる気 次第 やる気 次第 簡単 かなり 難しい かなり ない 可 設定は簡単だが, フィルタープログラムを 自作する必要あり 不可 設定可 不可 41

Slide 42

Slide 42 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited サマリ セキュリティマネージャからの教訓 複雑さはセキュリティホールになりがち 豊富な機能は想定外の使われ方につながる サーバーサイドでサンドボックスが必要かは議論の余地あり カーネルスペースで動作 Javaプログラムからシステムコールとの紐づけは難しい seccomp/AppAromorは比較的軽量 使うならホワイトリスト型 難易度・複雑度・セキュリティ要件などから判断 42

Slide 43

Slide 43 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Question ? Question? 43

Slide 44

Slide 44 text

© 2025 Fujitsu Limited © 2025 Fujitsu Limited Fujitsu Restricted Thank You