最近 PTT 出現大量帳號被盜事件,而且大部分的人是無登入失敗紀錄就被盜走帳號,因此有人懷疑是站方資安問題,或者認為是站方有內鬼把使用者資料庫洩漏出去,甚至還有人懷疑是第三方的手機 app 有問題;站方也懷疑可能是使用者使用了不安全的通訊協定,因此關閉了 telnet 協定。其實這幾個特徵對於有經驗的人來說,一看就知道是憑證填充攻擊 (Credential Stuffing),在大陸稱為撞庫。通常遭受這種攻擊導致大量帳號被盜的網站會出現以下特徵:
- 大多數被盜走的帳號沒有登入失敗紀錄,一次就被不明 IP 登成功並盜走帳號,有部分會有 1 ~ 2 次登入失敗紀錄。
- 沒被盜走帳號的人,少部分會發現自己帳號被嘗試登入過 1 ~ 2 次,但因為密碼錯誤均失敗。
- 使用者開始猜疑站方,覺得站方系統有漏洞、管理團隊或經營方有人手腳不乾淨。
- 站方建議要提防釣魚網站、不要跟人共用帳號、不要使用無密碼的公開 wifi 登入網站、使用加密協定登入,但效果不彰。
- 如果站方不顧道德瑕疵去 log 所有登入操作輸入的帳密,可觀察到駭客頻繁切換 IP 嘗試登入,每個帳號只會嘗試 1 ~ 2 次,且輸入的密碼看起來也不是常見的弱密碼 111111、abcd1234、asdfasdf、qweasdzxc 之類,而是一些還算安全且不太容易被破解的密碼。
其實前陣子元大證券帳號被盜去下港股的事件也是同一招,只是手法比較非典型,是利用外洩的戶政資料來做嘗試,因為券商系統的登入帳號大都是身份證字號。除此之外,國內那幾家知名網拍平台,也不時傳出有人被盜帳號去開詐騙賣場,結果帳號原持有人被叫去警局泡茶,這些都是一模一樣的手法。沒有概念的人,可以回頭去想想那些網拍平台被大規模盜帳號都是幾年前的事情了,就能知道這是多久之前就有的現象,只是這次終於延燒到 PTT 來而已。看站方的反應和處理方式,只能說站方的資訊人員真的安逸日子過太久了。
我第一次遇到這種攻擊法是在 10 幾年前了,後來也陸續在無償幫忙幾間網站的期間遇到過很多次。因為那些是網頁式的網站,因此只要設定 http server 去 log 被 POST 到登入頁面的帳密來分析,就可以看到上面說的登入嘗試狀況。處理這種攻擊方式最簡單的方法就是在登入表單加上圖形驗證碼或者 Google reCAPTCHA、要求使用者使用安全提問功能,或者要求使用者在手機安裝 Google Authenticator 做雙因子認證登入,甚至還有修改程式強迫使用者定期變更密碼這種爛招。PTT 由於是純文字的介面,因此可以採取的手段有限,非營利站台也不可能用什麼手機簡訊 OTP 的方式做雙因子驗證登入,但也不是完全沒有辦法。畢竟 PTT 早就已經不是 20 年前那種傳統的 Maple BBS 系統,也早就能產生唯讀的網頁供外人瀏覽站內文章,甚至還有 https://term.ptt.cc 這種入口,所以搞個 Google Authenticator 做雙因子驗證登入一點問題都沒有,這東西只要設定完成之後,就算在 telnet/ssh 這類純文字介面也能使用。
那麼這個憑證填充攻擊是什麼呢?簡單說,因為很多網站都有漏洞,駭客會先去取得能在主機上執行任意程式的權限,然後偷偷修改網站程式碼 (甚至會竄改檔案修改時間,讓人以為檔案沒有被修改過),將網站的使用者登入帳密側錄下來,這樣就能收集到成千上萬人的帳號、密碼、電子郵件位址,做成一份帳密列表。然後再寫個簡單的登入程式,讀取這份帳密列表,去另一間網站逐一試登,並紀錄下可登成功的帳號,這樣他就可以用這些帳號去做壞事,或者拿這些帳號去網路上賣。如果這個網站可以購買數位商品,譬如電子書、音樂、影片等等,網站也提供記錄上次信用卡付款資訊以便下次快速付款用的功能,也沒要求下次付款重新輸入信用卡的 CVV (也就是常說的卡片簽名欄末三碼),網站刷卡系統也不會做 3D 驗證,那他可以寫個簡單程式一次買光全站的數位商品 (當然前提是卡的額度夠),等到持卡人發現他已經下載完走人了 (所以現在頻繁刷卡或突然的大額刷卡會被銀行系統擋刷,或者銀行會打電話來問)。
除此之外,如果受害者 email 信箱用的密碼也是同一個,那駭客還有更多事情可以做。駭客可以先改掉他的 email 信箱密碼,然後慢慢翻他的信,看他還有用這信箱註冊過什麼網站,順便盜走那些網站的帳號。有些白癡網站第一次註冊完,甚至每次修改完密碼,都還會發明文密碼到信箱裡,提醒你要記好這密碼,這智障行為也幫助了駭客去充實他的帳密清單。不過就算沒這種白癡網站,受害人用這信箱註冊的其它網站也使用了不同密碼 (有些人會根據網站性質使用不同組密碼),駭客還是可以使用網站上的找回密碼功能來重設密碼。使用找回密碼功能的話,網站通常會發一個重設密碼的連結到信箱 (甚至是把受害者原本設定的密碼直接寄來,這種網站又爽到了駭客),駭客只要光明正大地去收信,就可以幫受害者設定一個新密碼。而受害者就算第一時間知道自己信箱帳號被盜,他還要浪費大把時間跟信箱服務提供者證明他是他自己 (免費的 gmail 如果沒有設定備用信箱和手機號碼,甚至沒有人工客服幫你處理,那個帳號只能作廢),駭客已經不知道做完多少事情了。
簡單說,每次有網站遇到憑證填充攻擊,受害的永遠是那種習慣不好的人,也就是在所有網站使用同一組帳密來登入的人。如果今天哪怕帳號或密碼只差一個字元,也能避開被駭客用這種方式盜走帳號的命運。有些人會很得意說他會記好幾組密碼,重要的用一組、不太重要的用另一組,可有可無的再另一組,結果他帳號當然還是被盜了,雖說最重要的網站帳號都沒事,但不太重要、可有可無的網站帳號就遭殃了。這種人有時候一開始覺得某網站不重要,因此用了最爛的那組密碼,但隨著時間經過,這網站漸漸進入了他生活當中,卻又沒換密碼,密碼依然是可有可無的那組,結果被盜了才發現原來這網站對他很重要,心裡還是幹得要死。另外還有一些人,比這種記好幾組的懶,他每間網站都使用同一組密碼,只是使用了不同前綴或後綴,譬如他密碼就用 111111,但 PTT 用 11111ptt,露天拍賣用 111111ruten 或 111111rt,這種人通常可以逃過一劫,並且恥笑那些因為使用固定幾組密碼導致帳號被盜的人,即便他們自己也沒好到哪去。
回到問題的根本,雖說站方的確可以用雙因子驗證登入來解決問題,但強制所有人使用反而會不方便。如果要從使用者端來解決這個問題,那就是必須在每個網站使用不同密碼,因此上一段最後提到的那種人在某方面來說還真的算是做對了。如果要每間網站使用完全不同的密碼,人腦是很難做到的,因此國外早在 10 幾年前就有人做出密碼管理軟體 (Password Manager) 幫你產生和記錄密碼,甚至還有根據網站 URL 或 title 來自動輸入帳號密碼的功能。國內幾乎很少看到有人推廣過,有些人則是在瀏覽器紛紛提供了類似功能後無意間去使用了,但 PTT 這種不能讓瀏覽器幫他們記的,就還是使用自己腦中的那組萬用密碼。密碼管理軟體在現代有好幾種形式,有些是把密碼存在雲端的付費服務,簡單列幾個在下面:
我個人是不相信雲端服務,所以使用 KeePass,並且主密碼使用全世界唯一的一組,完全不用在其它地方,至於它的資料檔則是透過 Dropbox 同步到行動裝置上,再用對應的 app 開啟。比較懶的人或許會考慮如 1Password 這種付費的雲端服務吧,但我不會考慮。