security: add safe.ReadAllLimited — bound all HTTP response body reads to 10MB

- Created safe/io.go with ReadAllLimited helper (default 10MB limit)
- Replaced 62 unbounded io.ReadAll(resp.Body) calls across 32 files
- Covers all exchange traders (Hyperliquid, Bybit, Binance, OKX, Aster,
  KuCoin, Gate, Bitget, Lighter, Indodax), providers (CoinAnk, Alpaca,
  TwelveData), MCP client/x402, market data, wallet, telegram, kernel
- Prevents OOM from malicious/buggy exchange API responses
- Previously fixed: brain.go, sentinel.go already had manual LimitReader
This commit is contained in:
shinchan-zhai
2026-03-23 10:55:03 +08:00
parent 1d0d6f7afd
commit 982ee668c9
33 changed files with 120 additions and 89 deletions

View File

@@ -1,6 +1,7 @@
package agent
import (
"nofx/safe"
"fmt"
"io"
"net/http"
@@ -134,7 +135,7 @@ func searchStock(keyword string) ([]SearchResult, error) {
defer resp.Body.Close()
reader := transform.NewReader(io.LimitReader(resp.Body, 256*1024), simplifiedchinese.GBK.NewDecoder())
body, err := io.ReadAll(reader)
body, err := safe.ReadAllLimited(reader)
if err != nil {
return nil, err
}
@@ -288,7 +289,7 @@ func fetchStockQuote(code string) (*StockQuote, error) {
defer resp.Body.Close()
reader := transform.NewReader(io.LimitReader(resp.Body, 256*1024), simplifiedchinese.GBK.NewDecoder())
body, err := io.ReadAll(reader)
body, err := safe.ReadAllLimited(reader)
if err != nil { return nil, err }
line := string(body)