nesquena-hermes
a064542df9
release: v0.39.0 — security hardening, 12 fixes (#171)
* Security: harden auth, CSRF, SSRF, XSS, and env race conditions
Twelve fixes from a full security audit:
CRITICAL
- Add CSRF Origin/Referer validation on all POST endpoints
(prevents cross-origin abuse of self-update, settings, file ops)
HIGH
- Unify password hashing: config.py now uses PBKDF2 (600k iters)
instead of single-iteration SHA-256
- Add per-IP rate limiting on login (5 attempts/60s, 429 on excess)
MEDIUM
- Validate session IDs as hex-only before filesystem operations
(prevents path traversal via crafted session ID)
- SSRF: resolve DNS before private-IP check in model fetching
(prevents DNS rebinding to internal services)
- Warn loudly when binding non-loopback without password set
- SSE env var mutations: wrap sync chat + streaming restore in _ENV_LOCK
- Force Content-Disposition:attachment for HTML/XHTML/SVG uploads
(prevents stored XSS via uploaded files)
LOW
- Extend HMAC session signature from 64 to 128 bits
- Add resolve()+relative_to() check on skills path construction
- Set Secure flag on session cookie when connection is HTTPS
- Sanitize exception messages to strip filesystem paths
No breaking changes. All fixes are backward-compatible.
* fix: use getattr for Secure cookie SSL detection
handler.request.getpeercert raises AttributeError on plain sockets
(non-SSL). Use getattr(..., None) to safely check for SSL.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* tests: add sprint 29 security hardening coverage (PR #171)
33 tests covering all 12 security fixes:
- CSRF origin/referer validation
- Login rate limiting (5 attempts/60s)
- Session ID hex validation (path traversal prevention)
- Error path sanitization (_sanitize_error)
- Secure cookie getattr safety
- HMAC signature length (64->128 bit)
- Skills path traversal prevention
- Content-Disposition for HTML/SVG/XHTML
- PBKDF2 password hashing verification
- Non-loopback startup warning
- SSRF DNS guard code presence
- _ENV_LOCK export from streaming module
* release: v0.39.0 — security hardening, 12 fixes (#171)
---------
Co-authored-by: betamod <matthew.sloly@gmail.com>
Co-authored-by: Nathan Esquenazi <nesquena@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 22:26:03 -07:00
..
2026-03-30 20:40:19 -07:00
2026-04-04 14:51:15 -07:00
2026-04-06 14:15:24 -07:00
2026-04-03 06:41:32 -07:00
2026-03-31 07:02:47 +00:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-30 20:40:19 -07:00
2026-03-31 07:02:47 +00:00
2026-03-31 07:02:47 +00:00
2026-03-31 07:02:47 +00:00
2026-03-31 07:02:47 +00:00
2026-04-02 00:11:49 -07:00
2026-04-03 00:27:43 +00:00
2026-04-03 04:13:38 -07:00
2026-04-03 06:21:04 -07:00
2026-04-03 14:13:29 +00:00
2026-04-03 14:23:56 +00:00
2026-04-03 19:16:17 -07:00
2026-04-05 04:00:24 +00:00
2026-04-06 15:06:16 +00:00
2026-04-06 14:10:30 -07:00
2026-04-07 22:26:03 -07:00