Skip to content

fix(admin): unblock space creation blocked by WAF (v2.5.2) - #25

Merged
chrlesur merged 2 commits into
mainfrom
fix/api-tool-waf-empty-response
Jun 7, 2026
Merged

fix(admin): unblock space creation blocked by WAF (v2.5.2)#25
chrlesur merged 2 commits into
mainfrom
fix/api-tool-waf-empty-response

Conversation

@chrlesur

@chrlesur chrlesur commented Jun 7, 2026

Copy link
Copy Markdown
Collaborator

Contexte

La création de space via la console /admin échouait avec "Empty response", sans rapport avec le champ Owner (qui est optionnel et purement informatif côté serveur).

Cause racine (infrastructure, pas le code applicatif)

La console admin proxifie ses appels via POST /api/tool, routé à travers le WAF Coraza (OWASP CRS). Le markdown des rules transite dans le corps de requête et déclenche des faux positifs XSS/SQLi du CRS — notamment les < des rules par défaut (activeContext.md < 8 KB, < 15 KB) et le mot delete (delete sections superseded…). Le score d'anomalie dépasse le seuil (5), Coraza renvoie un 403 à corps vide, affiché par l'UI comme space_create échouant en "Empty response". C'est pourquoi space_list fonctionnait mais pas space_create avec rules.

Correctif

  • waf/Caddyfile : exclusion du corps de requête de /api/tool de l'inspection CRS (ctl:requestBodyAccess=Off scopé à REQUEST_URI @beginsWith /api/tool). L'endpoint est déjà verrouillé par cookie HttpOnly + permission write et ne proxifie que des appels structurés {tool, arguments} — même logique de confiance que /mcp*. Rate-limiting, limites de taille et inspection URI/headers restent actifs.
  • UX bonus : le champ Owner de "Create Space" devient une <datalist> des détenteurs de tokens actifs (saisie libre toujours possible), valeur stockée = nom du token.
  • Docs : DESIGN/live-mem/DEPLOIEMENT_PRODUCTION.md §5 documente l'exception.

Déploiement requis

⚠️ Le Caddyfile est bind-mounté (./waf/Caddyfile:/etc/caddy/Caddyfile:ro) → un simple docker compose restart waf suffit, pas de rebuild d'image.

Tests

413 passed, 1 xfailed (assertion de version mise à jour 2.5.0 → 2.5.2 dans test_security_hardening_v2.py).

🤖 Generated with Claude Code

chrlesur and others added 2 commits June 7, 2026 18:23
…list

The admin console proxies tool calls through POST /api/tool, which is
routed through the Coraza WAF. Markdown rules in the request body tripped
OWASP CRS XSS/SQLi heuristics (the '<' chars in "< 8 KB" / "< 15 KB" and
the word "delete"), pushing the anomaly score past the threshold. Coraza
returned a 403 with an empty body, surfaced in the UI as space_create
failing with "Empty response".

Exclude the /api/tool request body from CRS inspection
(ctl:requestBodyAccess=Off scoped to REQUEST_URI @beginswith /api/tool).
The endpoint is already gated by an HttpOnly cookie + write permission and
only proxies structured {tool, arguments} calls — same trust rationale as
/mcp*. Rate-limiting, body-size limits and URI/header inspection stay on.

Also turn the Owner field on "Create Space" into a <datalist> of active
token holders (free text still allowed), and document the WAF exception in
DEPLOIEMENT_PRODUCTION.md §5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ion list

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@chrlesur
chrlesur merged commit aa39dac into main Jun 7, 2026
2 checks passed
@chrlesur
chrlesur deleted the fix/api-tool-waf-empty-response branch June 7, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant