IE保護模式

IE瀏覽器的保護模式是Vista中的一個新功能,是類似用戶帳號控制(UAC)的一種安全功能,增強保護模式目的為進一步將保護模式限制為拒絕潛在攻擊者對敏感或個人信息的訪問

介紹保護模式

IE瀏覽器的保護模式是Vista中的一個新功能,是類似用戶帳號控制(UAC)的一種安全功能。在保護模式下,通過限制運行在IE進程下的代碼不能修改系統部分檔案,從而來保護計算機的安全。這樣,即使一個惡意網頁利用了IE或IE外掛程式中的一個代碼注入漏洞,注入的代碼也不能夠對系統造成破壞。

相關安全功能

在我們深入了解保護模式對IE外掛程式開發者意味著什麼之前,我們需要先快速了解一下相關的安全功能。

1.完整性級別和UIPI

Vista引入了一種叫做強制完整性級別的安全對象新屬性。分為四個級別:

系統:被作業系統組件使用,不應被應用程式所使用;

高:在提升的完全管理許可權下運行的進程;

中:正常方式啟動的進程;

低:被IE和Windows Mail使用來提供保護模式。

Windows中關於進程的信息包含它是使用哪一個完整性級別啟動的。一旦該進程啟動後這個級別永遠不會發生改變,它只能在進程被創建的時候被設定。一個進程的完整性級別具有以下三個主要的作用:

(1)這個進程所創建的任何安全對象具有與它相同的完整性級別。

(2)這個進程不能夠存取完整性級別比它高的資源。

(3)這個進程不能傳送Windows訊息到具有更高完整性級別的進程。

這不是一個完整的列表,但是以上所列的三個是對外掛程式具有最大影響的。前兩條防止一個低完整性的進程篡改IPC資源,例如共享記憶體,包含敏感數據或一個應用程式正常運行所需要的數據。最後一條被稱為用戶界面特權隔離(UIPI),被設計來防止類似粉碎視窗攻擊(shatter attack)之類的攻擊,在粉碎視窗攻擊中,攻擊者通過傳送給進程一個它不希望收到的訊息,從而導致它運行非信任的代碼。

啟用你的外掛程式和其他應用程式之間的通信

看到這兒,我們已經可以使用運行在IE進程中的代碼來處理所有檔案系統和註冊表了。下面我們看一個更複雜的話題,它也需要一個更複雜的解決方案:運行在一個更高完整性級別的另一個進程的IPC。我們將介紹兩種不同形式的IPC:核心對象和windows訊息。

1.創建一個IPC對象

當一個外掛程式和一個單獨的進程希望通信的時候,這種通信發生在兩個代碼之間,而不用經過IE封裝。NT安全API和強制性完整級別現在可以發揮它們的作用了,默認情況下從一個外掛程式到一個單獨的應用程式的通信是被阻擋的,因為這個應用程式運行在比IE更高的完整性級別。

如果這個單獨的應用程式創建了一個外掛程式需要使用的核心對象(例如,一個事件或互斥對象),在外掛程式存取它們之前,這個應用程式必須降低這個對象的完整性級別。這個應用程式可以使用安全API來修改對象的ACL來降低它的完整性級別。下面的代碼是從MSDN的文章“Understanding and Working in Protected Mode Internet Explorer”摘取的,將一個HANDLE賦給一個核心對象,並設定它的完整性級別為低。

// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity LPCWSTR LOW_INTEGRITY_SDDL_SACL_W = L"S:(ML; ; NW; ; ; LW)";

bool SetObjectToLowIntegrity( HANDLE hObject, SE_OBJECT_TYPE type = SE_KERNEL_OBJECT)

{

bool bRet = false;

DWORD dwErr = ERROR_SUCCESS; PSECURITY_DESCRIPTOR pSD = NULL;

PACL pSacl = NULL;

BOOL fSaclPresent = FALSE; BOOL fSaclDefaulted = FALSE;

if ( ConvertStringSecurityDescriptorToSecurityDescriptorW ( LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL ) )

{

if ( GetSecurityDescriptorSacl ( pSD, &fSaclPresent, &pSacl, &fSaclDefaulted ) )

{

dwErr = SetSecurityInfo ( hObject, type, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl );

bRet = (ERROR_SUCCESS == dwErr);

}

LocalFree ( pSD );

}

return bRet;

}

這個示例代碼使用了兩個mutex,其目的是讓這個外掛程式告訴什麼時候這個應用程式在運行。當這個進程啟動的時候DemoAPP EXE創建了它們,當你點擊其中一個Open Mutex按鈕的時候這個外掛程式嘗試去打開它們。Mutex 1具有默認的完整性級別,而mutex 2則通過上面所說的SetObjectToLowIntgrity()函式設定到低完整性級別。這意味著當保護模式啟用的時候,這個外掛程式將只能存取mutex 2。以下是當你點擊兩個Open Mutex按鈕時所看到的結果:

運行時檢測保護模式

為了判斷我們的外掛程式是否運行在一個保護模式IE進程中,我們使用IEISProtectedModeProcess():

HRESULT IEIsProtectedModeProcess(BOOL* pbResult);

如果返回值是一個成功的HRESULR和*pbResult是True,那么保護模式就被啟用了。根據在*pbResult中返回的值,你可以在你的代碼中採取不同的操作:

HRESULT hr;

BOOL bProtectedMode = FALSE;

hr = IEIsProtectedModeProcess ( &bProtectedMode );

if ( SUCCEEDED(hr) && bProtectedMode ) // IE is running in protected mode else // IE isn't running in protected mode

示例band外掛程式在一啟動的時候調用了這個API,並顯示了關於保護模式狀態的一個訊息。

2.寫檔案系統

當保護模式被啟用的時候,擴展外掛程式只能對用戶配置下的幾個目錄進行寫操作。只有在Temp、Temporary、Internet Files、Cookies和Favorites目錄下的幾個特定低完整性目錄可以進行寫操作。IE還有某些兼容性補償功能,它虛擬化其他常用目錄。對這些目錄的寫操作將被重定向到Temporary Internet Files的子目錄中。如果一個擴展外掛程式試圖對一個敏感進行寫操作的話,例如對windows目錄,這個操作將會失敗。

當一個擴展外掛程式希望寫這個檔案系統的時候,它應該使用IEGetWriteableFolderPath()這個API,而不是GetSpecialFolderPath()、GetFolderPath()或SHGetKnownFolderPath()。

IEGetWriteableFolderPath()可以發現保護模式,如果一個外掛程式請求一個不允許寫的目錄,IEGetWriteableFolderPath()將返回E_ACCESSDENIED。IEGetWriteableFolderPath()的原型如下:

HRESULT IEGetWriteableFolderPath(GUID clsidFolderID, LPWSTR* lppwstrPath);

其他限制

1.運行其他應用程式

IE具有另一個防止惡意代碼啟動或與其他進程通信的機制。如果一個外掛程式試圖啟動另一個進程,IE將在啟動這個進程前要求該用戶同意。舉個例子來說,使用查看原始碼命令會引起如下提示:

如果你的外掛程式需要運行一個單獨的EXE,你可以增加一個註冊表鍵值來告訴IE你的EXE可以被信任並能夠無須提示就被運行。這個控制這種行為的註冊表鍵值是HKLM\Software\Microsoft\Internet Explorer\Low Rights\ElevationPolicy。創建一個新的GUID,然後在名稱為那個GUID的ElevationPolicy下增加一個鍵值。在這個新的鍵值中,創建三個值:

AppName:執行檔的檔案名稱,例如“DempApp.exe”。

AppPath:EXE所在的目錄。

Policy:設定成3的DWORD值

如果你的安裝沒有創建一個類似的鍵的話,當你選擇對話框中的“Do not show me the warning for this program again”,IE自己將創建一個。

2、拖拽到其他應用程式

如果你試圖從一個網頁的內容拖拽到另一個應用程式中,會出現一個類似的提示視窗:

這個提示視窗也可通過一個註冊表鍵來禁止。格式如上面所述,但是你的應用程式的鍵應該放在DragDrop下,而不是前面的ElevationPolicy。

DemoApp作為一個拖拽的對象來演示,如果你在IE中選擇了一些文本內容,並把它拖拽到DemoApp對話框中,它將顯示一個訊息來表示它已經收到這個拖拽動作.

相關詞條

相關搜尋

熱門詞條

聯絡我們