Pitch: OSS WAF leve para Traefik em Rust + WASM: Purple Wolf
Pessoal, queria compartilhar um projeto open source que venho construindo: Purple Wolf, um Web Application Firewall leve para Traefik, escrito em Rust e empacotado como plugin WASM.
A ideia nasceu de uma dor bem prática: eu queria uma camada de proteção HTTP que fosse fácil de plugar em rotas do Traefik, consumisse pouca memória, tivesse comportamento previsível e não tentasse prometer “segurança mágica”. WAF é uma área cheia de trade-offs, então o Purple Wolf tenta ser bem explícito sobre o que detecta, o que não detecta e quais decisões operacionais ficam na mão de quem vai rodar.
Hoje ele inspeciona URL, query params, headers e corpo da requisição até um limite configurável. A engine combina algumas abordagens:
- libinjection para SQLi e XSS;
- assinaturas literais com Aho-Corasick;
- checagens estruturais de HTTP;
- rate limit e deny list por IP;
- modo monitor ou enforce por middleware.
Além do plugin em si, o projeto tem um relay separado para eventos de auditoria. O WAF emite logs estruturados no Traefik, e o purple-wolf-relay pode encaminhar esses eventos como webhooks assinados com HMAC para SIEM, Slack bridge, sistemas internos ou subscribers por tenant. Esse relay tem filas limitadas por subscriber, retry, DLQ e isolamento para evitar que um destino lento trave os outros.
Um ponto que eu fiz questão de manter desde cedo foi a honestidade do threat model. O Purple Wolf não tenta ter paridade completa com OWASP CRS. Ele é mais precision-first: tenta evitar falso positivo e manter footprint baixo, sabendo que isso reduz recall em payloads muito artificiais ou tokens isolados. O próprio repositório documenta os gaps conhecidos, os não objetivos e os riscos operacionais, como configuração incorreta de X-Forwarded-For ou o trade-off de corpos maiores que o limite de inspeção.
Também publiquei benchmarks comparando o caminho http-wasm com Coraza no mesmo ambiente, mesma topologia e mesmos recursos. No benchmark publicado, o Purple Wolf adicionou algo na faixa de 0.1-0.2 ms p99 contra baseline Traefik-only e ficou estável em memória durante carga sustentada. Mas deixo a ressalva no próprio documento: isso não é uma afirmação genérica de “melhor WAF”. É uma comparação específica, reproduzível, no caminho WASM, com caveats explícitos.
Repositório:
https://github.com/guaracloud/purple-wolf
Site/docs:
https://guaracloud.github.io/purple-wolf/
Se alguém aqui roda Traefik em produção, trabalha com WAF, já sofreu com falso positivo de CRS, ou tem experiência com http-wasm, eu adoraria ouvir críticas. Principalmente sobre o que vocês esperariam de um WAF pequeno e auditável antes de confiar nele em modo enforce.