保護與安全
縱深防禦(defense in depth)
中世紀城堡不會只靠一道牆。它有護城河,接著外牆,再來內牆,最後是中央加固的主堡。攻破一道屏障的攻擊者,仍要面對下一道,而每一層都替守軍爭取時間。縱深防禦就是把這個智慧套用到電腦上:絕不把一切押在單一保護上,而是疊起好幾道彼此獨立的防線,使得任何單一一道失效都不代表整體淪陷。
具體來說,防守良好的系統會層層堆疊互不依賴的控制。一個程式可能以記憶體安全的方式撰寫(第一層);編譯時加上堆疊金絲雀與不可執行位元,使得即便緩衝區溢位、攻擊也更困難(第二層);以最小權限在沙盒內執行,使挾持被圍堵(第三層);置於防火牆之後,限制什麼東西能接觸到它(第四層);並由稽核與記錄監看,使入侵能被偵測並清理(第五層)。重點就在於這些層彼此獨立:攻擊者必須依序擊破全部,而每一層都假設它外面那幾層可能已經失守。
如果每一層理應都安全,何必這麼麻煩?因為沒有任何單一防禦是完美的——臭蟲存在、設定會走樣、精明的攻擊者會找出設計者沒想到的路徑。縱深防禦誠實地接受這一點,並為「部分失效」預作打算,使得一個失誤不致命。提醒是:縱深不等於「安全劇場」——十把又弱又相關、會被同一個瑕疵一起打開的鎖,加不了多少;幾道真正獨立的防線卻能加很多。價值來自獨立性,而非單純的數量。
攻擊者在某照片 App 裡找到緩衝區溢位。堆疊金絲雀被觸發,程式當掉而非被挾持——但假設他繞過了;ASLR 打亂了位址,使他的酬載跳到錯的地方;再假設他連這也破了;該 App 在沙盒中執行,因此即便能跑任意程式碼,也讀不到其他 App 的資料。三道獨立的防線,三次阻止攻擊的機會。
彼此獨立的各層,都假設其他層可能失效。
層數更多不會自動更安全。共享同一個弱點的各層會一起失效;好處來自各層真正獨立,使得攻破一道不會順帶打開其餘的。
又称
另见