HIGH: rate limiter bypassable via X-Forwarded-For #280
Notifications
Total Time Spent: 2 hours
fen
2 hours
No due date set.
Dependencies
No dependencies set.
Reference: poslop/palette#280
Reference in New Issue
Block a user
Found in v0.5.0 pre-release pentest (full report: /home/fen/pentest-palette-v0.5.0-report.md).
clientIP()in internal/api keys rate-limit buckets on the RIGHTMOST X-Forwarded-For entry, assuming traefik appends the real client IP. It doesn't: an attacker rotating their own XFF header gets a fresh bucket per request. Evidence: 8 create requests with rotating XFF -> 6x201 (limits never tripped); same-XFF and no-header runs each landed in separate buckets too.This image serves public prod (p.archfox.org), so create/public endpoints are effectively unmetered.
Definition of done:
QA pass on PR #284 (merged to dev
eca8533, deployed to palette-dev). Merged under OWNER REVIEW, not closed: one wiring gap.Verified live on palette-dev (fix deployed, CI docker green):
Concern / why owner review:
Note: a competing un-PR'd implementation (commit
a0b3437on fix-280, trusted-proxies + PALETTE_CLIENT_IP_HEADER design, pushed 01:34 UTC) was superseded by merged PR #284; its branch was deleted per branch hygiene. The sha remains fetchable if that design is preferred.PALETTE_TRUSTED_IP_HEADER can be removed
QA PASS (PR #291, merged to dev
aa72b4b, deployed to palette-dev).Live verification:
Also closed superseded PR #289 (same scope) and deleted fix-280. Closing issue and deleting fix-280-r2.