現代社會,程序員比黑客難當?

本文最初發表在 Medium 博客上,經原作者 Tyler Elliot Bettilyon 授權,InfoQ 中文站翻譯並分享。

導讀:常言道:“未知攻,焉知防”。知彼知己者,百戰不殆;不知彼而知己,一勝一負;不知彼,不知己,每戰必殆。黑客所要攻破的任何目標,無論是網站、軟件還是物聯網硬件產品,這些都是由程序員開發的,所以,他們要攻破的其實就是程序員的安全思維缺陷。如果黑客本身就是程序員呢?他們就會從程序員的角度入手,去挖掘漏洞。但黑客未必也是編程高手。不過,也不是說搞安全就不需要學編程開發了,恰恰相反,是必學課程。只是,很多情況下,黑客具備的是基礎開發能力,而非開發產品的能力,兩者還是有區別的。但其實也不絕對,這裏說的只是一種普遍情況。不過,你知道嗎?懂安全的程序員往往沒有存在感:防禦住了,用戶無感知;未防禦住,用戶就開始罵娘了,或者受公司處罰。程序員開發的產品出安全事故,肯定會受到處罰。但如果懂安全的程序員開發出具有高安全性的產品,對用戶,甚至對領導而言,都可能是無感知,跟不存在似的。難怪程序員面對黑客發出這樣的感嘆:我真的太難了!!

今天,儘管網絡安全從未如此重要,但在很大程度上,它對於其他領域的人來說是神祕的。

這是一個很令人着迷的故事,一個孤膽黑客,僅憑藉一臺計算機和一顆腦袋就幹掉了壞人,或者欺騙壞人。但無可否認的是,黑客的原型具有一種培養出來的精神氣質:自由精神、個性和微妙的詭詐。從 20 世紀 90 年代的經典電影片《黑客》(Hackers)到更現代(也更現實)的美國電視連續劇《黑客軍團》(Mr. Robot),長久以來,黑客在流行文化中佔據着特殊地位。

隨着軟件行業繼續“吞噬世界”,軟件安全行業也隨之發展。隨着部署的軟件越來越多,越來越多的軟件容易受到攻擊也就在情理之中了。事實上,越來越多的專業人士開始擔心,網絡安全公司人手嚴重不足,幾乎沒有足夠的人手來應對日益增多的網絡攻擊。更糟糕的是,軟件開發人員加速培訓計劃的持續推進,而這意味着更多的開發人員正在部署沒有經過任何正規安全培訓的代碼。

衆所周知,“物聯網”上的設備不安全。

安全基礎知識的缺失一直是個問題:許多高校在計算機科學學位課程中並不要求安全培訓,但由於學校鼓勵開發人員用較少的培訓來做更多的工作,結果導致了這個問題進一步惡化。此外,軟件生態系統越來越鼓勵開發人員嚴重依賴第三方軟件,他們往往沒有評估該軟件的漏洞。2016 年的“left-pad 庫”事件讓我們看到,對第三方軟件越來越多的依賴是如何讓互聯網面臨風險的。

“left-pad 庫”事件

left-pad 是一個簡單的程序,它可以用某些字符(通常是 0 或空格),來“填充”左側的文本值,直到它達到指定的大小爲止。這個函數主要用於格式化文本輸出,使其更容易閱讀。實現很簡單;在這一事件發生時,該函數只有 11 行簡單的 JavaScript 代碼。然而,有成千上萬的開發人員在他們的代碼中包含了這個庫,他們中的許多人在不知情的情況下包含了一個包含 left-pad 的不同庫。

這一事件始於一個名爲 npm 的流行 JavaScript 庫管理工具中取消了 left-pad 庫。當時,所有依賴 left-pad 的項目都崩潰了。所有依賴於依賴 left-pad 的項目的那些項目也都崩潰了。對於 JavaScript 社區來說,這是一個巨大的麻煩,也讓許多業餘愛好者和公司暫時停止了開發。

從安全角度來看是這樣的:如果 left-pad 的維護者沒有取消發佈庫,而是增加一個這樣“功能”:將 left-pad 的填充信息記錄發送到他們控制的服務器上,或者更糟糕的是,如果是試圖安裝一些更全面的監控惡意軟件呢?如果庫只有一個小小的 Bug,可以被聰明的黑客加以利用,那會不會有那麼惡意呢?

因爲有那麼多人在不知情的情況下依賴於代碼,這種漏洞利用很容易被下游開發者忽視。這種相互依存的軟件網絡是軟件生態系統日益複雜的一種方式,它放大了小漏洞的威力。

簡單的錯誤可能會導致災難性問題

去年,《大西洋》(the Atlantic)雜誌發表了一篇文章《The Coming Software Apocalypse》(《正應驗的軟件啓示錄》),該文對現代軟件的異常複雜性以及隱藏在複雜性中的簡單錯誤如何導致災難性問題進行了令人痛心的審視。要我舉個例子嗎?整個華盛頓州發生了長達 6 小時的停電事件,導致 911 報警熱線電話停機,無法響應呼叫:

911 停機事件是當時報道的有史以來最嚴重的停機事件,其起因可追溯到位於科羅拉多州恩格爾伍德市的一臺服務器運行的軟件。該服務器由一家名爲 Intrado 的系統供應商運營,它一直在運行一個計數器,記錄有多少電話已經轉到全美各地的 911 調度員那裏。Intrado 的程序員爲計數器可以記錄的數量設置了閾值。他們選了一個數百萬的數字。

4 月 10 午夜前不久,計數器的數值就超過了這個閾值,結果引發了混亂局面。因爲計數器是用來爲每個電話呼叫生成一個唯一的標識符,因此後面來的新電話呼叫就被拒絕了。而且,程序員沒有預料到會發生這個問題,他們也就沒有創建警報來引起人們注意這一問題。

雖然這次 911 停機事件不是協同攻擊(Coordinated attack)的結果,但我們很容易把這個漏洞想象成《Ocean’s Eleven》電影(大陸:《十一羅漢》、香港:《盜海豪情》、臺灣:《瞞天過海》)風格的蒙太奇畫面的一部分:黑客們在實施大規模搶劫之前,會設法讓數值突破上限,這樣,就可以在他們脫身之前阻止有關搶劫的報道。這是一個普通的錯誤,在一般情況下,很容易得到原諒,但如果是拒絕 911 電話呼叫的話,可能會帶來悲慘的可怕後果。

防範和防止這種類型的故障,絕對是軟件安全專業人員的工作範圍。思考任何軟件所有可能出現的故障模式,對系統加固和風險緩解都是至關重要的。然而不幸的是,像爲數據庫條目設置任意閾值這樣的小錯誤可能會產生巨大的人爲影響,而軟件世界中遍地到處都是小錯誤(還記得千年蟲問題嗎?)

讓我們來看看另一個例子,黑客能夠利用“魚缸智能溫度計”來竊取賭場的豪賭者數據庫。在這種情況下,與賭場網絡的其他入口點相比,溫度計更不安全。事實上,“物聯網”上的設備就是出了名的不安全。據《連線》(Wired)雜誌報道,這類設備經常容易受到攻擊,原因多種多樣,包括設備製造商缺乏對安全的承諾、設備上運行的代碼缺乏透明度,以及使用和安裝這些設備的人缺乏相關知識。

爲享受用智能手機來關燈的便利,冒着網絡攻擊的風險,這值得嗎?

安裝“智能溫度計”的員工並不是軟件安全專家,這是可以理解的(老實說,這也是預料之中的)。即使是許多精通軟件的人沒有將溫度計視爲攻擊載體,也是情有可原的。然而不幸的是,每一個聯網的設備都會讓我們容易遭受攻擊。我們需要設備製造商開始認真對待安全問題。此外,人們應該明智地仔細考慮他們從“智能”設備和“愚蠢”設備中獲得了多少價值。爲了享受用智能手機關燈的便利而冒着網絡攻擊的風險,值得嗎?

黑客、滲透測試人員和政府特工

首先是最知名的原型。攻擊性安全工作就像“破門而入”,做一些你不該做的事情。任何一個攻擊性黑客的特定目標都可能有很大的不同,從執行勒索軟件攻擊(如WannaCry)到竊取數據庫記錄,但這項技術的關鍵始終無非是關乎這樣的一個問題:“我能做什麼?這個系統的所有者不想讓我做什麼呢?”

有時,這項工作涉及到軟件設計和實現的深層知識。以最近一次針對加密貨幣交易網站 MyEtherWallet.com的攻擊事件爲例。在這次攻擊中,黑客利用了兩個關鍵網絡協議的薄弱點。首先,黑客攻擊了域名系統(Domain name system,DNS),該系統將人類可以理解的名稱(如 MyEtherWallet.com)映射到計算機可以理解的 IP 地址,這些 IP 地址用於路由互聯網流量。這種稱爲域名服務器投毒(DNS poisoning)的攻擊,允許黑客能夠發送僞造的 IP 地址來響應MyEtherWallet.com 的查詢。

其次,黑客攻擊了邊界網關協議(Border gateway protocol,BGP),該協議使用 IP 地址,實際控制如何通過互聯網的物理基礎設施路由流量。這種稱爲 BGP 泄漏(BGP leak)的攻擊,導致互聯網流量通過受感染的計算機傳播,從而使攻擊者能夠毒害更多的 DNS 查詢。

結果,一些在瀏覽器地址欄輸入 MyEtherWallet.com 的用戶被髮送到一個看起來像 MyEtherWallet.com 的釣魚網站。當毫無戒心的用戶在釣魚網站輸入自己的用戶名和密碼時,這些信息就會發送給攻擊者,然後他們使用這些信息來清空這些賬戶。

其他的攻擊性工作可以更加人性化。就拿這段搞笑(但也恐怖)的視頻來說吧,一位社會工程專家僅僅用了一個電話號碼欺詐器(Phone number spoofer)、一段嬰兒哭泣的音頻以及個人魅力,就接管了某人的手機賬戶:

視頻

嗨,您好。不,這不是我的賬戶,啊,我的孩子哭了……您能幫幫我嗎?

入侵系統需要黑客有創造力、靈活性和全局觀。黑客,無論是白帽黑客、黑帽黑客,還是介於這兩者之間的黑客,都能從思考多種入侵系統的選擇中獲益。以入侵電話賬戶爲例 ,攻擊者可能會嘗試暴力破解(Brute force)來獲取他們的目標密碼。他們可能會使用類似針對上述 MyEtherWallet 的釣魚攻擊(Phishing scheme)。他們也可能會嘗試像上面視頻裏的社會工程策略。他們還有可能會嘗試使用惡意軟件主動入侵電話公司的網絡。

當一個入侵策略看起來不起作用時,攻擊者就會嘗試其他策略。震網病毒(Stuxnet)和火焰病毒(Flame)的故事就很能說明問題。這兩個程序是有史以來最令人印象深刻、也是最爲複雜的惡意軟件。據信,這兩個蠕蟲病毒是由爲美國和以色列政府工作的黑客從 2007 年開始合作創建的。震網病毒是一種蠕蟲病毒,它有一個特定的目標:感染並關閉伊朗的核設施離心機。火焰病毒,以惡意軟件標準衡量,是一個巨大的程序,大約有 60MB,更像是一把從事間諜活動的瑞士軍刀。一旦主機感染這個惡意軟件,控制者就能竊取數據、監控按鍵輸入、打開攝像頭和麥克風,並打開遠程通道以便安裝更多的惡意軟件。

最初讓安全專家認爲這兩種蠕蟲是同一個創建者的原因是它們的特徵:病毒用來傳播自己的機制。火焰病毒利用了一個針對 Windows 更新服務器的漏洞,使病毒能夠僞裝成合法的系統更新,這顯然是一種將蠕蟲病毒廣泛傳播的有效方式。

另一方面,震網病毒針對的目標是一個已知採取內外網之間物理隔離措施的設施——這意味着該設施中的所有計算機都沒有連接到互聯網。震網病毒依靠的是一個這樣的漏洞,允許被感染的 U 盤自動感染它們所插入的任何 Windows 計算機。沒有人知道誰是所謂的“零號病人”,但據我們所知,國家安全局的特工在伊朗核設施的停車場周圍“散落”了幾個受感染的 U 盤。

火焰病毒使用了這種完全相同的 USB 漏洞,這也是安全專家最初將這兩種病毒聯繫在一起的發現之一,但震網病毒似乎沒有利用 Windows 更新服務器的漏洞。震網病毒的創建者知道他們無法通過這種方式來入侵與互聯網隔離的系統,所以他們沒有利用這種漏洞來傳播病毒。另一方面,雖然震網病毒總是試圖感染插入受感染計算機上的 U 盤並進一步傳播自己,但火焰病毒卻關閉了這個功能。火焰病毒並沒有像震網病毒那樣,將自己複製到新的 U 盤上。

由於時下安全問題已經成爲整個計算機系統的重中之重,因此讓系統安全的責任就落在了最瞭解系統的人身上。

關鍵是,即使火焰病毒和震網病毒的創建者可以利用相同的漏洞來傳播惡意軟件,但他們並沒有把所有的漏洞都拿出來加以利用,看看哪些漏洞會被攔截。他們經過仔細思考,根據自己的目標決定使用哪些漏洞。

在政府部門工作,能夠製造像火焰病毒和震網病毒這樣的惡意軟件的人,就是黑客界的 NBA:少數傑出的黑客從事這類工作。還有其他一些人在從事類似的工作,但他們的專業知識較少,而且他們所從事的工作的利害關係也不像網絡戰那麼極端。

滲透測試人員是公司花錢僱傭的黑客,讓他們試圖入侵公司自己的系統。公司付錢讓黑客報告他們是如何入侵公司系統的,這樣他們就可以加固自己的系統。另一類黑客,介於滲透測試人員(白帽黑客)和惡意黑客(黑帽黑客)之間,他們是試圖從許多公司提供的“Bug 賞金計劃”中獲利的個人。通過 Bug 賞金計劃,公司同意向任何能夠對其系統進行特定操作(比如訪問數據庫)的人支付報酬,以換取黑客解釋他們是如何做到的。

滲透測試人員所做的大部分工作都依賴於使用預製工具來執行攻擊測試。他們是工具的使用者,而不是工具的創造者。許多工具仍然需要一些技術專業知識來操作,但不需要那麼多。滲透測試人員可能是程序員或軟件工程師,也可能不是,但他們幾乎都是熟練的計算機用戶,他們喜歡學習新技術和新興工具集。

由於所需的技能在很大程度上取決於具體的目標,因此,進攻性工作的範圍是廣泛而多樣的。從技術含量最低的社會工程到技術含量最高的惡意軟件、加密破解程序和網絡入侵工具的開發。

緩解與防範

緩解和防範都與防禦有關:構建系統,讓黑客難以做他們不應該做的事情。從事這類工作的人往往是技術性很強的。軟件工程師,尤其是在系統級工作的工程師,承擔了這項工作的很大一部分。

也就是說,系統管理員、DevOps 工程師和網絡工程師都會參與一些緩解/防範項目。應用開發者也必須做一些這方面的工作,特別是要修補他們所構建的應用程序引入的安全漏洞。這種工作正逐漸從應用工程師轉移到系統工程師。操作系統工程師定義應用程序開發人員用來訪問重要內容的接口,比如文件系統或網卡上的文件。因爲安全性現在是計算機系統的頭等大事,所以默認情況下,確保系統安全的責任就落在了最瞭解系統的人身上。Windows 操作系統團隊最瞭解 Windows 是如何工作的,因此,他們最清楚如何防止在操作系統級別發生嚴重的入侵。換句話說,一個優秀的操作系統應該讓應用程序工程師很難引入安全漏洞。

大型組織都有專門的軟件團隊致力於創建 API,這些 API 本質上是安全的,可以供應用開發者使用。通過限制應用開發者只能做出“安全”的選擇,我們就可以大幅降低總體攻擊面。例如,Google 在 4 月份宣佈,Android 操作系統現在默認所有連接都採用 TLS,這意味着互聯網連接在默認情況下是加密的。

使用未加密的連接顯然會帶來隱私風險,而默認使用 TLS 可以防止 Android 用戶全面暴露在這種風險之下。在之前的版本中,應用開發者要確保連接被正確加密。通過防止應用開發者意外做出 “錯誤的決定”,Google 消除了各種潛在的攻擊載體。

軟件組織需要認真對待構建安全軟件系統的意識、培訓和執行。

軟件的激增和潛在攻擊者數量的增加,給各類開發人員帶來了壓力。顯然,如果應用程序開發人員能夠做到不造成安全漏洞,那將是極好的,因爲操作系統工程師已經堵住了所有可以將得到的漏洞,但這想法是不現實的。因此,應用程序開發人員及其管理團隊需要在整個軟件開發生命週期中更加註意安全實踐。

現在,人們想進入編程領域的方式比以往任何時候都要多,但其中大多數(包括許多高校學位課程)完全沒有關注如何設計安全的軟件。軟件組織需要認真對待構建安全軟件系統的意識、培訓和執行。

軟件中不可避免的漏洞使得軟件開發下游的安全實踐也成爲必要。系統管理員等 IT 專業人員也會執行緩解和防範任務,例如,設置安全的 VPN 以限制對重要內部服務器或數據庫的訪問、選擇一家在安全方面投入大量資源的雲提供商,以及設置監控和日誌記錄工具,以便在網絡上的設備出現異常行爲或發送可疑流量時通知參與方。

日常計算機用戶也應該採取緩解措施,希望通過選擇強密碼、最大限度地減少密碼重用、使用雙因素身份驗證,並使用注重隱私/安全性的軟件,如EFF 的 HTTPS EverywhereBrave Web 瀏覽器Keybase

就像“現實生活”中的安全措施一樣,防範通常是一場比別人更不容易受到侵害的遊戲。試想一下,一輛未上鎖的車比一輛上鎖的車更容易被搶,不是嗎?扒手會尋找從褲子後面口袋露出來的錢包。入室盜竊者會避開狗吠和警報系統。數據竊賊在訴諸窮舉暴力攻擊之前,會先嚐試常用密碼。黑客在網絡中尋找薄弱點(比如魚缸智能溫度計)。有一樣東西是黑客們喜歡的——就像打開了一扇門——那就是過時的軟件。

黑客們希望將時間和精力花在破解一些能讓他們訪問很多機器的東西上,如果能在一個主要的操作系統、網絡服務器平臺或加密庫中找到一個缺陷,那將是一隻會下金蛋的鵝。當發現這樣的缺陷時,有缺陷系統的安全團隊就會做出反應,發佈更新來堵住漏洞。保持更新是注重安全的 IT 經理工作的一個關鍵方面。

最後,由於安全工作的性質日新月異,在紅隊對藍隊的演習中,攻防雙方通過交換進行交叉訓練是很常見的。學習如何攻擊系統有助於你更好地防禦黑客攻擊,反之亦然。

取證與檢測

攻擊是不可避免的;取證就是對攻擊進行事後調查。比如現在臭名昭著的 2016 年美國民主黨全國委員會郵件泄密事件,這些公司都是在事後才被僱傭的。當時僱傭後,要拿回電子郵件已經太晚了,但任何理智的人都會希望:

  1. 阻止別人(或同樣的人)再次入侵系統。
  2. 弄清被盜的東西都有哪些,以及(如果可能的話)
  3. 確定黑客的身份。

理想的情況是,網絡攻擊的受害者能夠比其他人更早知道這一點。與緩解和防範工作相結合,注重安全的工程師和 IT 專業人員通常會在關鍵的軟件系統中添加日誌和報告工具。這種報告可能涉及從崩潰報告接收遙測數據,或者記錄入站和出站的網絡流量。這些報告工作創造了一些線索,數字偵探最終可以利用這些線索來找出某人是如何入侵系統的,哪些東西被泄露或被竊取了,以及問題的潛在範圍。

根據不同的情況,取證工作可能涉及到查看數據庫訪問日誌、網絡流量日誌、在文件系統中搜尋有關入侵的線索,比如惡意軟件和被入侵用戶創建或更改的文件。這項工作往往是多學科的,黑客很有創造力,他們會使用很多策略來入侵系統,所以數字取證專家需要精通各種策略。

瞭解更多的安全最佳實踐從未如此重要。

對於數字取證的大多數人來說,目標是確定目標數據和/或系統,並從這些系統中收集和恢復這些信息,然後分析收集的數據,以確定攻擊行爲是如何發生的。安全審計的結果最終可能成爲訴訟或刑事起訴。數字取證專家得益於對法律和法律程序的理解,以幫助他們知道哪些信息可能與律師、法官和陪審團相關。他們還知道如何以一種不使信息在法庭上不被接受的方式獲取信息,這對於 FBI 等機構的數字取證工作來說絕對是至關重要的。

在防範方面,許多工作都是由軟件工程師完成的,以確保系統的安全。在取證中,它更多的是關於使用工具和理解全局,而不是編寫代碼。數字取證專家將編寫簡單的腳本和程序來幫助他們尋找、收集和保存線索,而且,肯定有人在編寫這些工具。但在大多數情況下,取證工作並不涉及軟件庫的創建或任何大規模的軟件工程工作。

密碼學與加密技術研究

最後一種類型的安全專家也涉及到最多的數學問題。密碼學研究人員開發了新的代碼、密碼算法和加密技術,以確保數據能夠以一種保護數據的方式安全存儲或傳輸。密碼學是一個嚴重依賴計算機科學和數學主題的領域。

正是這些人發明了像 RSA 公鑰加密過程或 SHA 系列加密哈希函數等算法。這與上述任何其他工作都有本質上的不同。以上所有其他類型的工作都涉及到保護和破解實際存在的系統,它們涉及到實際的電話、實際的數據庫和實際的網絡服務器。而密碼學是關於更抽象地保護數據的安全。

密碼學家在很大程度上依賴於數學原理來創建能夠以幾種關鍵方式處理數據的算法。具體來說,密碼學領域是圍繞這五大支柱展開的:

  1. 保密性:只有受信任的各方纔能讀取消息。
  2. 完整性:任何人都不能篡改或更改安全數據。
  3. 身份驗證:可以確認相關各方的身份。
  4. 授權:可以爲各個受信任方建立不同級別的訪問權限。
  5. 不可否認性:這樣就可以證明收到了一條消息。

傳輸層安全協議(Transport Layer Security,TLS)是網絡通信安全的基礎,它涉及到提供認證、保密性和完整性的加密算法。身份驗證確保你連接到正確的網絡服務器;保密性以確保只有你和該網絡服務器可以看到你的通信;完整性確保在消息傳輸過程中沒有人能夠改變這些消息。TLS 允許在大部分連接中使用不集中不同的加密算法,但在 TLS 握手過程中需要使用 RSA 進行身份驗證並確保保密性。

TLS 實現(如 OpenSSL)的開發人員依賴數學研究人員發明具有所需特性的加密算法。就像應用開發者依靠操作系統工程師爲操作系統提供安全的 API 一樣,操作系統工程師依賴密碼學家發明安全的加密算法。這個層次上的問題會在整個依賴數學的技術中層出不窮,例如,火焰病毒之所以能夠通過僞裝成合法的 Windows 更新進行傳播,就在於一種名爲 MD5 的加密哈希算法的錯誤。

許多密碼學家正在研究新的加密算法,以期不受量子計算機的影響。強大的量子計算機有望破解 RSA。如果一臺高性能量子計算機出現,RSA 將會變得完全不安全,大量互聯網流量將不得不改用後量子密碼學的加密算法來代替 RSA。

軟件安全是一個巨大的市場,而且正在不斷增長,現在是深入其中的最佳時機。如果你已經在軟件領域中工作,那麼學習更多的安全最佳實踐就顯得尤爲重要。計算機和互聯網不會在短期內消失,所以,我們還是不妨想想辦法保護這些該死的東西吧!

作者介紹:

Tyler Elliot Bettilyon,充滿好奇心的人,教授計算機編程,撰寫與社會和政治有關的文章。個人網站爲:www.tebs-lab.com

原文鏈接:

https://sourl.cn/2qkawk

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章