MS_DotNet4Sandbox - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

.NET4におけるサンドボックス化API

概要

  • セキュリティ・ポリシーと、それを決定する証拠は廃止された。

  • .NET 4 では、サンドボックス化されたアプリケーション・ドメインを作成するための、
    さまざまな API が AppDomain.CreateDomain メソッドに一本化された。

補足(.NET Core 以降、この仕組みは存在しない): 本ページが扱うのは
.NET Framework 4 における CAS(コード アクセス セキュリティ)の
整理
の話である。その後、土台ごと無くなった

【段階的な廃止の経緯】★
   .NET Framework 2.0 まで
     → 【証拠(Evidence)】+【セキュリティ ポリシー】で
       アセンブリの権限を決める仕組みがあった
       (マイコンピュータ / ローカル イントラネット /
         インターネット ゾーン ごとに権限を変える)

   .NET Framework 4.0(本ページの時点)
     → 【セキュリティ ポリシーが廃止】★
     → サンドボックスは
       AppDomain.CreateDomain(name, evidence, setup, grantSet, ...)
       に一本化された
     → 併せて【透過的セキュリティ(Security Transparency)】
       モデルが導入された

   .NET Framework 4.0 以降
     → CAS そのものが【非推奨】と明言される ★
       「CAS はセキュリティ境界として使用しないこと」

   .NET Core / .NET 5 以降
     → 【AppDomain の複数生成が不可能】★
       AppDomain.CreateDomain は
       PlatformNotSupportedException を投げる
     → 【CAS は完全に存在しない】
     → 部分信頼という概念自体がない
【なぜ廃止されたのか】★
   ・CAS は【信頼境界として機能しなかった】
     → 権限昇格の脆弱性が繰り返し発見された
     → 「同一プロセス内で信頼度の違うコードを
       安全に同居させる」ことは
       本質的に難しいと結論された
   ・XBAP / ClickOnce 部分信頼 /
     Silverlight といった
     【CAS を前提にした技術がすべて終息した】
【今、同じ目的を達するには】★
 ① 【プロセス分離】
      別プロセスで実行し、IPC で通信する
      → プロセスが落ちても本体は生き残る
      → 【最も現実的】★
 ② 【OS のサンドボックス機構】
      ・Windows: AppContainer / Job Object /
        低整合性レベル(Low IL)
      ・【Windows Sandbox】(Win10 Pro 以降)
 ③ 【コンテナ】(Docker / Windows コンテナ)★
      → 分離の単位をプロセスからコンテナへ
 ④ 【WebAssembly】
      → 言語ランタイム レベルのサンドボックス
      → 近年、プラグイン実行基盤として注目されている
 ⑤ 【AssemblyLoadContext】(.NET Core 以降)
      → AppDomain の代替だが
        【セキュリティ境界ではない】★
        あくまで
        「アセンブリの分離ロード・アンロード」のための仕組み
        (プラグインの動的読み込み/差し替えに使う)
【本ページのリンク先が挙げるメンバの現況】
   ExecuteAssembly           … 単一 AppDomain 内では動く
   DoCallBack                … .NET Core では【使えない】
   CreateInstanceAndUnwrap   … .NET Core では【使えない】
   MarshalByRefObject        … 型は残るが Remoting は廃止 ★
   Serializable / BinaryFormatter
                             → 【BinaryFormatter は
                               .NET 9 で完全に削除された】★
                               (デシリアライズ時の
                                任意コード実行の温床だったため)
                             → 代替は System.Text.Json 等

Tags: 移行, .NET開発, セキュリティ

⚠️ **GitHub.com Fallback** ⚠️