Skip to content

INPUT-VAL-002: API aceita chaves não-UTF8 — perda de dados silenciosa com String::from_utf8_lossy #355

@ElioNeto

Description

@ElioNeto

🟡 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

  1. Opção A (recomendada): Exigir chaves UTF-8 válidas na API REST, rejeitar com 400 se inválidas
  2. Opção B: Documentar que a API trabalha com base64 para chaves binárias
  3. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmedium

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions