2010-08-16 79 views
1

我在我的系統3個部分組成:如何驗證與其他應用程序/ COM對象的Windows應用程序

  1. COM對象 - 提供服務的應用程序,具有FUNC1(),FUNC2()
  2. App1的 - 可信需要使用COM對象funcs中的應用(1和2)
  3. App2的 - 惡意應用,沒有被授權使用的func1(),u能se func2()這是沒有害的。

如何能在COM對象可以 「認證」 應用1,並允許它使用FUNC1()FUNC2()應用2拒絕FUNC1()訪問?

一種方法是通過只允許管理員用戶訪問func1(),但由於安全最佳實踐,這不是一個好的解決方案:以最少特權用戶運行。 App1只需要管理員訪問COM對象,App1中的任何安全漏洞都會給攻擊者Admin訪問權限。

這怎麼解決?

回答

1

一般而言,您應該更確切地定義如何分配(識別)允許使用來自其他「不良」應用程序的COM對象的「良好」應用程序。

如果你的COM對象是進程內服務器(這將在使用它的應用程序的地址空間中加載的DLL),那麼你可以讓「快&髒」的解決方案:內的DllMain可以測試加載你的DLL的exe文件的名稱。您可以將GetModuleFileNameNULL作爲第一個參數。如果一個「錯誤」的exe文件試圖加載你的dll,DllMain可以返回FALSE。您可以使用您的任何方法執行相同的測試,而不是DllMain

解決問題的最佳方法(我所看到的最好的方法)將是添加一個額外的方法到你的COM對象,你可以用它來授權調用者。例如,要使用諸如func1()之類的任何「祕密」功能,您可以要求呼叫方在之前調用另一個authorize()函數。調用者給你的COM對象作爲輸入參數authorize()一些可用於驗證調用者權限的信息。如果授權正常,authorize()將返回一個授權令牌(cookie),該授權令牌可以是您以後可以輕鬆驗證的任何內容。最好的令牌應該基於像digitaly簽名這樣的密碼算法。函數func1()可以有一個附加參數 - 從authorize1()收到的令牌(cookie)。這樣你就可以實現你想要的任何類型的授權。這種方式適用於任何類型的COM對象(不僅適用於進程內服務器)。

0

Windows安全性是基於用戶的,所以我不相信你可以在應用程序級別這樣做。如果用戶可以執行該功能,則兩個程序都可以執行該功能。

+0

你有什麼建議嗎我們還能做什麼? – Baget 2010-08-19 08:12:17

+0

您將需要依賴用戶級權限。也許將你的代碼分成2個dll並設置不同的文件級權限。您還可以爲您的界面設置註冊表權限,以限制誰可以訪問它。 – Mike 2010-08-20 17:50:54

1

我認爲@quip指的是支持許可的IClassFactory2接口集合。在這裏看到:

http://msdn.microsoft.com/en-us/library/ms680095(v=VS.85).aspx

文章每臺機器許可證倒是(這是不是你想要的)和這聽起來像你所尋找的運行許可證密鑰。

問題是,被授權的App1應該調用CoGetClassObject()來獲得一個實現IClassFactory2的對象,然後調用IClassFactory2 :: CreateInstanceLic()傳遞一個祕密密鑰,讓COM服務器知道它是授權的。這將依次使用適當的標誌實例化COM對象,該標誌指示可用於完全使用(假設有效的鍵)。如果傳入的密鑰無效,請初始化您的COM對象以供未經授權的客戶端使用。

未授權的App2將調用標準CoCreateInstance(),該函數在封面下調用CoGetClassObject()以獲取實現IClassFactory的對象,然後調用IClassFactory :: CreateInstance()。這個實現應該實例化你的COM對象,爲未經授權的客戶設置標誌。

相關問題