Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

異種OS機能連携による セキュアコンテナ実現の検討/comsys2022

await
December 05, 2022

異種OS機能連携による セキュアコンテナ実現の検討/comsys2022

comsys2022で発表したスライド

await

December 05, 2022
Tweet

Other Decks in Technology

Transcript

  1. サンドボックスを適用したコンテナの課題 オーバーヘッドの増加 [1] - 仮想マシン利用 (kata container) - システムコール検査 (gvisor)

    コンテナ特性である「軽量さ」が損なわれる 5 [1] Yuki Nakata, Katsuya Matsubara, Ryosuke Matsumoto Proc. of the 14th IEEE/ACM International Conference on Utility and Cloud Computing (UCC) (15) 1-10 2021年12月
  2. 異種OSの選定条件 1. Linuxアプリケーションが実行可能 - LinuxコンテナではLinuxアプリケーションが動作 - Linuxアプリケーションを互換実行する機能を持つ 2. Linuxと同等の隔離技術をもつ -

    LinuxコンテナはLinuxの機能に依存 - Linuxと同等のリソース制限・隔離機能(定義1)を持つ 3. コンテナに利用できるセキュリティ機能を持つ - サンドボックスの要件を満たすようなセキュリティ機構を持つ 11
  3. アプローチ: 異種OSとしてFreeBSDを採用 1. FreeBSD LinuxulatorというLinuxバイナリ互換実行機能がある 2. FreeBSD jailというコンテナ型仮想化技術が利用できる 3. FreeBSD

    Capsicum/Casperというセキュリティ機構を持つ FreeBSD上でセキュアコンテナ実現可能性について検討 - PaaSやFaaSにおける利用を前提 12
  4. FreeBSD アプリケーション
 (Linuxバイナリ)
 Linuxulator
 Linuxシステムコール
 インタフェース
 Linux Rootfs
 /
 proc


    usr
 …
 libc
 libXX
 libYY
 lib
 システムコール実 行
 FreeBSD システムコール
 Linuxアプリケーション互換実行の実現(アプローチ1に関連) Linuxulator - FreeBSDで利用できる Linuxのエミュレータ - Linuxバイナリの ネイティブ実行が可能
  5. FreeBSD アプリケーション
 (Linuxバイナリ)
 Linuxulator
 Linuxシステムコール
 インタフェース
 Linux Rootfs
 /
 proc


    usr
 …
 libc
 libXX
 libYY
 lib
 システムコール実 行
 FreeBSD システムコール
 Linuxアプリケーション互換実行の実現(アプローチ1に関連) Linuxulator - FreeBSDで利用できる Linuxのエミュレータ - Linuxバイナリの ネイティブ実行が可能 ライブラリの参照はLinux Rootfs から行う
  6. FreeBSD アプリケーション
 (Linuxバイナリ)
 Linuxulator
 Linuxシステムコール
 インタフェース
 Linux Rootfs
 /
 proc


    usr
 …
 libc
 libXX
 libYY
 lib
 システムコール実 行
 FreeBSD システムコール
 Linuxアプリケーション互換実行の実現(アプローチ1に関連) Linuxulator - FreeBSDで利用できる Linuxのエミュレータ - Linuxバイナリの ネイティブ実行が可能 FreeBSDとLinuxの システムコール対応付け
  7. FreeBSD アプリケーション
 (Linuxバイナリ)
 Linuxulator
 Linuxシステムコール
 インタフェース
 Linux Rootfs
 /
 proc


    usr
 …
 libc
 libXX
 libYY
 lib
 システムコール実 行
 FreeBSD システムコール
 Linuxアプリケーション互換実行の実現(アプローチ1に関連) Linuxulator - FreeBSDで利用できる Linuxのエミュレータ - Linuxバイナリの ネイティブ実行が可能 Apache、MySQL、Redis などが動作[2] PaaS, FaaSで十分利用可能 アプリケーションからは Linux環境に見える [2] freebsd.org. [LinuxApps]. https://wiki.freebsd.org/LinuxApps, (アクセス: 2022-12-5)
  8. FreeBSDにおける隔離環境の実現 (1/2) (アプローチ2に関連) リソース制限機能 - rctl、cpusetを用いてLinuxと同等の機能 リソース隔離機能 - FreeBSD jailを用いる

    (FreeBSDで利用できるコンテナ型仮想化技術 ) - プロセス - ユーザ Linuxとは仕様が異なるため、 これら差異の対策を検討 17 制限機能 Linux FreeBSD CPUの利用時間 cgroup cpu rctl cputime CPUのコア数制限 cgroup cpuset cpuset 利用できるメモリ制限 cgroup memory rctl memoryuse 隔離機能 Linux FreeBSD プロセス namespace △ jail ユーザ namespace 対応なし ディレクトリ chroot jail ネットワーク namespace/veth vnet Linux, FreeBSDにおけるリソース制限機能 Linux,FreeBSDにおけるリソース隔離機能
  9. FreeBSDにおけるプロセス隔離 実現検討 FreeBSDとLinux共に プロセス情報は分離 PIDの番号付けが異なる - jailではホストとjail間で連番 - Linuxではコンテナ内で1から始まる 19

    FreeBSDにおける隔離環境の実現に関連 jail内でのpsコマンド実行 PaaS, FaaSにおけるほとんどのアプリケーションは特定のPIDに依存していない PaaSやFaaSで利用するにあたりこの差異は問題ないと考える Linuxコンテナでのpsコマンド実行
  10. FreeBSDにおけるユーザ隔離 実現検討 20 FreeBSDにおける隔離環境の実現に関連 FreeBSDとLinuxでユーザ名は重複可能 UID/GIDの管理方法が異なる - jailではホスト, jail間で UID/GIDは共通

    - Linuxではコンテナの中と外で 異なるUID/GIDを設定 UID/GIDが重複するとシグナルやプロセス間通信に影響がでる 各jailに対して割り当てるUID/GIDの範囲を重複しないように設定する必要がある PaaSやFaaSで利用するにあたりこの差異は対策可能と考える Linux: ユーザ隔離における UID/GID FreeBSD: ユーザ隔離における UID/GID
  11. FreeBSD Capsicumサンドボックス サンドボックスによる制約 - ファイルやソケットなどのopenが不可 - 一部システムコールの発行に制限 - さらに、利用できるシステムコールの制限をかけることができる -

    サンドボックスの隔離は子プロセスにも引き継がれる - Capsicumの適用はアプリケーションがコードで対応する必要がある Capsicumを利用して, Linuxコンテナに対してサンドボックスの適用を実現 22 例: pingにおけるソケットに対する操作の制 限 [3] 異種OSのセキュリティ機構適用の実現 (課題3に関連) [3] RTEMS(2011) rtems-libbsd[ping.c] https://github.com/RTEMS/rtems-libbsd/blob/master/freebsd/sbin/ping/ping.c (アクセス: 2022-12-5)
  12. コンテナへCapsicum/Casper適用の課題 アプリケーションが自ら適用する設計 - 通常であればコードの改変を行う - サンドボックスの適用 - サンドボックスに入る前に必要なファイルを開いておく - casper関数の利用

    - Linuxulatorを利用するため、FreeBSD上でLinuxバイナリの改変が困難 バイナリの改変をせず、Capsicum/Casperを透過的に適用する必要がある 24 異種OSのセキュリティ機構適用の実現 (課題3に関連)
  13. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 Linuxulator
 システムコール
 変換
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行

  14. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 アプリケーションに必要バイナリ、ファイル、 ディレクトリなどを予め開いておく Linuxulator
 システムコール
 変換

  15. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 アプリケーションに必要バイナリ、ファイル、 ディレクトリなどを予め開いておく Linuxulator
 システムコール
 変換
 libpreopen
 予めファイルやディレクトリを開いておき、 
 open()呼び出し時はすでに開いてあるファイルをアプリケー ションに渡す
 アプリケーションから呼び出された open()は内部でopenat() に変換される

  16. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 サンドボックスが子プロセスに 引き継がれることを利用 親プロセスでサンドボックスに入っておき、 子プロセスでアプリケーションを起動 Linuxulator
 システムコール
 変換

  17. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 サンドボックス内ではバイナリにアクセスができない (ファイルのオープンができないため) 予めバイナリを開いておき、FDからexecを行う Linuxulator
 システムコール
 変換

  18. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 ライブラリも通常のアクセスができなくなる 予めリンカ自体もファイルとして開いておく Linuxulator
 システムコール
 変換

  19. FreeBSD Capsicumの透過的な適用
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 アプリケーション
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 システム
 コール実行
 …
 workdir
 Linuxulator
 システムコール
 変換
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行

  20. FreeBSD Capsicumの透過的な適用(ファイルアクセス) 
 コンテナランタイム
 プロセス作 成
 Jail・rctl適用
 コンテナプロセス
 Capsicumサンドボックス
 バイナリ・ファイル・


    ディレクトリを開く
 Linux Rootfs
 /
 App bin
 lib
 サンドボックス化
 usr
 アプリケーション
 open(…) …
 workdir
 リンカ 事前に開いた
 リンカでリンク
 FDから
 バイナリ実行
 libpreopenにより
 open()からopenat()に変換
 open()はlibpreopenによりopenat()に変換され、 すでに開かれているファイルへのアクセスとなる Linuxulator
 システムコール
 変換

  21. コンテナランタイム
 1コンテナ
 FreeBSD Capsicum +Casperの透過的適用による動的なリソースアクセス 
 プロセス作 成
 コンテナプロセス
 Capsicumサンドボックス


    Linux 
 Rootfs
 /
 App bin
 lib
 usr
 アプリケーション
 アクセス
 …
 workdir
 リンカ 呼び出し
 内容の検査
 libcasper
 関数呼び出しのフック・ 
 casperへのリダイレクト
 Casperプロセス
 FreeBSD上の
 OSリソースへの
 アクセス
 OSリソース
 リンカの仕組みを使い、自作ライブラリを利用 グローバル空間のアクセスを含む関数を 内部でcasperライブラリを経由
  22. コンテナランタイム
 1コンテナ
 FreeBSD Capsicum +Casperの透過的適用による動的なリソースアクセス 
 プロセス作 成
 コンテナプロセス
 Capsicumサンドボックス


    Linux 
 Rootfs
 /
 App bin
 lib
 usr
 アプリケーション
 アクセス
 …
 workdir
 リンカ 呼び出し
 内容の検査
 libcasper
 関数呼び出しのフック・ 
 Casperへのリダイレクト
 Casperプロセス
 FreeBSD上の
 OSリソースへの
 アクセス
 OSリソース
 Casperにより関数呼び出しの内容の検査 アクセスの代理実行を行う
  23. 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 36 CVEID Linuxulator 備考

    CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655 △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃
  24. CVEID Linuxulator 備考 CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655

    △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 37 Linuxulatorでは攻撃に2日かかっても成功せず
  25. CVEID Linuxulator 備考 CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655

    △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 38 Linuxulatorではプログラムの実行はできるが、攻撃は失敗
  26. CVEID Linuxulator 備考 CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655

    △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 39 Linuxulatorではライブラリが不足しており 攻撃コードのコンパイルが不可能
  27. CVEID Linuxulator 備考 CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655

    △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 40 Linuxulatorではライブラリが不足しており 攻撃コードのコンパイルが不可能
  28. CVEID Linuxulator 備考 CVE-2016-5195 ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655

    △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃 予備実験: Linuxulator利用によるカーネル脆弱性の回避 ◯: 攻撃を防げた △: 実行またはコンパイルができない 41 Linuxulatorではライブラリが不足しており 攻撃コードのコンパイルが不可能
  29. 予備実験: Linuxulator利用によるカーネル脆弱性の回避 42 Linuxulatorでは攻撃を回避することができた FreeBSDでのLinuxアプリケーション互換実行において、 脆弱性回避は十分可能である CVEID Linuxulator 備考 CVE-2016-5195

    ◯ Copy-on-Writeの脆弱性を利用した攻撃 CVE-2016-9793 ◯ sock_setsockopt()の脆弱性を利用した攻撃 CVE-2016-8655 △ CAP_NET_RAWを利用したuse-after-free攻撃 CVE-2017-6074 △ DCCPプロトコルを用いたuse-after-free攻撃 CVE-2017-1000112 △ UFO(UDP Fragmentation Offload)の脆弱性を利用した攻撃
  30. まとめ 48 課題: コンテナにおけるセキュリティと軽量さの両立 目的: コンテナの軽量さを最大限に維持しつつ、OSカーネル共有に起因する 脆弱性を回避できるセキュアコンテナの実現 提案: 1. 異種OS上でLinuxコンテナを互換実行

    a. FreeBSD jailによるLinuxコンテナのリソース制限・隔離機構の実現 b. LinuxulatorによるLinuxアプリケーションの互換実行 2. 異種OS独自のセキュリティ機構の適用 a. FreeBSD Capsicum/CasperをLinuxコンテナへ透過的適用