Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用

 セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用

Avatar for Kenji Kazumura

Kenji Kazumura

June 07, 2025
Tweet

More Decks by Kenji Kazumura

Other Decks in Programming

Transcript

  1. 2025/06/07 数村憲治 © 2025 Fujitsu Limited JJUG CCC Spring 2025

    @kkzr セキュリティマネジャー廃止と クラウドネイティブ型 サンドボックス活用
  2. © 2025 Fujitsu Limited 自己紹介 Jakarta EE 仕様策定委員 MicroProfile ステコミ委員

    JCP Executive Committee メンバー Eclipse Foundation ボードディレクター OCX、JakartaOne、JJUGなどで登壇 3
  3. © 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
  4. © 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
  5. © 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
  6. © 2025 Fujitsu Limited © 2025 Fujitsu Limited jdeprscan コマンド

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

    アーキテクチャーの制限解除 サードパーティライブラリの動作制限 アプレットの動作制限 想定外用途 想定用途 サンドボックス 12
  8. © 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
  9. © 2025 Fujitsu Limited © 2025 Fujitsu Limited サードパーティーライブラリの動作制限 https://x.com/Cryolite/status/1774300154566455736

    https://xkcd.com/2347/ xz事件 Java黎明期は想定してなかった? Javaエコシステムの複雑化とともに、防御が必要なケースも 15
  10. © 2025 Fujitsu Limited © 2025 Fujitsu Limited サンドボックスの分類 Shallow

    サンドボックス Deep サンドボックス Simple Deep サンドボックス Path-Dependent Deep サンドボックス Thread-Dependent Deep サンドボックス サンドボックス 16
  11. © 2025 Fujitsu Limited © 2025 Fujitsu Limited Shallow /

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

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

    性能面でのオーバーヘッド セキュリティコンテキスト追跡の難しさ スレッドプール バーチャルスレッド 19
  14. © 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
  15. © 2025 Fujitsu Limited © 2025 Fujitsu Limited Path-Dependent サンドボックスの設定

    何を誰に許可するかという細かな設定が可能 だけど、設定が複雑 複雑さは脆弱性の源 一見、セキュリティの向上に役立つ セキュリティの低下 21
  16. © 2025 Fujitsu Limited © 2025 Fujitsu Limited 制限対象の指定方法 ことを

    制限or禁止 3要素がすべて指定できるとは限らない 誰に どのコード が対象か? 例: 信頼できないコード 何を どのリソース が対象か? 例: /etc/passwd どうする どの操作 が対象か? 例: write 22
  17. © 2025 Fujitsu Limited © 2025 Fujitsu Limited コンテナ(Linux)の防御壁 namespace

    プロセス capability cgroup AppArmor seccomp カーネル 本資料で 紹介 24
  18. © 2025 Fujitsu Limited © 2025 Fujitsu Limited クラウドネイティブ型のサンドボックス Secure

    Computing Mode seccomp Linuxカーネルが提供している機能 システムコールを制限可能 AppArmor Linuxカーネルが提供している機能 使用できるリソースを制限可能 Docker/Kubernetes seccompやAppArmorを利用したサンドボックスを提供 25
  19. © 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
  20. © 2025 Fujitsu Limited seccompで制限・許可フィルタリング ユーザー空間 カーネル空間 read() 結果 エラー

    プロセス ファィル write() read() seccomp 許 可 制 限 © 2025 Fujitsu Limited 27
  21. © 2025 Fujitsu Limited TOCTOUの制限 ユーザー空間 カーネル空間 上書き open(0x1234, 0x1)

    open(0x1234, 0x1) © 2025 Fujitsu Limited スレッドA スレッドB メモリ Time of Check Time of Use seccomp コピー (上書き後のデータ) コピー 29
  22. © 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
  23. © 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
  24. © 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmor カーネルモジュールで動作

    制限・許可するリソースを指定する マウントデバイス ファイル・ディレクトリ シグナル ソケット 事前にリソースのリストをプロファイルとして登録する Docker/Kubernetesでも利用可能 32
  25. © 2025 Fujitsu Limited AppArmorの仕組み ユーザー空間 カーネル空間 結果 エラー プロセス

    ファィル AppArmor © 2025 Fujitsu Limited profile A profile B read(“foo”) read(“bar”) apparmor _parser プロファイルの登録 33
  26. © 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmorのdockerでの利用例 #include

    <tunables/global> profile my-profile { #include <abstractions/base> # /tmp/specific-dirへの書き込みを禁止 deny /tmp/specific-dir/ rw, } $ docker run --security-opt apparmor=my-profile image 設定ファイル例 (my-profile) dockerコマンド例 34
  27. © 2025 Fujitsu Limited © 2025 Fujitsu Limited AppArmor動作モード enforce

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

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

    © 2025 Fujitsu Limited フィルタープログラム seccomp システムコール呼出し フィルターに通知 フィルター結果を返却 OK/NG OKならシステムコールを実施 結果を返却 システムコール 実施 5 1 4 2 3 1 2 3 4 5 37
  30. © 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
  31. © 2025 Fujitsu Limited © 2025 Fujitsu Limited フィルタープログラムをJavaで書く seccompのI/Fはシステムコール中心なので、

    本来はCプログラムで書く 最近のJavaでは、FFMでシステムプログラミングが可能 #include <sys/socket.h> ... 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
  32. © 2025 Fujitsu Limited © 2025 Fujitsu Limited サンドボックス比較 フィルター機能

    コンテナ 連携 設定 難易度 Java 親和性 誰に 何を どうする Java SM 複雑 難しい 良好 seccomp 簡単 やさしい ない AppAromor やや複雑 やさしい ない seccomp notify やる気 次第 やる気 次第 簡単 かなり 難しい かなり ない 可 設定は簡単だが, フィルタープログラムを 自作する必要あり 不可 設定可 不可 41
  33. © 2025 Fujitsu Limited © 2025 Fujitsu Limited サマリ セキュリティマネージャからの教訓

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