保護代理服務
代理服務預設只能供本機使用者使用,以及供啟用它之 Visual Studio 工作階段所涉及的程序使用。 在這些預設值下,代理服務的安全性考量與在這些程序中執行的其他程式碼並無不同,其中包括:
- 從威脅模型的觀點來看,在 Visual Studio 程序中執行的擴充功能會假設為完全信任。 程序用盡的擴充功能應該會將 Visual Studio 服務呼叫視為跨越信任界限。
- 您的程式碼必須在進入點驗證引數,以確認它們落在預期的模式/範圍中。
- 從硬碟讀取資料時,請考慮資料可能遭到竄改。
- 從網路或網際網路接收資料時,在剖析或還原序列化資料時請小心,以避免常見的弱點。
當您的服務向 ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients 旗標集註冊時,會套用數個重要的額外安全性考量。 本文的其餘部分著重於這些考量。
敏感性作業的授權檢查
取得授權服務
您的代理服務應該具有接受 AuthorizationServiceClient 做為參數的建構函式。 引數應該儲存在欄位中,並在您的服務 Dispose() 方法中處置。
class Calculator : ICalculator, IDisposable
{
private readonly AuthorizationServiceClient authorizationService;
internal Calculator(AuthorizationServiceClient authorizationService)
{
this.authorizationService = authorizationService;
}
public void Dispose()
{
this.authorizationService.Dispose();
}
}
您提供的服務工廠會稍微變更以支援這個新參數。 請勿將 BrokeredServiceFactory 提供給 IBrokeredServiceContainer.Proffer 方法,而是提供 AuthorizingBrokeredServiceFactory 委派。 此委派會收到您必須傳遞給代理服務的 AuthorizationServiceClient。
您提供程式碼的這項變更可能如下所示:
container.Proffer(
CalculatorService,
- (moniker, options, serviceBroker, cancellationToken) => new ValueTask<object?>(new CalculatorService()));
+ (moniker, options, serviceBroker, authorizationService, cancellationToken) => new ValueTask<object?>(new CalculatorService(authorizationService)));
使用授權服務
任何可能揭露敏感性資訊或變動使用者狀態的作業,都應該使用 AuthorizationServiceClient.AuthorizeOrThrowAsync 來檢查授權服務。
若要判斷呼叫端是否為程式碼的擁有者 (與 Live Share 主機的操作者身分識別相同),可以使用此程式碼:
private static readonly ProtectedOperation ClientIsOwner = WellKnownProtectedOperations.CreateClientIsOwner();
public ValueTask ResetOperationCounterAsync(CancellationToken cancellationToken)
{
// Resetting the counter should only be allowed if the user is the owner.
await this.authorizationService.AuthorizeOrThrowAsync(ClientIsOwner, cancellationToken);
// Proceed with the operation.
this.operationCounter = 0;
}
WellKnownProtectedOperations 類別中定義了各種其他授權層級。
當服務用戶端在相同電腦和使用者帳戶中執行時,一律會核准所有授權檢查。 它們也都已獲得 Live Share 來賓的核准,該來賓是以與主機相同的 Microsoft 帳戶運作。
當要求的作業未獲得授權時, AuthorizeOrThrowAsync 將會擲回 UnauthorizedAccessException。 Live Share 主機可能會通知擁有者嘗試失敗,讓主機有機會在辨識 ProtectedOperation 完成作業時授與完成作業所需的權限,讓用戶端上的後續嘗試可能會成功。
AuthorizationServiceClient 會在本機快取所有授權檢查,以便快速進行重複的授權檢查。 如果使用者的授權集變更 (例如 Live Share 主機變更來賓的授權),則會自動清除本機快取。
取用其他代理服務
當代理服務本身需要存取另一個代理服務時,它應該使用提供給其服務工廠的 IServiceBroker。 它不應該使用全域 Service Broker,因為不知道這個特定代理服務執行個體的內容,而且其用戶端必須啟用和叫用其他行為的授權。
如果我們的計算機服務需要其他代理服務來實作其行為,我們會修改建構函式以接受 IServiceBroker:
internal class Calculator : ICalculator
{
private readonly IServiceBroker serviceBroker;
private readonly AuthorizationServiceClient authorizationService;
internal class Calculator(IServiceBroker serviceBroker, AuthorizationServiceClient authorizationService)
{
this.serviceBroker = serviceBroker;
this.authorizationService = authorizationService;
}
}
這個額外的參數會影響您的服務工廠提供程式碼:
container.Proffer(
CalculatorService,
(moniker, options, serviceBroker, authorizationService, cancellationToken)
- => new ValueTask<object?>(new CalculatorService(authorizationService)));
+ => new ValueTask<object?>(new CalculatorService(serviceBroker, authorizationService)));
有限的代理服務可用性
當代理服務的用戶端是 Live Share 來賓時 (在主機擁有者的不同帳戶下),您的關係型 Service Broker 只會讓其他代理服務也能夠將 AllowTransitiveGuestClients 旗標設定為安全性預防措施。 若試圖開啟不符合資格的代理服務,則會擲回 UnauthorizedAccessException。
如果您的代理服務需要另一個缺少 AllowTransitiveGuestClients 旗標的代理服務,您可以使用全域 Service Broker 來取得它,但必須考慮到從它取得的代理服務不知道不受信任的來賓是最終用戶端。 您應該遵循下一節中有關呼叫其他 VS 服務或其他 API 的所有相同預防措施。
深入了解取用代理服務。
取用其他 VS 服務或其他 API
在公開給 Live Share 來賓的代理服務中,允許呼叫標準 Visual Studio 服務、第三方程式庫或標準 .NET API,但應該仔細撰寫這類呼叫,並先驗證所有輸入。
應仔細檢查檔案路徑或 URL,以確保檔案路徑有效,並落在來賓有權存取的預期子路徑內。
例如,如果您的代理服務允許根據路徑讀取或寫入檔案,則應該檢查路徑是否落在開啟的解決方案底下,而且如果適用,來賓實際上具有寫入權限。
在考慮到 ..
的情況下,正確驗證檔案路徑可能很難,而其他方法讓路徑看起來像是開頭為正確的前置詞,但接著會逸出允許的解決方案目錄。
請適當地使用上一節中所述的 AuthorizationServiceClient,在呼叫任何沒有內建授權檢查的 API 之前,判斷用戶端具有授權。 只有 Visual Studio 內建的代理服務才應該假設包含自己的授權檢查,這需仰賴您使用關係型 Service Broker 取得這些代理服務,如上一節所述。
所有其他 API,包括未代理的 Visual Studio 服務或透過全域 Service Broker 取得的代理服務,可能會在您指示它們時執行,而不論您的 Live Share 來賓授權層級為何,都務必進行自己的授權檢查,以保護 Live Share 主機的安全性。
避免從代理服務公開另一個 Visual Studio 代理服務在增加受攻擊面時已公開的功能。
跨代理服務執行個體共用狀態
當代理服務需要跨多個服務執行個體共用狀態時,此資料可能會公開給具有不同授權集合的多個使用者。 您的代理服務必須保護這些使用者之間的這項資料。 使用 STRIDE 模型來協助識別、分類及最終減輕威脅。
您可以決定將共用狀態視為受信任狀態,因此授與授權以在內部執行所需的任何動作 (例如,存取 VS 服務或使用全域 Service Broker)。 在這種情況下,它會成為個別代理服務執行個體的責任,以保護對其共用狀態進行的呼叫,以確保所有輸入都適合使用授權服務自己的使用者授權。
Microsoft 威脅模型化工具是保護共用狀態和使用者的實用工具。