首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 代碼存取安全性(CAS)第 1 部:部分信任用戶端與 PartialTrustClientBase 結構化權限請求設計

     編輯:關於.NET

CAS 核心觀念速覽

.NET Framework 定義 24 種安全權限(檔案 I/O、UI、反射、網路、資料存取等),組成權限集指派給組件。載入時依證據(來源/強名稱)授予權限。AppDomain 預設 FullTrust,本機代碼通常全權運行,缺乏沙箱保護。部分信任代碼嘗試存取無權資源拋出 SecurityException。CLR 執行堆疊巡查確保所有呼叫者具備權限;Assert 可終止巡查,但需擁有該權限與 SecurityPermissionFlag.Assertion。

.NET 3.5 客戶端 CAS 支援現況

僅允許 BasicHttpBinding、WSHttpBinding、WebHttpBinding 在部分信任下調用,且限無安全性或 Transport 安全;WSHttpBinding 禁用訊息安全/可靠傳訊/交易。綁定要求:執行權限 + Web 連線權限(目標 URI)。配置檔不得引用憑證存儲區(需 FullTrust)。

部分信任用戶端的 naïve 解法:Proxy Assert FullTrust

在 Proxy 類別標記 [PermissionSet(SecurityAction.Assert, Name="FullTrust")],隱藏 ClientBase<T> 需 FullTrust 的方法。前提:Proxy 組件本身獲授 FullTrust(透過 .NET Configuration 工具依強名稱授予,或放入 GAC 並標記 AllowPartiallyTrustedCallers)。契約介面須同屬該組件(WCF 要求上游呼叫鏈全為 FullTrust)。

[assembly: AllowPartiallyTrustedCallers]
[ServiceContract] public interface IMyContract { [OperationContract] void MyMethod(); }
[PermissionSet(SecurityAction.Assert, Name="FullTrust")]
public class MyContractClient : ClientBase<IMyContract>, IMyContract, IDisposable
{
    public void MyMethod() { Channel.MyMethod(); }
    public new void Close() { base.Close(); }
    void IDisposable.Dispose() { Close(); }
}

安全漏洞:繞過 CAS 的誘餌攻擊

部分信任用戶端無網路權限,卻透過 Proxy 呼叫 TCP 服務——Proxy 抑制了 WCF 的安全要求,讓惡意代碼繞過 CAS 限制。必須改為「結構化權限請求」:Proxy 僅在必要時 Assert FullTrust,並根據實際操作主動要求對應 CAS 權限。

PartialTrustClientBase<T> 核心設計

  • 建構子與 Close 明確 Assert FullTrust(壓制 WCF 綁定建構/開啟/關閉時的 FullTrust 要求)。
  • 隱藏 Channel 屬性,getter 內 Assert FullTrust。
  • 提供 protected object Invoke(string operation, params object[] args):
    1. 偵測非同步調用 → DemandAsyncPermissions
    2. 同步調用 → DemandSyncPermissions(委派 DemandClientPermissions)
    3. 程式碼 Assert FullTrust → 反射呼叫 Channel 方法
    4. 自動 RevertAssert
public abstract class PartialTrustClientBase<T> : ClientBase<T>, IDisposable where T : class
{
    [PermissionSet(SecurityAction.Assert, Name="FullTrust")]
    protected PartialTrustClientBase() { }
    // ... 其他建構子同樣 Assert

    protected object Invoke(string operation, params object[] args)
    {
        if (IsAsyncCall(operation)) DemandAsyncPermissions();
        DemandSyncPermissions(operation);
        CodeAccessSecurityHelper.PermissionSetFromStandardSet(StandardPermissionSet.FullTrust).Assert();
        try { return typeof(T).GetMethod(operation).Invoke(Channel, args); }
        finally { PermissionSet.RevertAssert(); }
    }
    // ...
}

原始 WCF 客戶端安全要求(圖 3)vs 結構化要求(圖 6)

場景原始 WCF 要求結構化要求
TCP 綁定執行 + 非受控代碼 + 不受限 DNS + Socket 連線執行 + 不受限 DNS + Socket 連線
IPC 綁定執行 + 非受控代碼 + 控制策略/證據執行 + 控制策略/證據
WS/WS-Dual/Basic/Web執行 + 非受控代碼 + Web 連線執行 + Web 連線 (Dual 另需 Web 接受回調 + 最小 ASP.NET 宿主)
MSMQ執行 + 非受控代碼執行 + MSMQ 發送權限
非同步/雙工/用戶名憑證協商控制策略/證據控制策略/證據
Windows 互動式憑證環境變數 USERNAME環境變數 USERNAME
Windows 替代憑證控制主體 + USERNAME控制主體
診斷追蹤非受控代碼 + COMPUTERNAMECOMPUTERNAME + 檔案 I/O (路徑發現/附加/寫入)
交易流FullTrust不受限分散式交易權限
憑證存取FullTrust列舉/開啟/列舉存儲區權限

關鍵改進:移除所有非受控代碼要求、FullTrust 降級為具體權限、新增 MSMQ/交易/憑證/追蹤的精確權限。

CodeAccessSecurityHelper 實作節錄

public static void DemandClientPermissions<T>(this ClientBase<T> proxy, string opName) where T : class
{
    DemandClientConnectionPermissions(proxy.Endpoint);
    DemandTransactionPermissions(proxy.Endpoint, opName);
    DemandTracingPermissions();
    DemandClientSecurityPermissions(proxy);
    DemandEnvironmentPermissions(proxy);
    DemandClientStorePermissions(proxy.Endpoint);
}

static void DemandClientConnectionPermissions(ServiceEndpoint ep)
{
    PermissionSet set = new PermissionSet(PermissionState.None);
    if (ep.Binding is NetTcpBinding)
    {
        set.AddPermission(new SocketPermission(NetworkAccess.Connect, TransportType.Tcp,
            ep.Address.Uri.Host, ep.Address.Uri.Port));
        set.AddPermission(new DnsPermission(PermissionState.Unrestricted));
    }
    // ... 其他綁定
    set.Demand();
}

static void DemandTransactionPermissions(ServiceEndpoint ep, string opName)
{
    bool flow = false, allowed = false;
    if (ep.Binding is NetTcpBinding)
        flow = (ep.Binding as NetTcpBinding).TransactionFlow;
    // ... 檢查其他綁定
    if (flow && Transaction.Current != null)
    {
        foreach (var op in ep.Contract.Operations)
        {
            if (opName != null && opName != op.Name) continue;
            foreach (var beh in op.Behaviors)
                if (beh is TransactionFlowAttribute attr && attr.Transactions != TransactionFlowOption.NotAllowed)
                    { allowed = true; break; }
            if (allowed) break;
        }
        if (allowed) new DistributedTransactionPermission(PermissionState.Unrestricted).Demand();
    }
}

雙工回調支援:PartialTrustDuplexClientBase<T,C>

依相同原理實作,額外處理回調端點的 Web 接受權限與最小 ASP.NET 宿主權限。

總結

PartialTrustClientBase 讓部分信任用戶端安全、正確地使用 WCF 全功能(含 TCP、IPC、MSMQ、交易、雙工、憑證、診斷),不再依賴 FullTrust,也不再暴露誘餌攻擊面。下一篇將處理部分信任服務與宿主端。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved