2026年1月22日 星期四

[研究]ASP.NET trust level、部分信任 (Partial Trust)、程式碼存取安全性 (Code Access Security, CAS)、.NET信任層級

[研究]ASP.NET trust level、部分信任 (Partial Trust)、程式碼存取安全性 (Code Access Security, CAS)、.NET信任層級 

2026-01-22

以下用 ASP.NET 的實務脈絡,把 Trust Level、部分信任(Partial Trust)、CAS(Code Access Security) 的關係一次講清楚,也會點出 哪些是歷史機制、哪些在新版本已經名存實亡。

一句話先講結論

ASP.NET Trust Level 是「套用在 Web App 上的一組 CAS 權限集合」

  • Partial Trust:靠 CAS 限制程式能做什麼
  • Full Trust:幾乎不套用 CAS 限制
  • .NET 4.5+ / ASP.NET 4.6+:CAS 對 Web App 幾乎已廢棄


一、名詞各自是什麼?

1️⃣ Code Access Security(CAS)

最底層的安全模型(.NET Framework 傳統機制)

  • 目的:限制 程式碼「能做什麼」
  • 判斷依據:
    • 程式碼來源(URL、Strong Name、Zone)
    • 授與對應的 Permission
  • 常見 Permission:
    • FileIOPermission
    • SecurityPermission
    • ReflectionPermission
    • WebPermission

📌 重點

CAS 是一套「在 CLR 層級執行的安全沙盒」

2️⃣ Partial Trust(部分信任)

CAS 的一種實際使用模式

  • 表示:
    • 程式 不是 Full Trust
    • 只能使用 被授權的 CAS Permissions
  • 典型使用場景(過去):
    • Shared Hosting
    • 多租戶 IIS
    • 不信任的第三方元件

📌 Partial Trust ≠ ASP.NET 專屬

它是 CAS 的一種狀態


3️⃣ ASP.NET Trust Level

ASP.NET 對 CAS 的「封裝設定」

  • 用來決定:
    • 這個 Web Application 跑在 哪一組 CAS 權限集合
  • 設定方式:

<trust level="Medium" />

📌 Trust Level 不是新的安全模型

它只是 把 CAS PermissionSet 包成好用的名稱

4️⃣ .NET 信任層級 (Framework Trust Level)

定義:.NET 框架本身支援 信任層級 的概念,用來定義程式碼可以執行的權限範圍。

與 ASP.NET 的對應:

ASP.NET 透過 <trust> 將 ASP.NET 層級的設定,轉換為 .NET CAS 權限集。

也就是說:


ASP.NET Trust Level → 對應 .NET CAS 權限集 → 決定程式碼可做的操作

實務注意:

  • 在 Full Trust 下,CAS 幾乎不會限制應用程式。
  • 在 Medium / Low Trust 下,CAS 會阻擋部分 API,如 Reflection、IO 操作等。

二、ASP.NET Trust Level 與 CAS 的對應關係

ASP.NET Trust Level 本質 使用的安全模型
Full 無限制 幾乎不使用 CAS
High 少量限制 CAS
Medium 明顯限制 CAS
Low 極度限制 CAS
Minimal 幾乎不能用 CAS

👉 Trust Level = 預先定義好的 CAS PermissionSet


三、實際例子(Partial Trust 下會發生什麼)

🚫 在 High Trust 常見會失敗的事情

🚫 在 Medium Trust 常見會失敗的事情

範例:

File.ReadAllText(@"C:\test.txt");   // ❌ FileIOPermission

範例:

Assembly.LoadFrom("xxx.dll");       // ❌ Reflection / Load 權限

範例:

Environment.Exit(0);                // ❌ SecurityPermission

範例:

[DllImport("user32.dll")]
static extern int MessageBox(...);  // ❌ UnmanagedCode

📌 這些錯誤都是 CAS 在擋,不是 IIS 在擋

四、ASP.NET Trust Level 設定在哪?

Web.config

<system.web>
  <trust level="Medium" originUrl="" />
</system.web>

Machine.config(全機器)

<trust level="Full" />

五、重要歷史轉折(一定要知道)

🔥 .NET 4 之後的重大變化

時期 狀況
.NET 2.0–3.5 CAS 是主流
.NET 4.0 CAS 預設 關閉多數 Policy
.NET 4.5+ ASP.NET Partial Trust 幾乎不再支援
ASP.NET Core ❌ 完全沒有 CAS

📌 Microsoft 官方立場


不再建議使用 CAS / Partial Trust

改用 OS / IIS / Container / Account-based Security


六、現代 ASP.NET 實務建議(重點)

❌ 不要再依賴

  • Partial Trust
  • Medium / Low Trust
  • CAS Permission


✅ 改用

層級 作法
OS 低權限 App Pool Identity
IIS Request Filtering / Handler
檔案 NTFS ACL
程式 Sandbox Process / Container
架構 Microservice / API 隔離

七、三者關係圖(文字版)

ASP.NET Trust Level
        ↓
   CAS PermissionSet
        ↓
  Partial Trust / Full Trust
        ↓
   CLR 在 Runtime 阻擋或放行

八、快速總結表

名詞 本質
CAS .NET Framework 的程式碼權限系統
Partial Trust 使用 CAS 限制程式能力
ASP.NET Trust Level ASP.NET 封裝的 CAS 設定組

********************************************************************************

在 High Trust 常見會失敗的事情 ?


一、High Trust 與 Full Trust 的核心差異

能力 High Trust Full Trust
CAS 啟用 ✅ 有 ❌ 幾乎無
Unmanaged Code
任意反射 ❌(有限)
任意檔案 IO ⚠️(有限)
操作系統層級

二、High Trust 下「常見會失敗」的事情(重點)

1️⃣ 呼叫 Unmanaged Code(最常見)

[DllImport("user32.dll")]
static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);

📛 結果

SecurityException:
Request for the permission of type 'System.Security.Permissions.SecurityPermission' failed.

📌 原因

  • High Trust 不包含 UnmanagedCode 權限
  • 所有 P/Invoke 都會失敗

2️⃣ 載入「未完全信任」的 Assembly

Assembly.LoadFrom(@"C:\temp\plugin.dll");

📛 可能錯誤

SecurityException: Request for ReflectionPermission failed

📌 原因

  • High Trust 仍限制:
  • 動態載入來源不明 DLL
  • 非 Strong Name Assembly

3️⃣ 反射存取 Non-Public 成員

typeof(MyClass)
  .GetField("_secret", BindingFlags.NonPublic | BindingFlags.Instance);

📛 原因

  • High Trust 僅允許 受限反射
  • 不允許任意存取 private / internal 成員

4️⃣ 嘗試提升權限(Assert / Demand)

new FileIOPermission(PermissionState.Unrestricted).Assert();

📛 結果

SecurityException

📌 原因

  • High Trust 不能提升自身權限
  • CAS 只允許向下使用,不允許自行放大


5️⃣ 操作其他 AppDomain / Process

Process.Start("cmd.exe");

📛 原因

  • 需要 SecurityPermission(ControlAppDomain / UnmanagedCode)
  • High Trust 不允許


6️⃣ 讀寫不在允許範圍內的檔案

File.WriteAllText(@"C:\Windows\test.txt", "x");

📛 結果

SecurityException: FileIOPermission

📌 說明

  • High Trust 通常只允許
    • App Root
    • 特定 temp / data 目錄
  • 不包含系統目錄


7️⃣ 使用需要 Full Trust 的第三方套件

📛 常見套件類型:

  • PDF / Office COM Interop
  • Image 處理(GDI+ 深度操作)
  • 系統層級監控
  • 舊版報表元件

📌 症狀

  • 在本機正常
  • 部署到 High Trust Host 就爆炸


三、High Trust「看似可以,其實有坑」的事情

✔ 有時可用(取決於實作)

  • Reflection(public only)
  • 部分 Environment 資訊
  • 網路存取(HTTP / HTTPS)

❌ 絕對不行

  • P/Invoke
  • COM Interop
  • Registry 任意存取
  • 操作 Windows Service


四、為什麼還會有 High Trust?

👉 歷史原因

  • Shared Hosting
  • 一台 IIS 跑多個客戶
  • Host 想保護 OS
  • 但 現代已不建議使用

五、實務建議(非常重要)

如果你現在遇到「High Trust 才會出錯」

請直接假設:

你需要 Full Trust

然後改用:

方案 說明
Full Trust App Pool 最直接
低權限帳號 + Full Trust 比 CAS 安全
Container / VM 真正隔離
API 外掛 把危險操作拆出去

六、快速對照表

行為 High Trust
File IO(App 資料夾)
HTTP 存取
Reflection(public)
Reflection(private)
P/Invoke
COM
Process.Start
Registry

(完)


沒有留言:

張貼留言