吶,少年,你想學習資安嗎?

Translated by NotSurprised
Mar 7, 2018

Tuesday,February 6,2018

Posted by Ivan Fratric at 4:21 AM

已經有很多人(包括我Google的同事,ParisaMichal 都曾經就這個話題寫過自己的想法,我建議你仔細閱讀。我知道我寫的這些可能已經有人說過了,但是每隔一段時間我總是會再次遇到這個問題,於是我決定寫下我自己的經驗。

首先談到的是,我是一個應用程式的安全研究員,我是從 漏洞研究/安全審查/ 尋找bug/ 駭客攻擊 等角度來寫這篇文章的。因為在安全領域還有很多其他的方向,比如安全研發,惡意軟體分析等等,而我對這些並不熟悉。

那麼,我是誰?為什麼你要在這個話題上信任我呢?嗯,首先我不是說你應該完全信任我,因為每個人的經驗和每個人的道路都是有所不同的。但如果您對我有那麼點感到好奇,我可以直接告訴您,我現在是Google Project Zero 的成員,我曾經是谷歌安全團隊的成員,是多個安全工具的作者,如果你在這個Blog上多花點時間翻閱,你會發現我已經從事安全工作十多年了。

我所認識的安全研究員皆來自許多不同的背景,但是我的背景卻不同,我有相當強的學術背景,這在我的同行中是非常罕見的,當然這並不是進入安全領域的門檻要求。然而,我所知道的安全研究員中的大多數人都有一些共同點,這裡我們來看第一條:

自己做點東西 對於我所知道的業內大多數人來說,在從事相關工作之前,安全只是一項業餘愛好。當然,如果你只是考慮如何學習安全,在告訴你如何開始之前,我得先告訴你自己做點東西並不會有什麼太大的幫助。繼續往下閱讀,我會在下面提到如何開始。而首先,還有一件事你應該注意(但不要讓它成為阻礙你的難關,我們將在後面看到如何解決它)

現在開始學習安全,比十年前困難的多 我懷疑這件事不是每個人都會承認,但是安全在過去這些年,確實有了很大提高。是的,如果你足夠深入的話,你將會發現用十多年前的技術仍然沿用在可以運行的軟件或者硬件,例如 Web瀏覽器。當我正在研究我的第一個 Windows漏洞利用(stack overflow)時,我感到十分沮喪,因為微軟最近引入了新的 safe unlink機制,所以我讀到的一些眾所周知的stack overflow漏洞利用技術已經不再有效。但 10年後,剛開始學習安全的人們不僅需要處理 safe unlink 和 stack cookie ,還需要知道 SafeSEH / SEHOP、DEP、ASLR、CFG、ACG 還有瀏覽器的sandbox 等等。並不只限於 Web瀏覽器,如果你對比一下十年前和現在的 Web應用框架,你會發現在安全技術上已經了顯著的不同。

請不要害怕上面這一段文字,那麼你應該如何應付日益陡峭的學習曲線呢?

利用好學習資源 一般而言,剛開始入門的難度的確比較高,但實際上,現在的學習資源也比以前還要豐富。

但是另一個警告是: 你需要能夠走出舒適圈並且自主學習,沒有人會牽著你的手,或者成為你的導師(可能其他行業總是有厲害的師父善於傳承,站出來來幫助學徒成長,但是駭客很少這樣做)。 如果你喜歡按照預先設定好的課程大綱來進行(就像我承認關於我的大部分教育所做的那樣),那麼你可能就不會在安全這方面走得太遠。

在獲得正確的學習資源之前,您需要學會正確地提問。 Google搜索 “如何成為駭客” 和類似的問題,在現在仍然會得到與以前一樣的一堆胡說八道。 相反,請嘗試搜尋更加細緻的問題,例如:

  1. 我感興趣的這個軟體/硬體是如何運作的?它基於什麼技術?有我可以閱讀的源碼嗎?有教程嗎? 有技術文件嗎?
  2. 有人已經設法成功破解了我想要破解的這一軟體/硬體嗎?他們有發布了 WriteUp嗎? Exp呢? 會議介紹呢? 我真的明白他們是怎麼做了什麼了嗎?

由此可見,你自己必須在技術上相當不錯,以了解由別人製作的真實軟體或硬體是如何工作的。 雖然編寫程式碼和閱讀程式碼的技能並不完全相同,但仍存在相當大的重疊,所以如果您不習慣寫程式碼,在進一步深入研究安全之前,您可能需要改進這一點。

不要忘記第二點。 雖然之前我對技術性的東西還算是比較好的,但是直到我開始閱讀其他人發布的漏洞研究和 Exp後,我才真正理解安全為何物。

還有另一個警告: 當你遇到你不了解的東西時,不要放棄。 特別是在剛開始閱讀各種資源時,你會遇到的許多問題。 跳過這些部分的確是簡單的方法,但也是絕對錯誤的方法。 相反,想想遇到的每一bit的訊息都是你不了解的,那把它們作為線索,想想你還需要學習什麼。

雖然我寫到沒有人會牽著你的手,但這並不意味著你不應該提問。 事實上,你應該更自私一點。 人們不會為你而放下自己所做的工作,但如果你卡住了,他們可能會抽點時間給你一個正確的方向。

使用推特 擁護一個特定的社交網路看起來很奇怪,但一個重要事實是很多安全團隊都使用 Twitter 來分享新聞,而且更重要的是那些最近的研究、漏洞、 PoC、會議演講和其他類似的資源連結都在這。 我真的不知道這些的起源是怎麼發生的,也許是短消息的形式讓人們更方便地分享資源連結,而不用受到漫長而不必要的討論的困擾。 所以,在 Twitter 上找那些研究或發表了你感興趣東西的人,然後翻閱他們的推特吧。

除了Twitter 以外,你可以找到有趣資源的其他地方是r/netsecHacker News (儘管它除了安全性外還有某些其他的東西)。 你還可以看看安全會議的演講和錄音(它們有很多,但並不都是好的。 請將重點集中於技術性較強的那些會議)。

打 CTF 是一種很好的學習方式 這是另一個我給你們的奇怪建議,因為我自己幾乎從不玩CTF,但是還記得我前面寫的有關難度曲線的內容嗎? 打 CTF 可以讓你的學習經歷更加循序漸進,因為 CTF 的賽題有多種難度級別(你通常可以通過每個賽題的分數來分辨),所以你可以從更簡單的開始,然後從那裡開始一點點學習。 舉個例子,在關閉某些漏洞防護機制之後練習漏洞利用。 然後知道這兒有一個bug或知道用甚麼方式來解決它,也能獲得些許成就感。

幾乎每個星期在某一個地方都有一個 CTF 舉行,其中大部分都是可以在線上解題的,你可以在這邊 找到安排的比賽時間。 如果你不能解決賽題,不要忘了還有他人解題後的 WriteUp 可以賽後參考學習。

CTF 可以成為一種很有趣的經歷,但當你學會一些東西之後,別忘了活用這些經驗繼續研究真實世界中的目標,你可能會感到十分驚喜!

還有,當你遇到真實世界的問題時:

不要害怕失敗,哪怕一次又一次。

現在漏洞研究的工作常常是讓人十分沮喪的,大部分你嘗試的東西都不會成功,但你必須接受這一點。 而且不要因此而灰心喪志。 這不是因為你初學經驗不足而發生在你身上,對於每一個富有經驗的研究員來說也是如此。 我們往往只能看到別人的成功,卻不知道其背後的代價。 當你失敗的時候,在繼續前進之前一定要弄明白失敗的原因。

你比你想像的更加聰明(反之亦然: 其他人並不像你想的那樣聰明)。 這可能是一個有爭議的觀點,因為有其他人提出了“你並不比開發者更聰明” 的建議。 雖然這是真實的,對於業內很多人來說,這是一個很好的建議。但對許多剛剛入門或正在考慮入門的人來說,這可能是錯誤的,因為事實是,在看到別的聰明人做什麼之後,如果自己沒有在這個領域做任何事情,就很容易懷疑自己的能力。 讓我舉個例子: 現在你可能聽起來很奇怪,但是當我開始把安全作為一種愛好時,我認為我從來沒有足夠的能力去發現 Windows 中的漏洞。我從來沒有嘗試過,但是我偶然發現了我的第一個 Windows 漏洞:我 fuzz 了一些防護超爛的圖像庫,過了一段時間,我有一些崩潰樣本。 而當我意外地點擊 Windows 中的其中一個崩潰樣本時,Windows 資源管理器崩潰了- 這就是CVE-2008-3013。

另外一個例子: 在對一個軟體進行審查的時候,你可能會有一個想法,然後想“不,這太愚蠢了,開發人員肯定會想到這個”。 事實是,他們經常沒有。 公平地說,那不是因為他們愚蠢,那很可能是因為他們當時想到了其他問題並全神貫注的再處理。所以,如果“我比他們聰明”的思維方式有助於突破你為自己設定的人為限制,就請堅信這點吧。

當你和別人,特別是開發者交談的時候,請記住,他們是程式碼方面的專家,但是你是安全方面的專家。

我如何證明自己的能力? 可以從賺錢開始:很多公司都有 bug bounty program: GoogleFacebookMicrosoft,以及更多 更多 其他的獎金專案。

即使你挖到的漏洞拿不到獎金,但能幫助到他人,仍然能夠幫助證明你的實力。

挖漏洞並不是唯一的途徑,開發安全工具,做防禦性的研究,同樣是很有價值的。

還有什麼是我需要知道的? 安全研究員的人生可能並不像你想像的那麼光鮮亮麗,為了成為一個享負盛名的大神,你需要在電腦面前坐到天荒地老。 這是一份有挑戰性的工作,並且需要花費相當大的精力。