天天看點

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

本節書摘來自華章計算機《威脅模組化:設計和傳遞更安全的軟體》一書中的第1章,第1.1節,作者:[美] 亞當·斯塔克 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

誰都可以學習威脅模組化,更進一步說,每個人都應該學習威脅模組化。威脅模組化是利用模型來發現安全問題,這意味着通過提取大量細節對安全問題進行全面檢查,而不是代碼本身。之是以要構模組化型,是因為模型能讓你在沒建構系統之前即可發現問題,以及在問題出現前提早發現問題。最後,威脅模型可以預見可能侵襲你的威脅。

首先,威脅模組化是一門實用科學,本章系統地描述其實用性。盡管本書為你提供了很多有價值的定義、理論、觀點、有效的方法和技術,但你還是希望能将這些用于實踐。是以,本章内容主要從實踐經驗展開,未涉及大量的理論。

舉一個例子,當你開始操作一個樂器,就要通過彈奏樂器培養能力和感覺。起初,可能聽上去沒那麼好,有時還會令人沮喪,但是在練習的過程中,你會逐漸發現越來越輕松。慢慢地開始娴熟。同樣,如果你按照書中第一部分到第三部分提出的如何威脅模組化的簡單四步法練習,你也會練就威脅模組化能力。你可能聽說過一個老段子:紐約街頭音樂人被一個人攔住,問:“我怎麼才能進入卡内基音樂廳表演?”回答當然是“練習、練習、再練習”。這過程中包括遵從、練習、培養對各個步驟的了解。長此以往,你就能了解威脅模組化涉及的各種任務和技術是如何結合在一起的。

在本章中,你将找到設計中可能存在的安全缺陷,進而解決它們。你将學習如何通過針對帶有後端資料庫的簡單的網絡應用查找缺陷。你将了解哪裡有可能會出錯,如何解決,以及如何檢查。在本章中,你将學會如何玩權限提升遊戲,旨在幫助你開始威脅模組化。最後,你将有機會實際動手建構自己的威脅模型,本章結尾将為你提供一組檢查清單幫助你開始進行威脅模組化。

威脅模組化重點是解決如下4個問題:

1.你正在建構什麼?

2.哪些地方可能會出錯?

3.發現錯誤時應該怎麼解決?

4.是否做了完整的分析?

解決這些問題的開始和結束是所有技術人員所熟悉的:在白闆上畫圖、管理漏洞。在這裡,本書将介紹多種可以用于思考威脅的新技術。當你在解決問題的過程中遇到困難時,就回過頭想想這4個問題。

本章内容旨在幫你解答這些問題。首先,以三層架構網絡應用程式為例解答這些問題。之後,你該回顧一下這些步驟,嘗試對自有的軟體進行威脅模組化,可以是你正在建構或部署的軟體或者是你正考慮擷取的軟體。如果你不确定要對什麼進行模組化,可以使用本章中的一個樣本系統或是在附錄e中選擇。

第二次讀本章的時候,你需要有一副權限提升威脅模組化遊戲紙牌。需要2~4個朋友或同僚與你一起玩這個遊戲。

首先從建構示意圖開始,這是威脅模組化涉及的4個主要動作之一,在下一部分内容會涉及。其他3個動作分别是尋找威脅、解決威脅和檢查工作。

1.1.1 你正在建構什麼

用示意圖來回答這個問題是一種好方法。為軟體做示意圖也有很多種方法,可以先從在白闆上畫開始,畫一畫資料流是如何在系統中流動的。在這個例子中,處理對象是一個簡單的網絡應用程式,包含網絡浏覽器、web伺服器、業務邏輯和一個資料庫(見圖1-1)。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

圖1-1 示意圖

在這裡,一些人會開始思考有什麼問題。例如,你怎麼知道網絡浏覽器由你所預期的人使用?如果有人修改資料庫裡的資料會怎樣?從一個方框移動到另一個方框時不需要資訊加密嗎?你可能願意花時間想一想這裡可能出錯的細節,因為這些問題會引領你問:“這是經過允許的嗎?”如果你能多考慮一些“誰控制什麼”,你就能建構出比現有更好的模型。這是針對整個網際網路還是針對内部網絡?資料庫是線上上站點還是在網絡提供者?

對于這個例子,首先假定你正在建立一個網際網路站點,用的是虛拟acme存儲系統(在這裡我用了具體的産品,但是我會弄錯一些細節,某些人——當然不是你,會糾纏于這些,就不會關注威脅模組化内容了,我們此後就稱為acme,假設按照我說的方式進行工作,多謝,你們懂的)。

用添加邊界的方式表達誰控制着什麼是改進示意圖的簡便方法。你可以很容易發現跨越那些邊界的威脅可能是非常重要的,可能是識别威脅的最佳位置。這些邊界稱為信任邊界,無論在什麼地方由不同的人控制不同的事,你就該畫上邊界。以下列出一些不錯的示例:

賬戶(unix系統的使用者名uid,windows系統的安全識别符sids)

網絡接口

不同的實體計算機

虛拟計算機

組織機構邊界

你可以擁有不同權限的幾乎所有地方

信任邊界與攻擊面

你可能會遇到的相近概念是攻擊面。例如,船的外殼是經受魚雷打擊的攻擊面。受到攻擊時,船的側面會比這艘船的船頭攻擊面要大。這隻船會有内部“信任”界面,比如隔水艙、船長的保險箱。暴露很多接口的系統呈現的攻擊面大于暴露很少api或其他接口的系統的攻擊面。網絡防火牆是有用的邊界,因為它們可以減少外部攻擊者的攻擊面。然而,就像船長的保險箱,在防火牆以内還有信任邊界。信任邊界和攻擊面是對同一事物的非常相似的概念。攻擊面是一個信任界面,是攻擊者可以發動襲擊的方向。很多人認為這兩者可互換。本書主要使用“信任邊界”。

在你的示意圖中,用邊框來畫信任邊界(見表1-2),用标簽(比如企業資料中心)放在邊框處顯示每個信任邊界裡有些什麼。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

https://yqfile.alicdn.com/e360600a525f8ed8f5b0ddb7573f69c3a77ada9d.png

" >

圖1-2 在示意圖基礎上加入信任邊界

随着示意圖中的内容越來越多,越來越複雜,就會越容易錯過某一部分,或者對資料流中的标簽感到困惑。是以,給每個程式、資料流、資料存儲标上序号會更有幫助,如圖1-3。(因為每個信任邊界有個與衆不同的名字,是以這些就沒必要标序号了。)

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

https://yqfile.alicdn.com/5cd4826bf1d86e711039412a8f8f5e6e98277055.png

圖1-3 在示意圖基礎上加入序号和信任邊界

至于示意圖的形式,你可以選擇适合你的程式的:可以是白闆示意圖和手機照片,可以是visio、omnigraffle或其他繪圖程式。你應該想到威脅模組化示意圖是開發流程的一部分,是以需要将它們和其他一起儲存在代碼控制中。

有了示意圖,你很自然會問,這是正确的嗎?到目前為止,有個簡單的答案:我們假設它是正确的。本章後面會提供一些小竅門和檢查表,還有一部分内容關于更新示意圖,不過,在這一階段,你已經有了足夠好的圖表來開始識别威脅,這就是你買這本書的價值所在。是以我們開始出發吧。

1.1.2 哪些地方可能會出錯

有了示意圖,你就可以開始尋找可能出錯的地方。這很有趣,是以我将這轉化到一個名為權限提升的遊戲上。附錄d中有更多有關遊戲的内容,那裡分析了每一張牌,第11章包含了該遊戲的曆史及設計理念。不過,現在通過一些簡單的訓示你就可以開始玩了。

一些人不适應在工作的時候玩遊戲,還有一些人開始玩新遊戲的時候可能會帶着恐懼心理,尤其是看到很長、很複雜的遊戲說明的時候。不過,權限提升遊戲說明不多,可以試試。

如何玩權限提升遊戲

權限提升遊戲旨在幫助你威脅模組化。圖1-4中顯示一張紙牌,跟玩普通紙牌一樣,紙牌的左上角會有數字,紙牌上半部還有威脅執行個體的文字介紹。隻要根據提示玩即可。

1.洗牌(可選)。

2.首輪拿到3篡改牌的人先出(在這樣的紙牌遊戲中,一輪也可以稱為“一把”或“一手”)。

3.每一輪這樣玩:

a.從先出牌的人開始沿着順時針方向出牌,每人出一張牌。

b.出牌時,說出是什麼牌,并嘗試決定它能否影響你們正在制作示意圖的系統。如果能聯系起來,寫下來,得一分,然後下一個人繼續。

c.每個人都出了一張牌後,牌最大的人赢得本輪,本輪赢者在下輪先出。

4.所有牌都出完,遊戲結束,得到分數最高的人赢得整個遊戲。

5.如果你們是在對正在建構的系統進行威脅模組化,那麼把你們發現的任何漏洞都歸檔。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

https://yqfile.alicdn.com/8cdd8723b1cbf91025e37333f70e9c619ac24e01.png" >

有的人甚至占用睡眠時間學習這個内容,十分着迷。但不是所有人都這樣,沒關系。威脅模組化不是非常複雜的科學,從事軟體開發的人都能夠學會。隻不過不是所有人都願意用睡眠時間

學習。

對很多人來說,識别威脅聽起來可能有點吓人,如果你是這樣的,不要擔心。本部分内容就是幫你慢慢了解威脅識别,記得享受其中的樂趣。一位評論家說:“玩權限提升遊戲應該是很有趣的,不要貶低它,我們每周五都玩,很有趣,也很放松,同時還有商業價值。”

遊戲之外,你可以通過思考可能出錯的地方進一步威脅模組化。比如,你怎麼知道網絡浏覽器被你所預期的人使用?如果有人修改資料庫裡的資料會怎樣資訊從一個方框移動到另一個時不用加密?你不必盯着表、托着下巴苦思這些問題,(我反正沒有!)你可以用簡單的有助于記憶的stride來識别威脅,這在下一部分會具體介紹。

使用便于記憶的stride方法尋找威脅

stride是個助記符,可以幫助查找不安全的地方。它是幾個詞或詞組的首字母縮寫,代表假冒(spoofing)、篡改(tampering)、否認(repudiation)、資訊暴露(information disclosure)、拒絕服務(denial of service)、權限提升(elevation of privilege)。

假冒:假裝成并非自己真實身份的人或物。

篡改:修改你不應該修改的東西。包括有線網絡(或者無線網絡)的資料包、磁盤上的資訊或者記憶體中的資訊。

否認:宣稱自己沒做什麼事(不管你是否做了還是沒做)。

拒絕服務:旨在阻止系統提供正常服務的攻擊,包括使系統崩潰、讓它變得運作緩慢而且無法使用,或者占滿記憶體。

資訊暴露:将資訊暴露給沒有授權檢視這些内容的人。

權限提升:指一個程式或者使用者在技術上可以做其本來不能做的事情。

回憶一下之前提到的三種威脅範例:

你怎麼知道網絡浏覽器被你所預期的人使用了?

如果有人修改資料庫裡的資料會怎樣?

資訊從一個方框移動到另一個時不用加密?

這些都是假冒、篡改和資訊暴露的例子。使用stride可幫助你檢查圖表,選出威脅範例。再加上一些安全知識和适當的技術手段,你就能更快、更可靠地找到重要的威脅。如果你在開發軟體時保證了威脅模型開發和威脅記錄,将大大提升軟體的安全性。

既然有了stride工具,再檢視一下你的圖表,尋找更多威脅,這次運用這個助記符。列出遇到的威脅及圖表中其會影響到的因素(總體來說,軟體、資料流或是存儲會受影響,而非信任邊界)。以下顯示每一類威脅的例子。

假冒:有人會假裝成其他使用者,是以你需要有驗證使用者身份的方式;有人還會假裝成你的網站,是以你必須使用加密套接字協定層(ssl)證書,而且保證所有頁面使用單一的域名(幫助部分使用者通過url網址來确認自己是不是通路了正确的網站位址)。還有人可能在你的網站放置深層的連結,比如logout.html或placeorder.aspx。在采取相應措施前要檢查referrer引用字段。這并不是應對跨站請求僞造(cross site request forgery,csrf)攻擊的全部解決辦法,隻不過是一個開始。

篡改:有人可能會篡改acme後端的資料。有人可能會對資料中心之間的資料流資料進行篡改。程式員可能會未經測試即替換網絡前端的執行代碼,将它們上傳到暫存區域。一個憤怒的程式員可能添加優惠碼“paybobmore”,将所有商品以八折優惠出售。

否認:之前的那些操作到底操作了什麼内容。有系統審計記錄嗎?正确的資訊被有效地記錄了嗎?這些記錄能防止篡改嗎?

資訊暴露:如果acme讀取你的資料庫會發生什麼?任何人都能連接配接到資料庫、讀取或者寫資訊嗎?

拒絕服務:如果1000個客戶同時點選一個網站會怎樣?acme出故障了會怎樣?

權限提升:可能網絡前端是使用者唯一應該通路的地方,是什麼在強制執行呢?是什麼阻止他們與業務邏輯伺服器直接連接配接或者上傳新代碼?如果有防火牆,它是否配置正确?是什麼控制着通路你的acme的資料庫,或者如果有acme員工犯了錯誤,甚至想編輯你的檔案呢?

以上提到的可能情況不是每個威脅入侵表現的完整清單。第3章中會介紹更多内容。不過,本節内容足以讓你入門,基于圖1-2所示的簡單圖表,主要關注你可能需要研究的内容。還記得前文提到的彈奏樂器的類比吧。如果你剛學彈鋼琴的時候就學習拉威爾的《夜之加帕斯》(被認為是最難的鋼琴曲之一),那你可就要抓狂了。

識别威脅竅門

不論你是用權限提升遊戲還是stride,抑或是兩者皆用來識别威脅,下面這些都要牢記在心,它們可以幫助你走對路,找出哪裡出錯了。

從外部實體開始:如果你不知道從哪裡開始入手,那麼就從外部實體或是驅動活動的事件開始。當然,也有很多其他的有效途徑:你可能從網絡浏覽器開始尋找假冒,以及篡改等。也可能從業務邏輯開始,可能該元件的主要開發人員也同在一個房間内。不管你選擇從哪裡開始,以及滿足一定級别的組織機構。你也可以按照圖表中的“stride次序”(“stride order”)進行。如果沒有一定的組織機構,很難說你何時已經完成,不過,小心不要加入太多結構,否則會限制創造性。

不要因為不是你目前要找的威脅而忽略任何一個威脅。你可能在檢視别的項目類别時發現一些威脅,記下來再傳回解決。比如,你可能會在尋找假冒威脅的時候想着資訊暴露威脅:“會有人連接配接到我們的資料庫嗎”,如果是這樣就太棒了。非常不錯。出現一些備援可能是比較乏味,但是可以避免遺漏。如果你發現自己在考慮“沒有授權的人連接配接資料庫讀取資訊”是假冒還是資訊暴露,答案是誰關心啊?記錄下來,繼續下一項。stride是引導你發現威脅的工具,不是讓你給你所發現的威脅進行分類;不管怎麼說,這是令人厭煩的分類問題。(意思是說,有很多安全問題都可以争論到底屬于哪類。用嚴格的分類标準去比較、對比,就像給生命分類,有沒有脊椎?有的話,那就是脊椎動物。)

關注可能的威脅:在發現威脅過程中,你可能會遇到一些這樣的威脅——某人可能在晶片廠植入了後門,或者有人可能雇用了我們的守衛人員插入了硬體按鍵記錄器、竊取了你所有密碼密碼,這是真實存在的可能情況,但是相比使用漏洞攻擊尚未安裝更新檔的漏洞,或者假冒使用人安裝軟體,上面情況是不太可能發生的。另外還有怎麼解決威脅的問題,這會在下一部分中介紹。

1.1.3 解決每個威脅

現在,你應該有一個數量可觀的威脅清單,或者有多個威脅清單。威脅模組化的下一步就是仔細檢查清單,解決每一個威脅。對于每個威脅,有四種應對措施:緩解、清除、轉移、接受。下面的清單中對這幾種方法做了大緻介紹,接着在後續的“哪裡會出錯”部分,你可以學到如何解決stride清單中每個特定的威脅。在第8章和第9章中,會有解決這些威脅的政策和技術的更多細節。

減緩威脅:采取措施讓别人更難利用這個威脅。控制登入的時候需要提供密碼可以減緩假冒威脅。添加複雜的或者有時間限制的密碼控制,可以減小密碼被猜到或者被盜後可用的機率。

清除威脅:通常可以通過清除功能來實作。如果有個威脅,某人可能通過通路/admin/url來通路網站的管理功能,你可以通過設密碼或者其他身份認證技術來緩解,但是,這個威脅仍然存在。你可以利用/j8e8vg21euwq/這樣的url,使其增加被通路的難度,但是威脅依然存在。為了清除威脅,可以通過移除界面接口,僅通過指令行進行管理操作(不同的指令行登入方式也會存在威脅,遠離http使得威脅更易通過控制攻擊面來減緩。兩種威脅都可在完整的威脅模型中發現)。

轉移威脅:讓别人或者别的東西來處理威脅。比如,你可以将認證威脅轉移到作業系統或者從信任邊界轉移到防火牆。你也可以将威脅轉移到客戶,比如,可以通過要求他們點選很多難懂的對話框,之後才可以做他們想做的。這當然不是個很好的解決辦法,但是有時人們知道能促成安全權衡。比如,他們可能知道他們隻是連上了咖啡館的無線網絡。如果你認為這個人有安全意識,你應該幫助她做決定。第15章會介紹更多内容。

接受威脅是解決威脅的最後選擇。對大多數組織來說,在大多數時間内不值得用搜查進出大樓的每個員工來犧牲他們的尊嚴和工作滿意度。(然而,鑽礦和一些政府機構會選擇不同的方法。)同樣,阻止某人在主機闆插入後門的代價是很高的,是以在這些時候,你可能會選擇接受威脅。而且,一旦你接受了,就不該再為之擔心。有時,擔心就表示你沒有完全接受威脅,或者說接受威脅是不合适的。

表1-1列出的政策舉例說明了解決威脅的方法。你的首選方法應該是緩解威脅。總體來說,緩解是最容易的,也是對客戶來說最好的選擇。(可能看上去接受威脅更容易,但久而久之你會發現緩解是更容易的。)緩解威脅是份辛苦活,不要認為這些例子就是全部。解決每個威脅經常會有其他有效方法,有時在選擇解決威脅的方法上要做出權衡。

解決假冒威脅

表1-1展示了假冒的目标、解決假冒的減緩政策以及如何實施這些緩解方法。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化
《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

當你擔心可能會有人被假冒時,保證每個人都有獨特的使用者名和驗證方法,傳統方法就是設定密碼,雖然這種方式存在各種問題,但其很多優點也難以複制。密碼相關内容詳見第14章。

當通路磁盤檔案時,不要用open(file),而應該使用open(/path/to/file)。如果檔案敏感,打開後,檢查檔案說明符中的安全因素(例如完全解析的名字、授權和所有者)。為了避免競争,要檢查檔案說明符。如果檔案是可執行檔案則執行兩次(applies doubly),雖然打開後檢查可能會比較棘手,這可能幫助確定可執行權限不會被攻擊者修改。無論如何,你幾乎從來不會想要求執行如下指令:exec./file。

當你擔心聯網時系統或者計算機會被假冒,你會想用dnssec、https/ssl、ipsec或是組合使用上述協定來保證你連接配接了安全正确的地方。

解決篡改威脅

表1-2展示篡改的目标、解決篡改的緩解政策以及如何實施這些緩解方法。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

篡改檔案:如果攻擊者在同一台機器有賬戶或者在網絡上通過伺服器請求檔案時篡改檔案很容易。

篡改記憶體:當一個程式沒有你的特權高或者未獲信任時卻可以修改記憶體,這是令人擔心的。例如,如果你從共享記憶體段擷取資料,是否添加了acl允許另一個程序可以檢視?對于一個網絡應用程式,通過ajax(asynchronous javascript and xml的縮寫)擷取資料,在你拉入(pull)正确的資料量後,確定你擷取到的資料是你所想要的。

篡改網絡資料:防止篡改網絡資料需要應付假冒和篡改。否則,想要篡改的人就可以簡單地假裝是另一端,即所謂的使用中間人攻擊。對此最常見的解決方法是ssl,ipsec也逐漸成為另外一種解決方式。ssl和ipsec兩個都能解決機密性和篡改,也可以幫助解決假冒。

篡改網絡反模式:人們希望可以隔離網絡,從某種意義上講,這是很正常的,是以不必擔心篡改威脅。但是長此以往也很難保持隔離,隔離的效果沒有你想象的好。比如,隔離的美國機密互聯協定路由網(siprnet)完全被惡意軟體襲擊了,而清理幹淨則花了14個月時間(shachtman,2010)。

一個項目加載後不能檢查自己是否真實可信,或許可以依賴“可信引導裝載程式”(trusted bootloaders)提供一連串簽名,但是安全政策不應包含在代碼中。

解決否認威脅

解決否認威脅的主要辦法是確定你的系統有記錄,并確定這些記錄得到儲存和保護。可以通過簡單的步驟來實作這點,比如利用可靠的協定傳輸日志資料。從這個意義上說,從安全的角度來看,使用udp協定的syslog資料通常是愚蠢的做法,目前可以使用tcp/ssl的系統記錄,而且該方式已得到極大改善。

表1-3展示否認的目标、解決否認的緩解政策以及如何實施這些緩解方法。

《威脅模組化:設計和傳遞更安全的軟體》——第1章 潛心開始威脅模組化1.1 學習威脅模組化

https://yqfile.alicdn.com/643a1969511fe1d9c6d32a40cc1d49ecbf2a3c06.png

沒有日志意味着你什麼都不能證明:這個不言自明。例如,當一個客戶來投訴說他們從來沒接到訂單,該怎麼解決?保持做審計記錄,這樣當有人試圖否認的時候就可以調查到底怎麼回事了。

記錄遭受攻擊:攻擊者會想方設法讓你的審計記錄變得毫無幫助,比如填滿你的審計記錄以緻難尋攻擊,或者強迫你的日志“轉存”(roll over)。他們還會設法引發大量警報,這樣就會淹沒真正的攻擊。顯然,将日志發送到網絡上會讓它們暴露于其他威脅之中,這也是你需要解決的。

日志作為攻擊的管道:設計上,你從不可控的來源收集資料,然後将這資料發送到有安全權限的人和系統。這樣的攻擊樣本可能會發送郵件給“