跳到內容

安全與邊界

03 security-probe — 拒絕路徑零洩漏

Section titled “03 security-probe — 拒絕路徑零洩漏”

對抗性輸入打三協議,斷言所有錯誤 body 都不含內部細節。

Terminal window
# 無/壞/過期 token → 401 UNAUTHENTICATED
curl -H "authorization: Bearer xxx" http://localhost:18080/v1/resources # 401
# evil origin → 回應不帶 Access-Control-Allow-Origin
curl -D - -H "Origin: https://evil.example" http://localhost:18080/v1/resources
# >1MB body 打 /mcp → 413,乾淨
curl -XPOST http://localhost:18080/mcp -H 'Content-Type: application/json' \
--data-binary @big.json # 413
# 壞版號/未知 tool/超大 id/非 JSON → 結構化 JSON-RPC error,不 panic
curl -XPOST http://localhost:18080/mcp -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"no_such_tool","arguments":{}}}'

最後掃過所有拒絕 body:不得出現堆疊、內部路徑或未遮罩的原因。

06 config-matrix — JWT secret 啟動安全

Section titled “06 config-matrix — JWT secret 啟動安全”

placeholder 或過短的 secret 一律拒絕啟動(fail-loud),且錯誤訊息不回射 secret 本身。

Terminal window
GORTEXA_AUTH__JWT_SECRET="dev-only-insecure-secret-change-me-please" ./server # exit 1,未綁 port
GORTEXA_AUTH__JWT_SECRET='tooshort' ./server # exit 1
GORTEXA_AUTH__JWT_SECRET="<45-byte real secret>" ./server # 啟動;env 覆寫 file secret

拒絕發生在 listen 之前,所以 (a)(b) 兩例根本不會綁 port。

08 header-leak-probe — 回應 header allowlist

Section titled “08 header-leak-probe — 回應 header allowlist”

回應 header 侷限在固定 allowlist:不得漏 Grpc-Metadata-*,但 X-Request-Id 必須保留(allowlist 不能過窄)。

Terminal window
curl -D - -H "authorization: Bearer $TOK" http://localhost:18082/v1/resources/x
# 斷言:無 grpc-metadata-* 標頭、無 allowlist 外的標頭、X-Request-Id 有出現

09 reflection-probe — reflection 預設關、可 config 開

Section titled “09 reflection-probe — reflection 預設關、可 config 開”

gRPC reflection 預設關閉;用環境變數開啟後同一呼叫才成功。

Terminal window
buf curl --protocol grpc --http2-prior-knowledge --reflect ... # 預設:失敗(找不到 service)
GORTEXA_SERVER__REFLECTION=true ./server
buf curl --protocol grpc --http2-prior-knowledge --reflect ... # 開啟後:成功

生產環境建議保持關閉,見部署的生產旗標。