🟡 Médio | Segurança | API
Problema
A API usa String::from_utf8_lossy() para converter chaves binárias em String, substituindo bytes inválidos por \u{FFFD} (caractere de substituição). Chaves com bytes de controle ou não-UTF8 são modificadas silenciosamente, causando perda de dados ou comportamento inesperado.
Impacto
- Chaves com bytes não-UTF8 são corrompidas silenciosamente
- Impossível distinguir chave original
\xff\xfe de chave ��� após conversão
- Pode mascarar ataques ou dificultar debugging em produção
- A API GraphQL (async-graphql) pode rejeitar chaves não-UTF8 com erro 400
Evidência
src/api/mod.rs:56: String::from_utf8_lossy(&key)
src/api/mod.rs:86-87: String::from_utf8_lossy(&key) e String::from_utf8_lossy(&value)
src/api/mod.rs:152: String::from_utf8_lossy(&k).to_string()
Como reproduzir
# Inserir chave com byte não-UTF8
curl -X PUT http://localhost:8080/keys/$(printf xffxfex00) \
-H "Content-Type: application/json" \
-d {value:binary-key-test}
# Recuperar — chave aparece como "���" em vez do original
curl http://localhost:8080/keys
Correção recomendada
- Opção A (recomendada): Exigir chaves UTF-8 válidas na API REST, rejeitar com 400 se inválidas
- Opção B: Documentar que a API trabalha com base64 para chaves binárias
- Para o storage engine (sem API): manter suporte a chaves binárias, sem validação
// No handler, validar que a chave é UTF-8 válida
if let Err(_) = std::str::from_utf8(key.as_bytes()) {
return HttpResponse::BadRequest()
.json(json!({"error": "key must be valid UTF-8"}));
}
Esforço: Baixo (1h)
🟡 Médio | Segurança | API
Problema
A API usa
String::from_utf8_lossy()para converter chaves binárias em String, substituindo bytes inválidos por\u{FFFD}(caractere de substituição). Chaves com bytes de controle ou não-UTF8 são modificadas silenciosamente, causando perda de dados ou comportamento inesperado.Impacto
\xff\xfede chave���após conversãoEvidência
src/api/mod.rs:56:String::from_utf8_lossy(&key)src/api/mod.rs:86-87:String::from_utf8_lossy(&key)eString::from_utf8_lossy(&value)src/api/mod.rs:152:String::from_utf8_lossy(&k).to_string()Como reproduzir
Correção recomendada
Esforço: Baixo (1h)