本章介紹頂尖駭客最熱衷的技術領域,弱點的發現與利用。
資安中的弱點(vulnerability)是指系統、軟體、網路或流程中存在的缺陷或瑕疵,攻擊者可以利用這些弱點來取得未經授權的存取權,干擾服務,或竊取資料等非法行為。
弱點只是系統的「缺陷或破口」;當攻擊者設計出一段程式或操作序列,能夠實際利用這個缺陷達成入侵、竊取或破壞,那段程式/方法就叫做 弱點利用(exploit)。換句話說:弱點 = 入口,弱點利用 = 開門的鑰匙或破門的方法。
弱點是問題的「存在」,弱點利用是把問題變成攻擊的「行為」
典型攻擊流程
現實案例 - Heartbleed
2014年OpenSSL加密函式庫被發現一個重大弱點,攻擊者只要送出特製請求,就能從伺服器讀出最多 64KB 的記憶體資料,可能包含私鑰、帳號、密碼等敏感資訊,而且不會留下痕跡。
「RCE就像有人寄來一個陷阱檔案,然後它開始執行指令,好像駭客坐在你的鍵盤前一樣。」
「就像拿著訪客證走進大樓,卻找到方法打開了主管辦公室的門。」
「即使沒有直接控制權,資料洩漏也同樣危險──駭客往往藉此規劃下一步行動。」
「有時候,攻擊者不想闖入,他們只是想讓一切停止運作。」
記憶體管理上的缺陷,在像 C 與 C++ 這類語言中特別危險。
例子包括:
「這些漏洞讓攻擊者能夠存取或覆寫他們不該碰的記憶體區域——可能導致系統當機、資料外洩,甚至遠端代碼執行。」
對抗記憶體溢位較有效的語言有:JAVA、Rust、C#
當 不受信任的資料被當作程式碼解讀 時,就會發生注入攻擊。
例子包括:
「可以想像成這樣——你問資料庫一個問題,但攻擊者偷渡惡意指令進來,變成執行惡意指令。結果不再是查某個使用者,而是讓資料庫把所有使用者資料全部洩漏出來。」
儘管這些弱點被廣泛知悉,但它們仍然是網路上被濫用最頻繁的漏洞之一。
防範方法包括:消毒輸入、固定格式,以及使用 PreparedStatement。
XSS(Cross‑Site Scripting) 是一種網頁應用程式漏洞,攻擊者把惡意 JavaScript 或 HTML 注入到網站中,使其他使用者的瀏覽器在不知情下執行這些程式碼,進而竊取資料、篡改頁面或劫持使用者會話。
常見類型
可能的影響
弱點接露(Vulnerability Disclosure) 是指當安全研究人員、白帽駭客或使用者發現系統、軟體或服務中的安全缺陷時,將該發現通報給相關責任方(例如軟體開發者、服務提供者或資安協調單位)的過程。
接露的方式
常見的相關單位
當某個漏洞在被公開揭露或有補丁發布之前,已經被攻擊者發現並實際利用,這種情況稱為 零日攻擊(Zero‑day attack)。意思是防守方有「零天」時間去準備或修補,可以說是無法抵擋的攻擊。
軟體是人寫的,只要有人參與,就無法完全避免錯誤。無論團隊多麼受過良好訓練、採用多先進的開發流程或工具,人在設計、撰寫與維護程式時仍可能犯錯,進而產生弱點。單從近期3個月內發生的思科^1、IBM^2、Chrome^3、Apple iOS^4、Adobe^6 到微軟^7 等案例可見:即便是由頂尖人才與全球一流企業所打造的系統,也會頻繁出現安全缺陷。
系統軟體開發中,開發者只要想要擁有更高的控制(例如 C/C++ 記憶體和資源的直接存取),就必須面臨更大的程式出錯空間範圍與機率。
漏洞懸賞(bug bounty)、通報機制等方式能幫助找出現有弱點,但「發現漏洞」本身並不等於「解決漏洞」。漏洞的發現能協助修補,但一處被找到並不代表相同類型的弱點在其他地方也能被發現;亦不代表未來的程式就能完全避免同類錯誤。想要解決弱點的成因需仰賴完全不同的技術。
面對未發現的弱點,將面臨無法阻擋的零日攻擊;然即使是已發現的弱點,透過補丁修補時也會面臨兩大問題。一是這可能成為駭客的燈塔,駭客藉由對補釘內容的分析及逆向工程,可以快速定位弱點,藉此搶在組織修補前進攻。二是組織往往不願意或無法立即套用補丁,可能是因產品服務已終止維護,或是擔心補丁和軟體系統之間的相容性問題等。就連微軟也因為沒準時安裝自己發布的補丁而遭到利用,並坦言:「和業界其他廠商一樣,我們難以達成百分之百的補丁管理遵循率。」^8