API 安全測試工具:四種類別
掃描器
探測已知的漏洞類型與設定錯誤。
涵蓋廣度好,卻不理解你的業務規則。
代理與攔截工具
讓人工檢視並竄改流量。
功能強大,但完全取決於操作的人。
模糊測試工具
對端點丟出格式異常的輸入,尋找當機狀況。
能找出穩健性問題,也會製造需要分級處理的雜訊。
第四類是 行為驗證:API 是否會拒絕它該拒絕的請求。未經驗證的呼叫、跨帳號存取、角色邊界、過期的權杖。沒有任何掃描器能檢查這些,因為它們取決於你的產品如何定義權限。
多數團隊的缺口
團隊通常會在流程中放一個掃描器,再加上一年一次的滲透測試。兩者都有用。但兩者都不會檢查上週二上線的那個端點有沒有落實物件層級授權,而這正是真實 API 中最常被利用的缺陷。
沒人檢查的原因出在組織,而不是技術。它看起來像是資安議題,於是被丟進每季執行一次的資安流程裡排隊等待。但它其實是一項行為檢查,該放進每次變更都會執行的測試套件中。
如何判斷你的缺口在哪裡
你說得出上一次有人驗證「使用者 A 無法讀取使用者 B 的資料」是什麼時候嗎? 如果答案是一年一次的滲透測試,那就等於在你最可能出現的缺陷上留了十二個月的空窗。
新的端點會自動獲得權限檢查嗎? 如果要靠寫的人自己記得,就一定會被漏掉。
掃描器的檢出結果有人分級處理,還是只是不斷堆積? 一個持續產出卻沒人看的掃描器,比沒有掃描器更糟,因為它看起來像是有覆蓋到。
補上行為驗證的缺口
自動產生的 API 測試計畫包含授權與邊界類別,因此權限檢查與功能覆蓋並存,而不是另外單獨進行的工作。這讓權限檢查跟著每次變更的節奏執行,而這是唯一跟得上新端點的節奏。
終端機
npm install -g @testsprite/testsprite-cli
testsprite setup
如果你不想在本機安裝任何東西,TestSprite 儀表板也提供同樣的設定方式。CLI 其餘的功能請見 CLI 儲存庫。
運作細節請見 API 測試文件。
分級處理,或者說掃描器為什麼不再有人在意
掃描器有一種特定而常見的失效方式:它一直正常運作,但沒有人再去看它的結果。這值得理解,因為這不是工具本身的問題。
第一次執行會產出一長串清單,其中很多並不適用。沒有人有時間逐條處理,於是只能草草掃過。下一次執行產出同樣的清單,再多兩個新項目,而這兩項在既有的雜訊裡根本看不見。不到一季,這份報告就變成產生後直接歸檔的文件,真正的問題可能在裡面躺上一年。
解法一點也不光鮮:把第一份清單認真分級處理一次,並為不適用的項目寫下理由後加以抑制。之後報告就只會顯示有變動的部分,而那才是人們真的會讀的東西。沒有經過分級處理的掃描器比沒有掃描器更糟,因為它製造出一種已經有覆蓋的假象。
什麼該在哪裡執行
行為檢查放在每一個 pull request。掃描器按排程執行。代理與模糊測試工具交給正在做專項研究的人。滲透測試則在威脅模型改變時進行,而不是行事曆到了就做。
如果流程掌握在另一個團隊手上, GitHub App 會是阻力最小的路徑:它就是一個 webhook,不會更動你的儲存庫任何內容,並在你的建置回報新版本上線時觸發。如果你希望檢查結果直接顯示在儲存庫裡,一個 GitHub Actions 步驟就能做到。
TestSprite 在第四類提供什麼
行為驗證:API 是否會拒絕它該拒絕的請求。自動產生的測試計畫包含授權與邊界類別,因此每個端點在每次變更時,都會針對未驗證存取、跨帳號讀取、角色邊界與過期憑證接受檢查。
它透過介面對執行中的服務進行測試,以一輪探索加上你的規格來掌握有哪些端點存在。Auto-Authentication 讓工作階段在整輪執行中保持有效,Dynamic Variables 在呼叫之間傳遞數值,Dependency Chains 依據每個測試案例需要什麼、產生什麼來推導執行順序,Auto-Cleanup 則精確清除該次執行所建立的資料。
收穫在於,物件層級授權不再取決於有沒有人記得。你的掃描器繼續處理相依套件與注入類型的問題,滲透測試繼續做有創意的濫用測試,而夾在兩者之間的那一類,不再是沒人負責的事。
TestSprite 算是 API 安全測試工具嗎?
它涵蓋行為這一類:授權、角色邊界、邊界值與錯誤處理的嚴謹程度。它不是掃描器,也不會去尋找特定的漏洞類型。
我們還需要掃描器嗎?
需要。相依套件漏洞與注入類型的問題確實存在,而掃描器正是對的工具。這幾類彼此互補。
什麼是物件層級授權?
指一名使用者能否靠改動識別碼去存取另一名使用者的紀錄。這是最常見的嚴重 API 缺陷,也是最容易測試的項目之一。
如何遏止掃描器的雜訊?
按排程做分級處理,並在抑制項目時附上理由。一份沒有分級處理的待辦清單,和沒有掃描器沒什麼兩樣。
行為檢查可以對正式環境執行嗎?
通常對一個具代表性的環境執行才是正確做法。為了測試權限而在正式環境建立、刪除資料,本身就帶有風險。