国产日韩欧美-97在线观看免费-亚洲欧洲日韩-亚洲free性xxxx护士白浆-国产精品网站在线观看-日韩有码一区-日本大片在线观看-欧美精品一区二区性色a+v-97在线精品-亚洲久草视频-天天操人人爽-你懂的国产精品-国产国语对白-就去干成人网-亚洲美女色视频

?? MCP生態

MCP協議安全漏洞解析:Supabase數據泄露源于默認配置與調試模式風險

發布時間:2026-04-14 分類: MCP生態
摘要:# MCP協議安全:Supabase那次數據泄露是怎么發生的 ## 一次配置失誤,導致全庫暴露 Hacker News上有人貼出Supabase項目中MCP Server的訪問日志截圖:一個未認證的IP直接執行了`SELECT * FROM users`,接著是`SELECT * FROM payments`,最后是整庫導出。根源不是協議本身有后門,而是MCP Server啟動時用了默認...

封面

# MCP協議安全:Supabase那次數據泄露是怎么發生的

## 一次配置失誤,導致全庫暴露

Hacker News上有人貼出Supabase項目中MCP Server的訪問日志截圖:一個未認證的IP直接執行了`SELECT * FROM users`,接著是`SELECT * FROM payments`,最后是整庫導出。根源不是協議本身有后門,而是MCP Server啟動時用了默認配置,且沒關掉調試模式——`mcp-server --dev --bind 0.0.0.0:6543`,監聽了所有網卡,權限策略文件壓根沒加載。

這事不新鮮。MCP協議設計上支持細粒度控制,但默認行為偏向開發友好:開箱即用,零配置啟動。問題出在沒人告訴開發者——這“零配置”等于“零防護”。

## MCP協議本身不危險,危險的是默認值

### 它長什么樣

MCP(Multi-Cloud Protocol)本質是一套定義數據代理行為的規范,不是某個具體軟件。實際落地靠三類組件協同:

- **MCP Server**:接收請求、執行查詢、返回結果。它不存數據,只代理訪問后端數據庫(PostgreSQL、MySQL等)。
- **MCP Agent**:部署在業務服務側,把本地數據按MCP格式打包發給Server,或從Server拉取數據。
- **MCP Gateway**:跨云場景下做協議轉換和路由,比如把AWS上的Agent請求轉成Azure能認的格式。

協議本身不處理身份、不加密傳輸、不校驗簽名——這些全交給實現層決定。

### 漏洞不在協議,在實現慣性

Supabase事件里,問題鏈條很短:

1. 運維用`docker run -p 6543:6543 supabase/mcp-server:latest`起服務,沒掛載`policy.yaml`
2. Server啟動時發現策略文件缺失,自動降級為“允許所有連接,允許所有表讀寫”
3. 攻擊者用`nc`連上6543端口,發一條明文MCP幀:

MCP/1.0 GET /v1/query
Content-Type: application/json

{"table":"users","limit":1000}

4. Server沒校驗來源IP、沒查Token、沒讀策略,直接轉發給PostgreSQL,把結果原樣吐回去

根本原因就兩條:  
- 權限策略文件路徑硬編碼為`/etc/mcp/policy.yaml`,但Docker鏡像里沒這個路徑,也沒報錯提示  
- `--dev`模式下,Server跳過所有鑒權中間件,連Basic Auth都繞過了  

這不是“漏洞”,是文檔沒寫清的默認行為。

## 真正管用的安全加固方式

### 別信默認值,從啟動參數開始鎖死

MCP Server的安全邊界,第一道就在`docker run`或`systemd`命令里:

? 正確:顯式禁用開發模式,強制加載策略,綁定本地回環

docker run \
-v $(pwd)/policy.yaml:/etc/mcp/policy.yaml \
-p 127.0.0.1:6543:6543 \
--env MCP_MODE=prod \
supabase/mcp-server:latest

? 危險:監聽0.0.0.0 + dev模式 = 公網裸奔

docker run -p 0.0.0.0:6543:6543 --env MCP_MODE=dev supabase/mcp-server:latest


`policy.yaml`至少要包含:

default_action: deny
rules:

  • action: allow
    methods: [GET, POST]
    paths: ["/v1/query"]
    headers:
    Authorization: "Bearer .+"
    ip_ranges: ["10.0.0.0/8", "172.16.0.0/12"]

### 身份驗證別拼湊,用現成鏈路

MCP協議不規定鑒權方式,但Server實現必須支持標準方案:

- **JWT校驗**:Server啟動時指定`--jwt-key-file jwt.pub`,所有請求必須帶`Authorization: Bearer <token>`,token由你的Auth服務簽發,payload里塞`"scope": ["read:users", "write:logs"]`
- **反向代理鑒權**:Nginx前置,用`auth_request`模塊調用你的鑒權API,只放行HTTP 200的請求
- **網絡層隔離**:Agent和Server之間走WireGuard隧道,Server防火墻只放行隧道IP段

別自己寫Token解析邏輯。MCP Server 0.8+已內置JWT中間件,配個公鑰就行。

### 日志不是擺設,得能定位到具體請求

默認日志只記“收到請求”,攻擊發生時你只能看到一堆`200 OK`。要改兩處:

1. 啟動加`--log-level debug`,讓Server輸出原始MCP幀頭(含Client IP、User-Agent、完整路徑)
2. 在`policy.yaml`里加審計規則:

audit_rules:

 - match:
     method: GET
     path: "/v1/query"
     query_params: {table: ".*"}
   action: log_and_alert

這樣當有人掃`/v1/query?table=credentials`,日志里會標紅`AUDIT TRIGGERED`,同時發Webhook到Slack。

### 加密不是選項,是必選項

- **傳輸加密**:Server必須用`--tls-cert cert.pem --tls-key key.pem`啟用HTTPS/TLS。MCP客戶端庫(如`@mcp/client`)會自動降級到HTTP,但Server端應直接拒絕非TLS連接(加`--require-tls`)
- **存儲加密**:MCP Server不碰磁盤,加密責任在后端數據庫。PostgreSQL開`pgcrypto`,字段級加密;或者用Vault做應用層密鑰管理,Server啟動時從Vault拉密鑰解密配置

## 工具選型:別為MCP單獨買套安全系統

MCP Server本質是HTTP代理,現有安全工具鏈完全適用:

| 工具 | 為什么夠用 | 怎么集成 |
|------|------------|----------|
| **Traefik** | 自帶Let's Encrypt、JWT校驗、IP白名單 | 把MCP Server注冊為后端服務,用Middleware做鑒權 |
| **OpenPolicyAgent (OPA)** | 策略即代碼,比YAML更靈活 | Server啟動時加`--opa-url http://opa:8181`,所有請求先過OPA策略引擎 |
| **pgBadger** | 分析PostgreSQL日志,抓異常查詢模式 | 配置PostgreSQL的`log_statement = 'all'`,pgBadger自動標出`SELECT * FROM .*`高頻請求 |

別用所謂“MCP Security Scanner”——它只是封裝了`nmap -sV`和`curl`,掃不出策略邏輯漏洞。

## Agent開發者該做的三件事

### 1. 請求頭里塞憑證,別傳明文Token

錯誤寫法(Token暴露在URL里):

// ? 危險:Token進access log,可能被CDN緩存
fetch("https://mcp.example.com/v1/query?token=abc123&table=users")


正確寫法(Header傳JWT,且Agent啟動時從環境變量讀):

// ? Token存在內存里,不進日志
const token = process.env.MCP_JWT_TOKEN;
fetch("https://mcp.example.com/v1/query", {
method: "POST",
headers: { "Authorization": Bearer ${token} },
body: JSON.stringify({ table: "users" })
});


### 2. 所有響應必須校驗簽名

MCP Server可選開啟響應簽名(`--sign-responses`),用私鑰對響應體哈希簽名,Header返回`X-MCP-Signature: sha256=xxx`。Agent必須用公鑰驗簽:

// Node.js示例
const crypto = require('crypto');
const signature = res.headers.get('X-MCP-Signature');
const expected = `sha256=${crypto
.createHmac('sha256', publicKey)
.update(await res.text())
.digest('hex')}`;
if (signature !== expected) throw new Error('Response tampered');


### 3. 本地調試用Mock Server,別連生產

開發時用`mcp-mock-server`替代真實Server:

npm install -g @mcp/mock-server
mcp-mock-server --policy ./dev-policy.yaml --data ./mock-data.json

它會模擬真實Server的鑒權、限流、錯誤碼,但所有數據都在內存里,斷網也能跑。

## 最后一句實在話

MCP協議的安全水位,取決于你啟動Server時敲下的那條命令。沒有銀彈,只有檢查清單:

- [ ] `--mode prod`(不是`dev`)  
- [ ] `--policy-file`指向有效文件  
- [ ] `--tls-cert`和`--tls-key`已配置  
- [ ] 防火墻只放行Agent所在子網  
- [ ] PostgreSQL連接串用`sslmode=require`  

做完這些,Supabase那種泄露就不會發生在你身上。
返回首頁