《白帽子講Web安全》讀書筆記
起初,研究計算機系統和網絡的人,被稱為"Hacker",“Hacker"在中國按照音譯,被稱為“黑客”
第一篇 ,世界安全觀
Web安全筒史
起初,研究計算機系統和網絡的人,被稱為"Hacker",“Hacker"在中國按照音譯,被稱為“黑客”
對于現代計算機系統來說,在用戶態的最高權限是root (administrator),也是黑客們最渴望能夠獲取的系統最高權限。不想拿到“root"”的黑客,不是好黑客。漏洞利用代碼能夠幫助黑客們達成這一目標。
黑客們使用的漏洞利用代碼,被稱為"exploit"。在黑客的世界里,有的黑客,精通計算機技術,能自己挖掘漏洞,并編寫exploit;
只對攻擊本身感興趣,對計算機原理和各種編程技術的了解比較粗淺,因此只懂得編譯別人的代碼, 自己并沒有動手能力,這種黑客被稱為“SriptKids",即“·腳本小子”。
今天已經形成產業的計算機犯罪、網絡犯罪中,造成主要破壞的,也是這些“腳本小子”。
中國黑客簡史
筆者把中國黑客的發展分為了:啟蒙時代、黃金時代、黑暗時代。
黑客技術的發展歷程
從黑客技術發展的角度看,在早期,黑客攻擊的目標以系統軟件居多。
一方面,是由于這個時期的Web技術發展還遠遠不成熟;
另一方面,則是因為通過攻擊系統軟件,黑客們往往能夠直接獲取root權限。
這段時期,涌現出了非常多的經典漏洞以及"exploit"。比如著名的黑客組織TESO,就曾經編寫過一個攻擊SSH的exploit,并公然在exploit的banner中宣稱曾經利用這個exploit入侵過cia.gov (美國中央情報局)。
2003年的沖擊波蠕蟲是一個里程碑式的事件,這個針對Windows操作系統RPC服務(運行在445端口)的蠕蟲,在很短的時間內席卷了全球,造成了數百萬臺機器被感染,損失難以估量。在此次事件后,網絡運營商們很堅決地在骨干網絡上屏蔽了135、445等端口的連接請求。此次事件之后,整個互聯網對于安全的重視達到了一個空前的高度。
Web安全的興起
SQL注入的出現是Web安全史上的一個里程碑,它最早出現大概是在1999年,
黑客們發現通過SQL注入攻擊,可以獲取很多重要的、敏感的數據,甚至能夠通過數據庫獲取系統訪問權限,這種效果并不比直接攻擊系統軟件差。SQL注入漏洞至今仍然是Web安全領域中的一個重要組成部分。
xss (跨站腳本攻擊)的出現則是Web安全史上的另一個里程碑。實際上, xss的出現時間和SQL注入差不多,但是真正引起人們重視則是在大概2003年以后。在經歷了MySpace的xSs蠕蟲事件后,安全界對xss的重視程度提高了很多, OWASP 2007 TOP 10威脅甚至把xss 排在榜首。
黑帽子,白帽子
白帽子,則是指那些精通安全技術,但是工作在反黑客領域的專家們;
黑帽子,則是指利用黑客技術造成破壞,甚至進行網絡犯罪的群體。
返璞歸真,揭秘安全的本質
通過一個安全檢查(過濾、凈化)的過程,可以梳理未知的人或物,使其變得可信任。
被劃分出來的具有不同信任級別的區域,我們稱為信任域,
劃分兩個不同信任域之間的邊界,我們稱為信任邊界。
數據從高等級的信任域流向低等級的信任域,是不需要經過安全檢查的;
數據從低等級的 信任域流向高等級的信任域,則需要經過信任邊界的安全檢查。
筆者認為,安全問題的本質是信任的問題。
一切的安全方案設計的基礎,都是建立在信任關系上的。我們必須相信一些東西,必須有一些最基本的假設,安全方案才能得以建立;如果我們否定一切,安全方案就會如無源之水,無根之木,無法設計,也無法完成。
舉例來說,假設我們有份很重要的文件要好好保管起來,能想到的一個方案是把文件“鎖".到抽屜里。這里就包含了幾個基本的假設,首先,制作這把鎖的工匠是可以信任的,他沒有私自藏一把鑰匙:其次,制作抽屜的工匠沒有私自給抽屜裝一個后門;最后,鑰匙還必須要保管在一個不會出問題的地方,或者交給值得信任的人保管。反之,如果我們一切都不信任,那么也就不可能認為文件放在抽屜里是安全的。當制鎖的工匠無法打開鎖時,文件才是安全的,這是我們的假設前提之一。但是如果那個工匠私自藏有一把鑰匙,那么這份文件也就不再安全了。這個威脅存在的可能性,依賴于對工匠的信任程度。如果我們信任工匠,那么在這個假設前提下,我們就能確定文件的安全性。這種對條件的信任程度,是確定對象是否安全的基礎。
在現實生活中,我們很少設想最極端的前提條件,因為極端的條件往往意味者小概率以及高成本,因此在成本有限的情況下,我們往往會根據成本來設計安全方案,并將一些可能性較大的條件作為決策的主要依據。
因此,把握住信任條件的度,使其恰到好處,正是設計安全方案的難點所在,也是安全這門學問的藝術魅力所在。
破除迷信,沒有銀彈
安全是一個持續的過程。
安全三要素
安全三要素是安全的基本組成元素,分別是機密性(Confidentiality)、完整性(Integrity),可用性(Availability).
機密性要求保護數據內容不能泄露,加密是實現機密性要求的常見手段。
完整性則要求保護數據內容是完整、沒有被篡改的。常見的保證一致性的技術手段是數字,簽名。
可用性要求保護資源是“隨需而得"。
假設一個停車場里有100個車位,在正常情況下,可以停100輛車。但是在某一天,有個壞人搬了100塊大石頭,把每個車位都占用了,停車場無法再提供正常服務。在安全領域中這種攻擊叫做拒絕服務攻擊,簡稱Dos (Denial of Service)。拒絕服務攻擊破壞的是安全的可用性。
如何實施安全評估
資產等級劃分
資產等級劃分是所有工作的基礎,這項工作能夠幫助我們明確目標是什么,要保護什么。
在互聯網的基礎設施已經比較完善的今天,互聯網的核心其實是由用戶數據驅動的-用戶產生業務,業務產生數據。
互聯網公司除了擁有一些固定資產,如服務器等死物外,最核心的價值就是其擁有的用戶數據,
所以互聯網安全的核心問題,是數據安全的問題。
對互聯網公司擁有的資產進行等級劃分,就是對數據做等級劃分。
當完成資產等級劃分后,對要保護的目標已經有了一個大概的了解,接下來就是要·劃分信任域和信任邊界了。
通常我們用一種最簡單的劃分方式,就是從網絡邏輯上來劃分。比如最重要的數據放在數據庫里,那么把數據庫的服務器圈起來; Web應用可以從數據庫中讀/寫數據并對外提供服務,那再把Web服務器圈起來;最外面是不可信任的Internet.
威脅分析
在安全領域里,我們把可能造成危害的來源稱為威脅(Threat),而把可能會出現的損失稱為風險(Risk),
風險一定是和損失取系在一起的
接下來要提到的“威脅建模”和“風險分析”兩個階段,這兩個階段的聯系是很緊密的。什么是威脅分析?
威脅分析就是把所有的威脅都找出來。怎么找?一般是采用頭腦風暴法。當然,也有一些比較科學的方法,比如使用一個模型,幫助我們去想,在哪些方面有可能會存在威脅,這個過程能夠避免遺漏,這就是威脅建模。
介紹一種威脅建模的方法,它最早是由微軟提出的,叫做STRIDE模型。STRIDE是6個單詞的首字母縮寫,我們在分析威脅時,可以從以下6個方面去考慮。
在進行威脅分析時,要盡可能地不遺漏威脅,頭腦風暴的過程可以確定攻擊面(AttackSurface)在維護系統安全時,最讓安全工程師沮喪的事情就是花費很多的時間與精力實施安全方案,但是攻擊者卻利用了事先完全沒有想到的漏洞(漏洞的定義:系統中可能被威脅利用以造成危害的地方。)完成入侵。這往往就是由于在確定攻擊面時,想的不夠全面而導致的。
風險分析
風險由以下因素組成:
Risk = Probability* Damage Potential
影響風險高低的因素,除了造成損失的大小外,還需要考慮到發生的可能性。
介紹一個DREAD模型,它也是由微軟提出的。DREAD也是幾個單詞的首字母縮寫,它指導我們應該從哪些方面去判斷一個威脅的風險程度。
設計安全方案
最終,一個優秀的安全方案應該具備以下特點:
能夠有效解決問題;
用戶體驗好;
高性能;
低耦合;
易于擴展與升級。
白帽子兵法
Secure By Default原則
黑名單、白名單
黑名單、白名單比如,在制定防火墻的網絡訪問控制策略時,
如果網站只提供Web服務,那么正確的做法是只允許網站服務器的80和443端口對外提供服務,屏蔽除此之外的其他端口。這是一種“白·名單”的做法;
如果使用“黑名單”,則可能會出現問題。假設黑名單的策略是:不允許SSH端口對Internet開放,那么就要審計SSH的默認端口: 22端口是否開放了Internet。
但在實際工作過程中,經常會發現有的工程師為了偷懶或圖方便,私自改變了SSH的監聽端口,比加把SSH的端口從22改到了2222,從而繞過了安全策略。
在網站的生產環境服務器上,應該限制隨意安裝軟件,而需要制定統一的軟件版本規范。 這個規范的制定,也可以選擇白名單的思想來實現。按照白名單的思想,應該根據業務需求,列出一個允許使用的軟件以及軟件版本的清單,在此清單外的軟件則禁止使用。如果允許工程師在服務器上隨意安裝軟件的話,則可能會因為安全部門不知道、不熟悉這些軟件而導致一些漏洞,從而擴大攻擊面。
最小權限原則最小權限原則要求系統只授予主體必要的權限,而不要過度授權,這樣能有效地減少系統、網絡、應用、數據庫出錯的機會。
比如在Linux系統中,一種良好的操作習慣是使用普通賬戶登錄,在執行需要root權限的操作時,再通過sudo命令完成。這樣能最大化地降低一些誤操作導致的風險;同時普通賬戶被盜用后,與root帳戶被盜用所導致的后果是完全不同的。
縱深防御原則
縱深防御包含兩層含義:,
要在各個不同層面、不同方面實施安全方案,避免出現疏漏,不同安全方案之間需要相互配合,構成一個整體;
要在正確的地方做正確的事情,即:在解決根本問題的地方實施針對性的安全方案。
某礦泉水品牌曾經在廣告中展示了一滴水的生產過程:經過十多層的安全過濾,去除有害物質,最終得到一滴飲用水。這種多層過濾的體系,就是一種縱深防御,是有立體層次感的安全方案。
縱深防御并不是同一個安全方案要做兩遍或多遍,而是要從不同的層面、不同的角度對系· 統做出整體的解決方案。
在常見的入侵案例中,大多數是利用web應用的漏洞,攻擊者先獲得一個低權限的webshell然后通過低權限的webshell上傳更多的文件,并嘗試執行更高權限的系統命令,嘗試在服務器上提升權限為root;接下來攻擊者再進一步嘗試滲透內網,比如數據庫服務器所在的網段。
常有必要將風險分散到系統的各個層面。就入侵的防御來說,我們需要考慮的可能有Web應用安全、OS系統安全、數據庫安全、網絡環境安全等。在這些不同層面設計的安全方案,將共同組成整個防御體系,這也就是縱深防御的思想。
縱深防御的第二層含義,是要在正確的地方做正確的事情。如何理解呢?它要求我們深入理解威脅的本質,從而做出正確的應對措施。
對于一個復雜的系統,縱深防御是構建安全體系的必要選擇。
數據與代碼分離原則
實際上,緩沖區溢出,也可以認為是程序違背了這一原則的后果-程序在棧或者堆中,將用戶數據當做代碼執行,混淆了代碼與數據的邊界,從而導致安全問題的發生。
在Web安全中,由·“注入”·引起的問題比比皆是,如XSS. SQL Injection, CRLF Injection.. X-Path Injection等。此類問題均可以根據“數據與代碼分離原則”設計出真正安全的解決方案,因為這個原則抓住了漏洞形成的本質原因。以XSS為例,它產生的原因是HTML Injection或JavaScript Injection,
不可預測性原則
微軟的Windows系統用戶多年來深受緩沖區溢出之苦,因此微軟在Windows的新版本中增加了許多對抗緩沖區溢出等內存攻擊的功能。微軟無法要求運行在系統中的軟件沒有漏洞,因此它采取的做法是讓漏洞的攻擊方法失效。比如,使用DEP來保證堆棧不可執行,使用ASLR讓進程的棧基址隨機變化,從而使攻擊程序無法準確地猜測到內存地址,大大提高了攻擊的門,檻。經過實踐檢驗,證明微軟的這個思路確實是有效的–即使無法修復code,但是如果能夠使得攻擊的方法無效,那么也可以算是成功的防御。微軟使用的ASLR技術,在較新版本的Linux內核中也支持。在ASLR的控制下,一個程序每次啟動時,其進程的棧基址都不相同,具有一定的隨機性,對于攻擊者來說,這就是“不可預測性"。
不可預測性原則,可以巧妙地用在一些敏感數據上。比如在CSRF的防御技術中,通常會使用一個token來進行有效防御。這個token能成功防御CSRF,就是因為攻擊者在實施CSRF攻擊的過程中,是無法提前預知這個token值的,因此要求token足夠復雜時,不能被攻擊者·猜測到。
不可預測性的實現往往需要用到加密算法、隨機數算法、哈希算法,好好使用這條原則,在設計安全方案時往往會事半功倍。
第二篇 客戶端腳本安全
第2章瀏覽器安全
同源策略
同源策略(Same Origin Policy)是一種約定,它是瀏覽器最核心也最基本的安全功能
如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略的基礎之上的,```瀏覽器只是針對同源策略的一種實現`。對于客戶端Web安全的學習與研究來說,深入理解同源策略是非常重要的,也是后續學習的基礎。
很多時候瀏覽器實現的同源策略是隱性、透明的,很多因為同源策略導致的問題并沒有明顯的出錯提示,如果不熟悉同源策略,則可能一直都會想不明白問題的原因。
瀏覽器的同源策略,限制了來自不同源的"document"或腳本,對當前"document"讀取或設置某些屬性。
這一策略極其重要,試想如果沒有同源策略,可能a.com的一段JavaScript腳本,在b.com未曾加載此腳本時,也可以隨意涂改b.com的頁面(在瀏覽器的顯示中)。為了不讓瀏覽器的頁面行為發生混亂,瀏覽器提出了"Origin" (源)這一概念,來自不同Origin的對象無法互相干擾。對于JavaScript來說,以下情況被認為是同源與不同源的。!
由上表可以看出,影響“源”的因素有: host (域名或IP地址,如果是IP地址則看做一個根域名)、子域名、端口、協議。
需要注意的是,對于當前頁面來說,頁面內存放JavaScript文件的域并不重要,重要的是.加載JavasScript頁面所在的域是什么。換言之, a.com通過以下代碼:
加載了b.com上的b.js,但是b.js是運行在a.com頁面中的,因此對于當前打開的頁面(a.com頁面)來說, b.js的Origin就應該是a.com而非b.com。在瀏覽器中,