<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Credential Stuffing on Tarragon</title><link>https://tarrragon.github.io/blog/tags/credential-stuffing/</link><description>Recent content in Credential Stuffing on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Wed, 29 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/credential-stuffing/index.xml" rel="self" type="application/rss+xml"/><item><title>Credential Stuffing（憑證填充）</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/credential-stuffing/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/credential-stuffing/</guid><description>&lt;p>Credential stuffing 的核心概念是「拿在別處外洩的帳號密碼組合，到這個服務逐一試登入」。它利用的是同一個人在多個服務用同一組密碼，因此攻擊者不需要猜——手上的每一組都曾經是某人的真密碼，&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/authentication/" data-link-title="Authentication" data-link-desc="說明系統如何確認呼叫者身份">authentication&lt;/a> 這一層因此看到的是一次完全合法的登入。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>這一類攻擊與暴力破解共用同一個入口（登入端點），防護手段卻不同，因為它們消耗的資源不同。暴力破解對單一帳號嘗試大量密碼，按帳號計數的節流攔得住；credential stuffing 對大量帳號各試一兩組，每個帳號的失敗次數都在門檻之下，同一套機制因此看不到它。節流與帳號鎖定要分開看——鎖定本身可以被當成阻斷服務的手段（對著別人的帳號連續試錯就能把人鎖在外面），所以主線是延遲重試而非直接鎖。&lt;/p>
&lt;p>它也定義了密碼儲存的能力邊界。&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/salt/" data-link-title="Salt" data-link-desc="說明 salt 如何讓相同的密碼產生不同的雜湊值，以及它擋掉哪一類攻擊">salt&lt;/a> 與 work factor 提高的是「猜一次要付多少代價」，而這一類攻擊的密碼是已知的、不需要猜——&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/password-storage-and-work-factor/" data-link-title="7.30 使用者密碼儲存：參數會過期的那一類原語" data-link-desc="決定密碼用哪種雜湊與 work factor、或懷疑既有參數已經失效時，用來定參數、判斷合規要求有沒有鎖死選項、排複查節奏與規劃升級路徑">7.30 使用者密碼儲存&lt;/a> 的參數調到頂也擋不住它。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>登入端點的整體失敗率上升而個別帳號的失敗次數正常，是這一類的特徵訊號。其他常見形態：登入請求的來源位址分散但行為一致（相同的請求間隔、相同的 user agent）、大量帳號在短時間內首次從陌生地區登入成功、以及「帳號不存在」與「密碼錯誤」兩種回應的比例異常——後者代表攻擊者手上的清單與自己的使用者群重疊度高。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>防護的著力點在密碼之外。可用的機制包括比對外洩密碼清單、要求第二因子讓密碼正確也不足以登入、按來源與行為特徵而非按帳號做速率限制、以及對成功登入做異常判讀（新裝置、新地區、與平常不同的時段）。比對清單的時點有兩個而非一個：註冊與變更密碼時比對擋得住新設的那些，既有帳號的密碼在設定之後才外洩，那一批要在成功登入當下再比對一次才接得住。&lt;/p>
&lt;p>判斷自己的暴露程度，看的是使用者群體與大型外洩事件的重疊——面向一般消費者的服務重疊度最高，因為同一批人在數十個服務用同一組密碼。相鄰概念見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/authentication/" data-link-title="Authentication" data-link-desc="說明系統如何確認呼叫者身份">authentication&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/step-up-authentication/" data-link-title="Step-Up Authentication（升階驗證）" data-link-desc="登入成功不等於高權限操作可被信任時、在關鍵操作點插入額外驗證的設計位置">step-up authentication&lt;/a>，登入節奏的判讀與處置見 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/identity-access-boundary/#%e7%b5%82%e7%ab%af%e4%bd%bf%e7%94%a8%e8%80%85%e7%9a%84%e7%99%bb%e5%85%a5%e7%af%80%e5%a5%8f" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 終端使用者的登入節奏&lt;/a>，登入方式本身的選型見 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/authentication-approach-selection/" data-link-title="7.31 認證方式選型：可離線猜測的材料最後落在哪裡" data-link-desc="要做登入功能、在自建帳號與委派身分與 passkey 之間決定時，用來定位每一種做法把可離線猜測的材料移到了哪裡">7.31 認證方式選型&lt;/a>。&lt;/p>
&lt;p>把可重用的共享秘密整個換掉是這一類攻擊的結構性解法，因為外洩清單裡的值在服務端對不上任何東西，見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/passkey/" data-link-title="Passkey" data-link-desc="要用金鑰對取代密碼、或判斷已導入的 passkey 實際擋掉了什麼時，用來定位它的保護落在哪一段、上限由哪條路徑決定">passkey&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Credential stuffing 的核心概念是「拿在別處外洩的帳號密碼組合，到這個服務逐一試登入」。它利用的是同一個人在多個服務用同一組密碼，因此攻擊者不需要猜——手上的每一組都曾經是某人的真密碼，<a href="/blog/backend/knowledge-cards/authentication/" data-link-title="Authentication" data-link-desc="說明系統如何確認呼叫者身份">authentication</a> 這一層因此看到的是一次完全合法的登入。</p>
<h2 id="概念位置">概念位置</h2>
<p>這一類攻擊與暴力破解共用同一個入口（登入端點），防護手段卻不同，因為它們消耗的資源不同。暴力破解對單一帳號嘗試大量密碼，按帳號計數的節流攔得住；credential stuffing 對大量帳號各試一兩組，每個帳號的失敗次數都在門檻之下，同一套機制因此看不到它。節流與帳號鎖定要分開看——鎖定本身可以被當成阻斷服務的手段（對著別人的帳號連續試錯就能把人鎖在外面），所以主線是延遲重試而非直接鎖。</p>
<p>它也定義了密碼儲存的能力邊界。<a href="/blog/backend/knowledge-cards/salt/" data-link-title="Salt" data-link-desc="說明 salt 如何讓相同的密碼產生不同的雜湊值，以及它擋掉哪一類攻擊">salt</a> 與 work factor 提高的是「猜一次要付多少代價」，而這一類攻擊的密碼是已知的、不需要猜——<a href="/blog/backend/07-security-data-protection/password-storage-and-work-factor/" data-link-title="7.30 使用者密碼儲存：參數會過期的那一類原語" data-link-desc="決定密碼用哪種雜湊與 work factor、或懷疑既有參數已經失效時，用來定參數、判斷合規要求有沒有鎖死選項、排複查節奏與規劃升級路徑">7.30 使用者密碼儲存</a> 的參數調到頂也擋不住它。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>登入端點的整體失敗率上升而個別帳號的失敗次數正常，是這一類的特徵訊號。其他常見形態：登入請求的來源位址分散但行為一致（相同的請求間隔、相同的 user agent）、大量帳號在短時間內首次從陌生地區登入成功、以及「帳號不存在」與「密碼錯誤」兩種回應的比例異常——後者代表攻擊者手上的清單與自己的使用者群重疊度高。</p>
<h2 id="設計責任">設計責任</h2>
<p>防護的著力點在密碼之外。可用的機制包括比對外洩密碼清單、要求第二因子讓密碼正確也不足以登入、按來源與行為特徵而非按帳號做速率限制、以及對成功登入做異常判讀（新裝置、新地區、與平常不同的時段）。比對清單的時點有兩個而非一個：註冊與變更密碼時比對擋得住新設的那些，既有帳號的密碼在設定之後才外洩，那一批要在成功登入當下再比對一次才接得住。</p>
<p>判斷自己的暴露程度，看的是使用者群體與大型外洩事件的重疊——面向一般消費者的服務重疊度最高，因為同一批人在數十個服務用同一組密碼。相鄰概念見 <a href="/blog/backend/knowledge-cards/authentication/" data-link-title="Authentication" data-link-desc="說明系統如何確認呼叫者身份">authentication</a> 與 <a href="/blog/backend/knowledge-cards/step-up-authentication/" data-link-title="Step-Up Authentication（升階驗證）" data-link-desc="登入成功不等於高權限操作可被信任時、在關鍵操作點插入額外驗證的設計位置">step-up authentication</a>，登入節奏的判讀與處置見 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/#%e7%b5%82%e7%ab%af%e4%bd%bf%e7%94%a8%e8%80%85%e7%9a%84%e7%99%bb%e5%85%a5%e7%af%80%e5%a5%8f" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 終端使用者的登入節奏</a>，登入方式本身的選型見 <a href="/blog/backend/07-security-data-protection/authentication-approach-selection/" data-link-title="7.31 認證方式選型：可離線猜測的材料最後落在哪裡" data-link-desc="要做登入功能、在自建帳號與委派身分與 passkey 之間決定時，用來定位每一種做法把可離線猜測的材料移到了哪裡">7.31 認證方式選型</a>。</p>
<p>把可重用的共享秘密整個換掉是這一類攻擊的結構性解法，因為外洩清單裡的值在服務端對不上任何東西，見 <a href="/blog/backend/knowledge-cards/passkey/" data-link-title="Passkey" data-link-desc="要用金鑰對取代密碼、或判斷已導入的 passkey 實際擋掉了什麼時，用來定位它的保護落在哪一段、上限由哪條路徑決定">passkey</a>。</p>
]]></content:encoded></item></channel></rss>