有一題是這樣的,掃描報告上一台資料庫伺服器掛著一個 critical。
管理員說,直接升級會卡到業務,所以已經用廠商給的 workaround 處理掉了,掃描的人也親自確認過,這個洞真的打不進去了。
問接下來該怎麼做。
我選的是,請管理員以後每次掃完都交一份 workaround 的說明。
正解是把這筆標成 false positive。
我那時候腦子裡把兩件事混成一件:「這個風險我們知道,先放著」,跟「這份報告寫的東西不是真的」。
掃描器說有 critical,我就讀成真的有 critical,只是有人處理過,所以要一直留紀錄。
我一開始以為 false positive 的意思是「掃描器壞了、亂報」。
所以那題我很卡,掃描器明明沒有亂報啊,那個版本本來就在弱點清單上。
後來的理解是,false positive 講的是這一筆結果跟實際狀況對不起來。
風險本來就不存在,或是已經被處理掉而且驗證過了,那這筆報告就不準,標它 false positive。
掃描器為什麼會報出一個不存在的東西?
很多檢查的做法,是看到某個軟體版本號,拿去對已知弱點清單。
版本號對上了,它就報,至於那台機器上實際做了什麼處理,它不一定看得到。
Linux 上有個很典型的例子。
Red Hat 會把新版的安全修補「搬回」舊版本的套件裡,叫 backporting,所以套件的主版本號看起來還是舊的,但洞已經補了。
workaround 也是一樣的狀況,改了設定、關了某個功能,版本號沒動,掃描器照報。
另外像 blind SQL injection 這種不會直接回顯結果的洞,掃描器只能靠回應時間之類的間接訊號去猜,也是容易誤報。
false negative 就是反方向:有洞,但掃描器沒抓到。
常見的原因大概是特徵碼(plugin、feed)還沒更新,廠商昨天才公布的洞,掃描器今天當然不認得。
或是 Day13 講過的沒給帳密,掃描器只站在外面看,裡面裝了什麼根本看不到。
所以我後來看報告會提醒自己兩件事:它說有的,不一定有;它沒說的,也不一定沒有。
報告是參考,需要經過人工驗證。
exception(例外)就跟 false positive 完全是另一回事。
洞是真的,也還在,但因為某些原因現在修不了或不修,組織決定先接受這個風險,而且這個決定是有人拍板、有留紀錄的。
像是一台很舊的機台控制電腦,原廠軟體只支援那一版作業系統,升級就不能用了。
那就把它丟到一個獨立的網段,只放必要的連線,這就是 Day15 講過的補償控制。
然後由有權限的人核准、記錄下來,這筆就是 exception。
它跟 false positive 最大的差別是,exception 的風險沒有消失,只是被有意識地接受了。
所以它通常會設一個期限,時間到了要再看一次:補償控制還在不在、有沒有新的修法了。
我那陣子還有一個盲點,報告上寫 Active,我就覺得一定得修。
但有些項目其實沒什麼好動的:
這種的處置就是記錄下來,先不動。
跟 exception 的差別在於,exception 是「有該處理的風險,但決定先接受」;先不動是「目前沒有可以做、也沒有必須做的事」。
但先不動不等於刪掉,下次有修法出來、或是等級被調高,還是要回來看。
| 狀態 | 風險還在嗎 | 我的理解 |
|---|---|---|
| False positive | 不在(本來就沒有,或已處理並驗證) | 報告跟實際對不起來 |
| False negative | 在 | 有洞,但報告上沒有 |
| Exception | 在 | 知道、有人核准,先接受 |
| 先不動 | 在,但沒有可做或必須做的事 | 記錄下來,之後再看 |
回到開頭那題,我選的「每次都交說明」其實就是把 false positive 當 exception 在處理。
這樣做的結果是,那筆 critical 會一直出現在每一輪的報告上,每次都要有人去翻說明、確認一次,久了大家就麻木了,真正新冒出來的 critical 反而容易被淹掉。
反方向更可怕。
如果把 exception 標成 false positive,那筆就從報告上消失了,大家以為沒事。
哪天有人把那台舊機台搬回一般網段,補償控制沒了,但報告上什麼都看不到。
我的理解是,標記是在跟下一個看報告的人講話。
下一個人可能是半年後的同事,也可能是半年後已經忘光的自己。
寫下來做紀錄,是一個好習慣,可能會救了半年後、一年後的自己,就像我把這些寫成文章,考完試可能一年兩年後就忘記了,這些分享出來的筆記是用我自己的話自己的理解寫出來的,我在很久很久以後回來看就知道,喔~我當初是這樣錯的,正確的是什麼樣子。