本文章是由機器翻譯。

安全性簡報

TFS 2010 的 MSF-Agile+SDL 流程範本

Bryan Sullivan

本雜誌的任何忠實讀者都會熟悉 Microsoft Team Foundation Server (TFS) 和開發團隊使用它可獲得的工作效率優勢。(如果您不熟悉 TFS,請從 Visual Studio 2005 指導教程查看 Chris Menegay 的文章。雖然其中含有舊版本內容,但為可在 TFS 中利用的各種功能提供了有用的概述。)

如果您自己使用 TFS,則也可能熟悉隨 TFS 一起提供的 Microsoft Solutions Framework (MSF) for Agile Software Development 過程範本,更普遍的叫法是MSF-Agile。本月專欄的主題是新 MSF-Agile 與安全開發生命週期 (SDL) 過程範本。MSF-Agile+SDL 基於 MSF-Agile 範本構建,向開發流程添加 SDL 安全和隱私功能。

您可以從 microsoft.com/sdl 下載用於 Visual Studio Team System 2008 或 2010 的 MSF-Agile+SDL 範本。但是在下載之前,您可能需要瞭解其中內置了哪些功能。下麵我們就開始。

SDL 任務

SDL 的核心是其安全要求和建議 – 即開發團隊在整個開發生命週期中必須執行的活動,以便確保最終產品具有較好的安全性和隱私性。這些要求包括策略活動,例如創建安全事件回應計畫,以及技術活動,例如威脅建模和執行靜態漏洞分析。所有這些活動在 MSF-Agile+SDL 範本中均表示為 SDL 任務工作項。

SDL 任務與表示功能任務的標準工作項之間的最大區別,可能在於專案團隊成員不打算自己直接創建 SDL 任務。首次創建團隊專案時,會自動創建一些 SDL 任務。這些任務是相對簡單明瞭的一次性安全任務,例如確定將充當主要安全連絡人的團隊成員。其他 SDL 任務由過程範本自動創建來回應使用者操作。(更具體地說,它們是由部署到 TFS 應用程式層的 SDL-Agile 控制器 Web 服務自動創建的。)

無論使用者何時向專案添加新的反覆運算,範本都會向專案添加新的 SDL 任務,用於表示該反覆運算期間要執行的安全任務。威脅建模就是每反覆運算 SDL 任務的一個較好的例子:團隊必須評估在反覆運算過程中進行的更改,從而確定潛在的新威脅和抑制措施。

最後,無論使用者何時將新的 Visual Studio 專案或 Web 網站簽入到團隊原始程式碼控制存儲庫,範本都會添加 SDL 任務來反映必須專門為該專案執行的安全工作。例如,無論何時添加新的 C 或 C++ 專案,都會創建 SDL 任務以確保使用緩衝區溢位防禦編譯器和連結器設置,例如位址空間佈局隨機化對應的 /dynamic­base 標記和緩衝區安全檢查對應的 /gs 標記。

範本已足夠完善,能夠識別本機 C/C++ 專案與 Microsoft .NET Framework 專案之間的區別,不會添加無效要求。/dynamicbase 和 /gs 標記對於 C# 代碼無意義,不會為 C# 專案創建這些 SDL 任務。C# 專案將獲得特定于 .NET 的安全任務,例如複查 AllowPartiallyTrustedCallersAttribute 的任何用途。同樣,範本也可以從 Web 網站和 Web 服務區分用戶端/伺服器和獨立桌面應用程式,並因此添加相應的 SDL 任務集。

SDL 任務工作流和異常

SDL 任務的狀態和原因工作流轉換與功能任務的工作流轉換也不相同。可按以下若干不同的原因將任務標記為已關閉:已完成、已從專案中剪掉、延遲到後期反覆運算,甚至已廢棄,以及不再與專案相關。這些原因中,只有“已完成”適用于 SDL 任務。

遵循 SDL 的團隊無法從其專案中削減掉安全和隱私要求。功能性要求可因技術原因或業務原因在專案內外進行合理取捨,但是安全要求必須保持較高標準。永遠跳過 SDL 任務並不是不可能,但是要實現此操作,必須遵循更高級的過程。

無論什麼原因,如果團隊無法完成必需的 SDL 任務,則必須向其安全顧問申請任務異常。團隊或團隊管理層在專案開始時選擇團隊的安全顧問。此類人員應該對應用程式安全和隱私有豐富經驗,最好不直接參與專案,他不應是專案開發人員、專案經理或測試人員之一。

在 Microsoft,有一個集中式安全顧問組,他們在高信度計算安全性部門工作。這些安全顧問直接與各個產品團隊配合工作。如果您的組織具有相應資源來創建專門的安全顧問庫,將是比較好的情況。如果沒有,最好選擇在安全性方面具有最資深背景的人員。

團隊的安全顧問負責批准或拒絕 SDL 任務的任何異常請求。團隊通過將 SDL 任務狀態設置為“已請求異常”,然後填寫“理由”、“解決方案計畫”和“解決方案時間範圍”欄位來創建異常請求。此外,每個 SDL 任務還有一個唯讀的“異常評級”欄位,表示未完成要求的固有主觀安全風險,範圍從 4(最低風險)到 1(嚴重;最高風險)。安全顧問權衡團隊對異常評級的理由說明,然後要麼關閉“原因”是“已批准”的 SDL 任務,要麼重新啟動“原因”是“已拒絕”的 SDL 任務。

但是,即使已批准請求,大多數異常也不會永遠持續存在。這便是“解決方案時間範圍”欄位發揮作用的地方。團隊通常要求異常出現所設置的反覆運算次數,通常只是一次反覆運算,但是有時多達三次。超過指定的反覆運算次數後,過程範本將使異常過期,並重新啟動 SDL 任務。

安全錯誤

在確保滿足安全和隱私要求後,SDL 的下一個最重要功能是確保產品發貨時不含已知的安全錯誤。將安全錯誤與功能錯誤分開跟蹤,對確保產品的安全運行狀況至關重要。

與 SDL 任務不同,MSF-Agile+SDL 範本不會添加另一個 SDL 錯誤工作項類型來區分安全錯誤與功能錯誤。該範本向現有錯誤工作項類型添加“安全原因”和“安全影響”欄位。無論團隊成員何時歸檔新錯誤,如果錯誤是沒有安全影響的嚴格功能錯誤,查找器只會讓這些欄位保持其預設值“不是安全性錯誤”。但是,如果錯誤確實表示潛在的安全性漏洞,查找器會將“安全原因”設置為以下值之一:

  • 算數運算錯誤
  • 緩衝區向上溢出/向下溢出
  • 跨網站腳本
  • 加密缺陷
  • 目錄遍歷
  • 不正確/無錯誤消息
  • 不正確/無路徑名稱規範化
  • 無效機密隱藏
  • 爭用條件
  • SQL/腳本注入
  • 無限資源消耗(拒絕服務)
  • 弱身份驗證
  • 弱身份驗證/不適當權限或 ACL
  • 其他

查找器還將“安全影響”設置為以下 STRIDE 值之一:

  • 假冒
  • 篡改
  • 否認
  • 資訊洩露
  • 拒絕服務
  • 提升許可權

最後,查找器也可以選擇為錯誤設置範圍值。簡而言之,範圍定義有關錯誤的一些附加主觀資訊,這些資訊隨後用於確定嚴重性。範圍的允許值因所選的安全影響而異。例如,如果您為“安全影響”選擇“權限提高”,“範圍”的可能選項包括:

  • (用戶端)遠端使用者能夠執行任意代碼或獲得比預期更多的特權。
  • (用戶端)遠端使用者能夠通過大量的使用者操作執行任意代碼。
  • (用戶端)本地的低特權使用者可以將自己提升為其他使用者、管理員或本地系統。
  • (伺服器)遠端匿名使用者能夠執行任意代碼或獲得比預期更多的特權。
  • (伺服器)通過身份驗證的遠端使用者能夠執行任意代碼或獲得比預期更多的特權。
  • (伺服器)通過身份驗證的本地使用者能夠執行任意代碼或獲得比預期更多的特權。

您可以看到權限提高漏洞的嚴重性軸(即,使某一權限提高比其他權限提高更糟的特性),處理各種條件,例如攻擊的網站(用戶端或伺服器)和攻擊者的身份驗證級別(匿名或通過身份驗證)。但是,如果您選擇其他安全影響,例如“拒絕服務”,範圍選項將發生變化,以反映該特殊影響的嚴重性軸:

  • (用戶端)要求重新安裝系統和/或元件的拒絕服務
  • (用戶端)要求重新開機或導致藍屏/錯誤檢查的拒絕服務
  • (用戶端)要求重新開機應用程式的拒絕服務
  • (伺服器)具有少量資料的匿名使用者的拒絕服務
  • (伺服器)沒有在預設/常見安裝中擴大的匿名使用者的拒絕服務
  • (伺服器)要求重新開機或重新安裝系統的已通過身份驗證的使用者的拒絕服務
  • (伺服器)預設/常見安裝中已通過身份驗證的使用者的拒絕服務

為“安全原因”、“安全影響”和“範圍”都輸入值後,範本將使用這些資料計算錯誤的最低嚴重性。使用者可以選擇設置高於最低評級的實際錯誤嚴重性,例如,將錯誤設置為“1–嚴重”而不是“2–高”,但是從不進行反方向設置。這似乎有點過於嚴格,但是這樣可避免嘗試將錯誤嚴重性降級來滿足發貨日期或突擊發佈截止日期。

如果您要詳細瞭解有關設置更客觀的錯誤評級方法來會審錯誤的理由說明,請閱讀 2010 年 3 月“安全簡報”專欄,“向 Microsoft Team Foundation Server 2010 中添加安全錯誤評級”(msdn.microsoft.com/magazine/ee336031)。我在那篇文章中詳細介紹了向 TFS 添加錯誤評級的過程,該過程已經內置到 MSF-Agile+SDL 範本中。

最後,錯誤工作項中還有一個可選欄位。您可以使用“來源”欄位指定最初發現錯誤(如果有)的自動安全工具的名稱,如果使用者通過手動代碼檢查或測試發現錯誤,您也可以使該欄位保留其預設值“使用者”。

隨著時間的推移,您將收集到足夠的資料來確定您的哪些測試工具可提供最大回報。為了更容易地作出該決定,MSF-Agile+SDL 範本包括一個名為“Bugs by Origin”的 Excel 報告,該報告顯示了一個按“來源”欄位細分的漏洞評級圖表。

您可以根據嚴重性、安全原因或安全影響自訂此報告來篩選資料。如果您要瞭解哪些工具可最有效地查找交叉網站腳本漏洞,或者哪些工具找到了嚴重性最高的權限提高錯誤,很容易做到。

錯誤工作流

正如您無法延遲 SDL 任務一樣,您無法延遲具有安全隱患的任何錯誤(即“安全影響”設置為“不是安全性錯誤”以外其他值的任何錯誤)。要延遲修復嚴重性為“3 – 中等”或更高的任何安全錯誤,團隊必須申請異常。

這一過程與 SDL 任務的異常申請過程完全相同:團隊成員將狀態設置為“已請求異常”,為“理由”、“異常解決方案”和“異常時間範圍”欄位輸入詳細資訊。然後,團隊的安全顧問檢查異常請求,要麼批准(將狀態設置為 “由於‘原因’為‘已批准’而關閉”),要麼拒絕(將狀態設置為“由於‘原因’為‘已拒絕’而啟動”)。

安全查詢和安全儀錶盤

此外,為了簡化以下過程,MSF-Agile+SDL 範本還包括若干新團隊查詢。這些新查詢位於團隊資源管理器中的 Security Queries 資料夾下,包括:

  • 活動安全錯誤
  • 我的安全錯誤
  • 已解決的安全錯誤
  • 打開 SDL 任務
  • 我的 SDL 任務
  • 打開異常(包括任務和錯誤,對安全顧問尤其有用)
  • 批准的異常
  • 安全退出標準

這些查詢中的大多數不言自明,但是“安全退出標準”查詢需要多費一些口舌。為了滿足 SDL 對給定反覆運算的承諾,團隊必須完成所有以下活動:

  • 該反覆運算的所有每個突擊發佈的重複性 SDL 任務要求必須完整,或者具有由團隊安全顧問批准的異常
  • 不得有過期的一次性或存儲桶 SDL 任務要求
  • 具有嚴重性為“3 – 中等”或更高的安全隱患的所有錯誤均必須關閉,或者具有由團隊安全顧問批准的異常

在此上下文中提到的“每個突擊發佈”、“一次性”和“存儲桶”等術語是指對各個要求進行組織的 SDL-Agile 概念,其基礎是完成這些活動必須按照的頻率。每個突擊發佈要求是重複性要求,必須在每次反覆運算中完成。一次性要求是非重複性要求,只需要完成一次。存儲桶要求是重複性要求,但是只需要每六個月完成一次。

對此分類系統的詳細討論已超出本文範圍;但是如果您要詳細瞭解該系統,請閱讀 2008 年 11 月這一期的《MSDN 雜誌》文章“Agile SDL:簡化敏捷開發的安全實踐”。

“安全退出標準”查詢的意圖是為團隊成員提供一種簡單的方式來檢查他們為了完成其 SDL 承諾還要做多少工作。如果您在創建 MSF-Agile+SDL 團隊專案時為該專案配置 SharePoint 網站(該操作通常自動進行),您還會在團隊專案的安全儀錶盤上看到“安全退出標準”查詢結果。

新的安全儀錶盤僅適用于 MSF-Agile+SDL 專案(請參閱圖 1)。預設情況下,該儀錶盤包括“安全退出標準”、“打開 SDL 任務”、“打開異常”和“安全錯誤”查詢,但是如果您喜歡,也可以自訂這些查詢。此外,還可以將安全儀錶盤設置為所有 MSF-Agile+SDL 專案的預設專案門戶頁面,但是如果您要更改到其他預設儀錶盤,只需打開儀錶盤文件庫,選擇您要使用的儀錶盤,然後選擇“設置為預設頁面”選項即可。

圖 1 MSF-Agile+SDL 安全儀錶盤

“標準”、“打開 SDL 任務”、“打開異常”和“安全錯誤”查詢,但是如果您喜歡,也可以自訂這些查詢。此外,還可以將安全儀錶盤設置為所有 MSF-Agile+SDL 專案的預設專案門戶頁面,但是如果您要更改到其他預設儀錶盤,只需打開儀錶盤文件庫,選擇您要使用的儀錶盤,然後選擇“設置為預設頁面”選項即可。

簽入策略

MSF-Agile+SDL 過程範本的最後一個功能是 SDL 簽入策略集。這些策略有助於防止開發人員簽入違反某些 SDL 要求並因此可能導致安全性漏洞的代碼。可用的 SDL 簽入策略如圖 2 所示。

圖 2 MSF-Agile+SDL 簽入策略

SDL 簽入策略 說明
SDL 禁止的API 確保處理警告 C4996(使用已棄用的函數)的編譯器選項將被視為錯誤。由於可能導致緩衝區溢位的大多數運行時庫函數(例如 strcpy、strncpy 和gets)已被棄用,以便支援更安全的替代函數(分別為 strcpy_s、strncpy_s 和 gets_s),使用此簽入策略可以大大增強應用程式對緩衝區溢位攻擊的抵抗力。
SDL 緩衝區安全性檢查 確保已啟用編譯器選項“啟用緩衝區安全性檢查”(/GS)。此選項重新組織已編譯器的堆疊,以包括安全性 Cookie 或 Canary 值,這將大大提高攻擊者為任意堆疊溢位漏洞編寫可靠攻擊代碼的難度。
SDL DEP 和ASLR 確保已啟用連結器選項“資料執行保護”(/NXCOMPAT) 和“隨機化基址”(/DYNAMICBASE)。這些選項隨機分配應用程式將載入到記憶體中的位址,有助於防止執行記憶體中預期以資料形式分配的代碼。尤其是在組合使用時,這兩個選項是對緩衝區溢位攻擊強有力的深層防禦措施。
SDL 安全例外處理常式 確保已啟用連結器選項 /SAFESEH。此選項説明防止攻擊者定義惡意的例外處理常式,這種程式可能會導致危害系統。在連結時,/SAFESEH 創建一個合法例外處理常式表,並且不允許其他例外處理常式運行。
SDL 未初始化變數 確保編譯器警告級別是在級別 4 (/W4) 這一最嚴級別設置的。如果使用此選項,將在可能使用變數而未進行初始化的代碼處設置標記,這可能導致潛在攻擊。

啟用任何或所有 SDL 簽入策略很簡單。在團隊資源管理器中,按右鍵一個團隊專案,然後從上下文功能表中選擇“原始程式碼控制”選項。選擇“簽入策略”選項卡,然後添加您想要增強的 SDL 策略(請參閱圖 3)。務必注意,簽入策略增強是在用戶端電腦上而不是在 TFS 伺服器上執行的,因此您需要在每個開發人員的電腦上安裝 SDL 簽入策略。

图 3 添加签入策略

總結

要使任何安全開發方法有效,其必須易於自動操作和管理。MSF-Agile+SDL 過程範本對這兩種要求都有很大説明。如果您已在使用 TFS 附帶的 MSF-Agile 過程範本,則應已瞭解如何使用 MSF-Agile+SDL 範本,該範本是您已經熟悉的 MSF-Agile 範本的一個嚴格超集合。請從 microsoft.com/sdl 下載,然後開始創建如今更安全和隱私意識更強的產品。

Bryan Sullivan 是 Microsoft 安全開發生命週期團隊的一名安全專案經理,專門負責 Web 應用程式和 .NET 的安全問題。他是 "Ajax Security"(Addison-Wesley,2007)一書的作者。

衷心感謝以下技術專家對本文進行了審閱: Michael Howard