指定 Office 方案的安全性考量
更新:2007 年 11 月
Microsoft .NET Framework、Microsoft Office 2003 和 2007 Microsoft Office System 所提供的安全性功能可協助保護您的 Visual Studio Tools for Office 方案對抗可能的安全性威脅。本主題將說明某些威脅,並提供建議以協助對抗這些威脅。此外,本主題還包括 Microsoft Office 安全性設定如何影響 Visual Studio Tools for Office 方案的詳細資訊。
信任的程式碼在新的惡意文件中遭變更用途
攻擊者可以取得做為某種特定用途 (例如,下載聘雇申請的個人資訊) 之信任的程式碼,然後將它重新使用在其他文件中 (例如工作表)。這個程式碼並不知道原來的文件並沒有在執行,所以當不同的使用者開啟它的時候可能會帶來一些其他的威脅 (例如洩露個人資訊或以提升的權限執行程式碼)。另外,攻擊者只需要修改工作表中的資料,讓它在傳送給受害者之後出現意想不到的行為。惡意的使用者可以變更連結至程式碼之工作表上的值、公式或呈現特性,藉由傳送修改過的檔案攻擊其他使用者。修改工作表中的值也可能讓使用者存取他們不應該看到的資訊。
由於組件位置和文件位置都必須具有充分的辨識項才能執行,所以要發動這種攻擊並不容易。例如,電子郵件附件中或未受信任的內部網路伺服器上的文件都沒有足夠的使用權限可以執行。
若要進行這種攻擊,程式碼本身的撰寫方式必須使它會以可能不值得信任的資料做為信任決策的依據。例如,建立具有隱藏儲存格的工作表,其中含有資料庫伺服器的名稱。使用者會將此工作表傳送至 ASPX 網頁,而這個網頁便使用 SQL 驗證 (Authentication) 和硬式編碼的 SA 密碼,嘗試連接至該伺服器。然後,攻擊者就可以使用不同的電腦名稱取代隱藏儲存格的內容,並取得 SA 密碼。若要避免這個問題發生,請勿將密碼進行硬式編碼,並且一定要在存取伺服器之前,根據確定安全的伺服器內部清單檢查伺服器 ID。
建議事項
永遠驗證輸入和資料,不論它是來自使用者、文件、資料庫、Web 服務或是任何其他來源。
對於公開特定類型的功能 (例如代表使用者取得有權限的資料,並將它放至未受保護的工作表上) 要特別小心。
依據應用程式的類型,在執行任何程式碼之前或許應該先驗證原來的文件是否在執行 (例如,驗證它是不是從儲存在已知而且安全的位置的文件中執行)。
如果應用程式會執行任何有權限的動作,最好在開啟文件之前先顯示警告。例如,您可以建立一個開頭顯示畫面或啟動對話方塊,說明應用程式將會存取個人資訊,並且讓使用者選擇要繼續或取消。如果使用者從一個看起來無害的文件看到這種警告,他可以在受到任何危害之前結束應用程式。
程式碼遭到 Outlook 物件模型保護的封鎖
Microsoft Office Outlook 2003 和 Microsoft Office Outlook 2007 可以限制程式碼不能使用物件模型中的某些屬性、方法和物件。藉由限制存取這些物件,Outlook 就可以防止電子郵件蠕蟲和病毒惡意使用物件模型。這項安全性功能即稱為 Outlook 物件模型保護。如果增益集嘗試使用受到限制的屬性或方法,而此時物件模型保護已啟用的話,Outlook 就會顯示安全性警告,讓使用者可以停止作業,或者使用者可以允許對方在限定的時間內存取該屬性或方法。如果使用者停止作業,則使用 Visual Studio Tools for Office 所建立的 Outlook 增益集將會擲回 COMException。
視 Outlook 是否與 Microsoft Exchange Server 搭配使用,物件模型保護可以用不同的方式影響增益集:
如果 Outlook 未與 Exchange 搭配使用,則系統管理員可以啟用或停用電腦上所有的增益集物件模型保護。
如果 Outlook 與 Exchange 搭配使用,則系統管理員可以針對電腦上的所有增益集啟用或停用物件模型保護,或者系統管理員可以指定某些增益集可以在未遇到物件模型保護的情況下執行。系統管理員也可以針對物件模型的某些部分,修改物件模型保護的行為。例如,即使物件模型保護已啟用,系統管理員仍然可以自動允許增益集以程式設計方式傳送電子郵件。
如需 Outlook 2003 中 Outlook 物件模型保護的詳細資訊 (包括受到限制的方法和屬性清單),請參閱對程式開發人員而言,Microsoft Office Outlook 2003 有哪些新功能?(英文)。如需 Exchange 系統管理員可用的 Outlook 安全性設定的詳細資訊,請參閱自訂 Outlook 2003 以助於防範病毒 (英文)。
注意事項: |
---|
Outlook 2007 引入物件模型保護行為的幾項變更,以期改善開發人員和使用者經驗,同時協助保護 Outlook 的安全。如需詳細資訊,請參閱 Outlook 2007 中的程式碼安全性變更 (英文)。 |
最小化物件模型保護警告
為了避免在使用受到限制的屬性和方法時出現安全性警告,請確定增益集是從專案中 ThisAddIn 類別的 Application 欄位取得 Outlook 物件:如需此欄位的詳細資訊,請參閱應用程式層級增益集程式設計。
只有從這個物件取得的 Outlook 物件才可以取得物件模型保護的信任。相反地,從新的 Microsoft.Office.Interop.Outlook.Application 物件取得的物件則無法取得信任,而且如果物件模型保護已啟用的話,受到限制的屬性和方法將會引發安全性警告。
在下列程式碼範例中,會顯示已啟用物件模型保護時,會出現安全性警告。Microsoft.Office.Interop.Outlook.MailItem 類別的 To 屬性受到物件模型保護的限制。Microsoft.Office.Interop.Outlook.MailItem 物件未受信任,因為程式碼是從使用 new 運算子所建立的 Microsoft.Office.Interop.Outlook.Application 物件取得此物件,而非從 Application 欄位取得此物件。
Private Sub UntrustedCode()
Dim application As New Microsoft.Office.Interop.Outlook.Application
Dim mailItem1 As Microsoft.Office.Interop.Outlook.MailItem = _
TryCast(application.CreateItem( _
Microsoft.Office.Interop.Outlook.OlItemType.olMailItem), _
Microsoft.Office.Interop.Outlook.MailItem)
mailItem1.To = "someone@example.com"
MessageBox.Show(mailItem1.To)
End Sub
private void UntrustedCode()
{
Microsoft.Office.Interop.Outlook.Application application =
new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem mailItem1 =
application.CreateItem(
Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
Microsoft.Office.Interop.Outlook.MailItem;
mailItem1.To = "someone@example.com";
MessageBox.Show(mailItem1.To);
}
在下列程式碼範例中,會示範如何使用 Microsoft.Office.Interop.Outlook.MailItem 物件的受限制 To 屬性,此物件受物件模型保護的信任。這個程式碼會使用受信任的 Application 欄位以取得 Microsoft.Office.Interop.Outlook.MailItem。
Private Sub TrustedCode()
Dim mailItem1 As Microsoft.Office.Interop.Outlook.MailItem = _
TryCast(Me.Application.CreateItem( _
Microsoft.Office.Interop.Outlook.OlItemType.olMailItem), _
Microsoft.Office.Interop.Outlook.MailItem)
mailItem1.To = "someone@example.com"
MessageBox.Show(mailItem1.To)
End Sub
private void TrustedCode()
{
Microsoft.Office.Interop.Outlook.MailItem mailItem1 =
this.Application.CreateItem(
Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
Microsoft.Office.Interop.Outlook.MailItem;
mailItem1.To = "someone@example.com";
MessageBox.Show(mailItem1.To);
}
注意事項: |
---|
如果將 Outlook 與 Exchange 搭配使用,則從 ThisAddIn.Application 取得所有 Outlook 物件並不保證您的增益集可存取整個 Outlook 物件模型。例如,如果 Exchange 系統管理員設定 Outlook 自動拒絕所有嘗試使用 Outlook 物件模型存取位址資訊的動作,則 Outlook 將不會允許上述程式碼範例存取 To 屬性,即使程式碼範例使用的是受信任的 ThisAddIn.Application 欄位。 |
指定使用 Exchange 時所信任的增益集
當 Outlook 與 Exchange 搭配使用時,系統管理員可以指定某些增益集可以在未遇到物件模型保護的情況下執行。使用 Visual Studio Tools for Office 所建立的 Outlook 增益集不能個別取得信任,而是必須以群組方式取得信任。
Outlook 是否信任某個增益集,是以該增益集之進入點 DLL 的雜湊程式碼做判斷。所有使用 Visual Studio Tools for Office 建立的 Outlook 增益集都會使用相同的進入點 DLL (如果是 Outlook 2003 增益集,則為 AddinLoader.dll;如果是 Outlook 2007 增益集,則為 VSTOLoader.dll)。這就表示,如果系統管理員信任任何一個使用 Visual Studio Tools for Office 建立的增益集在未遇到物件模型保護的情況下執行,則所有其他使用 Visual Studio Tools for Office 建立的增益集也都會受到信任。如需信任特定增益集在未遇到物件模型保護的情況下執行的詳細資訊,請參閱自訂 Outlook 2003 以助於防範病毒 (英文)。
使用權限變更不會立即生效
如果系統管理員調整了文件或組件的使用權限,使用者必須先結束然後重新啟動所有 Office 應用程式才能讓這些變更付諸執行。
裝載 Microsoft Office 應用程式的其他應用程式也可能會阻礙新使用權限的使用。安全性原則變更之後,使用者應該結束使用 Office (不論是裝載的或獨立的) 的所有應用程式。
2007 Microsoft Office System 中的信任中心設定不會影響增益集或文件層級自訂
使用者可以透過在 [信任中心] 中設定選項,防止增益集載入。但是,使用 Visual Studio Tools for Office 建立的應用程式層級增益集和文件層級自訂不會受到這些信任設定的影響。
如果使用者利用 [信任中心] 防止增益集載入,下列增益集類型就不會載入:
Managed 和 Unmanaged COM 增益集。
Managed 和 Unmanaged 智慧標籤。
Managed 和 Unmanaged 智慧文件。
Managed 和 Unmanaged Automation 增益集。
Managed 和 Unmanaged 即時資料元件。
下列程序說明使用者如何使用 [信任中心] 限制增益集,使其無法在 2007 Microsoft Office System 中載入。這些程序不會影響使用 Visual Studio Tools for Office 建立的增益集或自訂。
若要停用 Excel 2007、PowerPoint 2007 或 Word 2007 中的增益集
按一下 [Microsoft Office 按鈕]。
按一下 [ApplicationName選項] 按鈕。
在分類窗格中,按一下 [信任中心]。
在詳細資料窗格中,按一下 [信任中心設定]。
在分類窗格中,按一下 [增益集]。
在詳細資料窗格中,選取 [要求應用程式增益集由受信任的發行者簽署] 或 [停用所有應用程式增益集]。
若要停用 InfoPath 2007、Outlook 2007 或 Visio 2007 中的增益集
按一下 [工具] 功能表上的 [信任中心]。
在分類窗格中,按一下 [巨集安全性]。
在詳細資料窗格中,選取 [不顯示警告,直接停用所有巨集] 或 [經過簽章的巨集會顯示警告; 所有未經簽章的巨集則會停用]。
在分類窗格中,按一下 [增益集]。
在詳細資料窗格中,選取 [套用巨集安全性設定到已安裝的增益集]。