「關機前套用更新」這支程式,跑了 17,613 分鐘
一支只該在關機前跑幾秒的程式,累積了超過十二天的 CPU 時間。順著這個矛盾,五條線索逼出 rootkit、礦工與後門帳號,全程唯讀不動任何檔案。
自家事件完整復盤|共 10 篇
同一起事件可能拆成多篇:偵測、取證、舉證、復盤各自成文。文章日期為整理日期,事件期間寫在各篇開頭。
一支只該在關機前跑幾秒的程式,累積了超過十二天的 CPU 時間。順著這個矛盾,五條線索逼出 rootkit、礦工與後門帳號,全程唯讀不動任何檔案。
錢包位址只以字串留在行程記憶體與登入封包裡,關機就消失。這篇講怎麼趁礦工還活著把它撈出來,再用礦池公開 API 把「疑似挖礦」變成「確實獲利」。
原機上連雜湊都算不出來的檔案,唯讀掛到乾淨主機全部現形,還多出一支偽裝成 bash 的礦工。後半段是證據包、保管鏈,和四封檢舉信:三封有回音,一封機房已受理待回覆。
一支只負責把資料寫進試算表的小程式,用的帳號卻是整個雲端專案權限最大的角色。金鑰六年沒換、外流後被用了 15 天:帳單 US$146,但「資料有沒有被看過」我們永遠答不出來。
同一起事件的教學版:15 天逐分鐘攤開,每一步標出為什麼會成功、哪一道控制擋得下來。不發金鑰、不給 Owner、關掉沒用的 API、預算警示,四道都沒有。
三顆磁碟快照的離線解剖:一組 Rust 工具用我們的網路和帳單,去全網 542 條路徑撿別人的雲端金鑰。被封的是我們的 IP,被告的是我們的專案。
問題不在做得快不快,在於輪替的單位是「位置」還是「身分」。同一個身分散在六處平台變數、五個 repo 與本機;這篇給憑證清冊、24 小時流程與無金鑰代理。
沒用過的區域裡多了兩支函式,程式碼只做一件事:隨機建一個 IAM 使用者、掛上管理員與寄信全權限,把密碼與金鑰回傳。挖礦會被帳單抓到,後門不會。
上一次鑑識就點名它,但它擁有一萬多個檔案、七個以上的線上服務靠它活著,所以排在「先搬消費者再停用」。一個月後,它在五個小時內替別人跑了 6,350 萬 input token,整個專案被 Google 停權。
為了確認一把外洩的 AWS 金鑰有沒有被用過,我們順手做了一次持久化巡檢。資料沒被碰,卻在 IAM 裡撞見 2025 年那台自動販賣機留下的使用者:權限拿掉了一半、金鑰停了,但人從來沒刪。