元大跟統一證券帳戶複委託被盜下港股事件

最近兩天在 PTT 股板上看到的事情,新聞也開始陸續報出來了:
元大證港股複委託昨出現異常 公司:會確保客戶權益
投資人帳戶被駭自動買港股?元大證券回應了
網友被下單買港股?元大改以人工接單確保客戶權益
股票下單系統疑遭駭!元大證海外複委託改人工接單 統一證公告提醒換密碼
元大證「行動精靈」關閉複委託電子下單 三竹資訊喊冤:沒有做憑證
券商下單系統爆「撞庫攻擊」 三竹聲明「與之無關」正協助補強交易安全
我本身只交易國內外期貨不交易股票,所以不是受害人之一。不過看起來似乎證券商、證交所和媒體打算把風向洗成是「撞庫」,這就讓我覺得不太合理了。


首先,所謂的「撞庫」是大陸用語,台灣沒有對等的詞彙。雖然我對於它真正的定義也不確定,但因為我業外有協助朋友經營網站,技術團隊裡有不少大陸人,加上網站上在十年前開始也陸續遇到這類案例,他們說這是撞庫,我才知道這個名詞的。簡單說就是 A 網站的資料庫帳號密碼因為各種原因被外洩了,然後拿去 B 網站登入,碰撞看看,如果有人呆呆地在 B 網站使用了一樣的帳號密碼,那麼那個帳號就可以被駭客做後續運用了。故名思義所謂的撞庫,我理解的意思就是拿 A 網站的資料庫去跟 B 網站、C 網站等諸多網站的資料庫碰撞,試看看有沒有使用一樣帳密的蠢蛋,這個行為就被稱為撞庫,儘管實際上並非是直接拿兩個資料庫來比對。大陸還有一個名詞叫「社工庫」,簡單說就是利用釣魚網站以及駭入各種網站收集而來的帳密列表,取得門檻也不高,Google 搜尋來、地下討論區積分換來、用錢買來等方式都有,隨便一些會寫點簡單程式的阿貓阿狗吃飽太閒弄幾個來撞就能做很多壞事。

最早我遇到這個問題是朋友經營的網站有大量帳號被盜,而且從 log 來看幾乎清一色都是第一次就登入成功,不是去猜白癡密碼猜很多次才登成功的。網站程式是基於 NexusPHP 這支年久失修的 PHP 程式架設的,內部長年以來有大量奇怪漏洞,所以儘管我本身不是資安專業,甚至沒寫過什麼網頁程式,也因為幫那個網站處理過太多次資安漏洞,已經熟悉了 XSS、CSRF 等各種常見的攻擊法。那次因為完全看不出攻擊者是透過什麼方式取得帳密的,分析了幾十 GB 的 log 也看不出所以然,所以我索性向以往一樣修改 nginx 的設定 log 了所有 POST 到網站上的內容來抓漏洞在哪。看到最後網站程式並沒有什麼漏洞被利用,不過登入頁面非常壯觀,每秒幾十次不同 IP 在大量嘗試登入,嘗試的帳號大部分不是我們網站上有的帳號,密碼也大多不是白癡密碼,很多是滿足常見密碼複雜度要求的獨特密碼,或者是中文意思是我愛xxx後面加生日之類的密碼。大部分的 ID 都只有被試過一次,偶爾會有幾個 ID 被試一兩次。我把這些 log 整理以後貼在內部的即時聊天群組上,馬上有大陸人跳出來說這是在撞庫,於是當時學到了符合這種特徵的就是撞庫攻擊。

那麼為什麼我覺得這次事件把風向洗成是「撞庫」不太合理呢?就如同我前面所說的,外面的「社工庫」裡存的是帳密清單,而在絕大多數網站使用的帳號,既非身份證字號也非證券帳號。使用 app 登入證券戶,一般不是要求打身份證字號就是打證券帳號,跟外面自己高興取什麼就取什麼的帳號實在是不太可能重疊。既然帳號無法對上,那又要怎麼撞呢?而且證券商會有登入三次失敗就鎖定帳號的機制在,據說還是他們主管機關規定的 (不記得是金管會還是證交所或證期局),不可能空有密碼就狂試到一堆帳號被鎖定,那樣在得手之前就會先被證券公司的資訊部注意到。光是這一點,要把這次問題成因歸咎於撞庫 (翻譯:使用者選擇或保管密碼不當),就欠缺了合理性。

在 PTT 上我也和一些人分享了這樣的看法,有位板友說別忘了先前戶政資料曾經外洩過 2000 萬筆。從這方面來思考確實是可能的,因為的確有白癡會把自己的帳號設成自己生日,而使用 app 下單是需要先有憑證的,app 版的憑證一般需要輸入投資人的出生年月日,如果密碼就是生日,這些人的帳號會被盜去下單就非常合理,證券商那邊要清查最近幾週從手機新申請憑證的做法也不算錯。這個做法要說是撞庫,確實也算,只能看受害人是不是密碼都有這個特徵了。然而只要有一個人的密碼不是這樣設定,就可以排除這個可能性,畢竟社工庫裡要同時有大量台灣公民的身份證字號或期貨帳號、網路自訂帳號、密碼、出生年月日是比較不容易的,如果是大陸公民還比較可能。

另一位板友提出的論點更簡單,就是架設釣魚網站,在釣魚網站上引導他們輸入身份證字號、密碼、出生年月日。這個說法很合理,而且也不能排除台灣的白癡有這麼多。於是我簡單用幾個常見的搜尋引擎搜尋了一下,至少這樣的釣魚網站沒有出現在搜尋結果裡。如果是透過搜尋引擎可以簡單搜尋到的,而且進釣魚網站輸入個資的人通常也沒看網址列的網址是否正確的習慣,甚至不會留下曾經進入這些網站的印象,導致事後難以查證,而這樣的狀況已經排除掉了。剩下的可能管道就是手機簡訊、電子郵件這兩種古老方式,假裝是證券商官方,給個短網址引導受害人去釣魚網站輸入帳密及個資。然而這樣做的話,也和前一個論點一樣,只要有一個人手機簡訊跟電子郵件裡沒有這樣的東西,那就可以判定成不是透過釣魚網站收集來的。的確,一般社工庫的建立方式是有多重來源的,不能說只要有一個人手機簡訊跟電子郵件裡沒這些釣魚網站連結,其他人的個資跟帳密就不是透過這個管道被收集進社工庫的。但這次的事件是發生在很特定的情境、特定的券商,因此駭客使用的收集手法照常理推斷一般就只會有少數一兩種,甚至只有一種,因此我這樣的排除方式也沒有什麼不合理之處。

至於為什麼只有元大證券跟統一證券出事?有位板友提出的觀點是這兩家客戶量夠多,所以駭客就算可以對別家證券商投資人下手,但光靠對這兩家投資人下手就夠了。這個說法也合理,儘管我不知道統一證券有多大,但起碼元大是很大間的。從這個角度出發,也的確足以防禦「只有這兩家出事別家都沒事」的說法,光憑這點,雖說三竹看起來明顯是前端實作為主,被懷疑有漏洞也無可厚非,儘管我覺得問題確實應該不是出在三竹。

這個事件我懷疑點有兩個:
1. 駭客如何取得特定券商使用者的身份證字號清單?如果是用 2000 萬筆外洩的戶政資料去撞庫,肯定 log 會有大量失敗紀錄,資訊部有混到連這種攻擊都沒觀測到?前面的釣魚說法的確可以避免製造大量失敗紀錄,就看有沒有受害者願意出來證實一下了。
2. 下單管道看新聞跟板友討論似乎已確認都是來自手機的 app,是券商請三竹特製的。雖然要懷疑三竹也行,但如果最後查出這些受害者最近都沒有申請新憑證的紀錄,那恐怕是三竹 app 呼叫後端 API 的流程已經被駭客分析過,那麼就要檢查一下後端 API 的設計,是不是有盲信前端輸入的狀況發生,導致駭客自製的程式能跳過一些驗證流程來下單? 不過看目前新聞稿風向都洗成是撞庫,我猜真的查出來不是也不見得券商會承認自己有這種漏洞。

雖然說這次事件我判斷幾乎不太可能是撞庫攻擊,但還是要宣導一下近十年來我常口頭跟身邊的人宣導的,就是請在每間網站都使用不同密碼。這十幾年間外國早就流行起 Password Manager 的使用,常聽到的就是 KeePass、Bitwarden、LastPass、1Password 等,有些是免費軟體,有些是付費服務,總之至少要用一種,非雲端服務的也建議自己用 Dropbox 同步備份,但 master password 就真的要認真想一個,只用在解鎖密碼資料庫或登入這類服務上。近代瀏覽器也會在註冊時自動產生建議密碼並儲存了,雖然不是很建議直接存在瀏覽器,但真的不想學 Password Manager 的話也可以用用看,但就要自己研究一下重灌電腦後該如何恢復。如果真的是懶到不行只想用一個密碼打天下,那起碼也改變一下習慣,在密碼後面針對不同網站多加幾個字,譬如網站英文簡稱之類的,這樣起碼對於自動化程式撞庫還有基本的防禦能力。我本身是用 KeePass 的 (也有看過不少人推它的變種 KeePassXC,雖然沒用過但看起來也不錯),它的外掛 KeeOtp2 也能整合 Google Authenticator 這類 OTP 的驗證機制。其實不管哪一套都是很不錯的,只是我年紀大懶得研究新東西了,所以一直停留在 KeePass 而已。

經過這次事件,從新聞上也看到政府單位和券商看起來有打算增加 OTP 機制做第二層防護了。其實憑證這個機制已經是很古老而且外國券商也沒有,在這個年代是早該換成 OTP 沒錯了,不過我猜就算加上了 OTP 驗證,那個憑證機制大概也會被保留下來,形成一種脫褲子放屁的現象,只能希望不要這麼智障吧。但即使是 OTP,過去也有耳聞一些 Android 手機被駭客攔截到簡訊 OTP 的事件發生過,所以到底能不能提供足夠安全性,還有待商榷。更何況如果這次事件起因真的不是使用者問題,而是券商系統漏洞,那這樣做也沒什麼用處。往好處想,也可能因為實作新的 OTP 驗證機制,券商會幫自家程式順便做個資安體檢,一併修掉原有的漏洞吧 (只是不會發新聞稿說是自家系統漏洞的問題)。


2021-11-28 Update:
目前有一個新說法是資料來源來自購物網站,台灣不少購物網站會要求輸入身份證字號做驗證用,且部分購物網站也會有生日欄位可以填寫。如果來源是有要求填寫這些資料的購物網站,那麼的確是有可能的。按照這個理論來推斷,一些會驗證身份的討論區、代購、儲值網站也有可能是資料收集來源。