Cve-rs: Vulnerabilidades de memória rápidas, escritas em Rust seguro
Uma crate Rust de prova de conceito, cve-rs, explora um bug antigo de consistência no compilador, no sistema de lifetimes e variância do Rust, para criar violações de segurança de memória em código que não contém blocos `unsafe`. Os comentadores destrincham como restrições implícitas de lifetime, variância de ponteiros de função e o solucionador de traits atual interagem para permitir esse caso extremo, e observam que Miri consegue detectar o problema mesmo que o rustc aceite o código. A troca avalia quão raros e artificiais esses bugs são em relação ao marketing do Rust como linguagem “segura em memória”, e se casos extremos inconsistentes realmente enfraquecem essa garantia na prática.
Sintaxe de lifetimes em Rust e o bug central
- A discussão se concentra em como
&'a &'b Tdifere de adicionar uma restrição explícitawhere 'b: 'a. - Vários comentários explicam: referências aninhadas criam restrições de lifetime implícitas que o compilador deveria respeitar; o lifetime externo não deve sobreviver ao interno.
- O bug surge quando essas restrições implícitas interagem com a variância de ponteiros de função e lifetimes de ordem superior: o compilador pode inferir incorretamente que um lifetime sobrevive a outro após certos casts, permitindo um use-after-free em código “seguro”.
- Alguns enfatizam que isso diz respeito a lifetimes com vínculo tardio vs. vínculo precoce e a como a variância (contra-/covariância) é tratada para tipos de função.
Miri, Polonius e trabalho no solucionador de traits
- Miri (um interpretador/sanitizer) detecta a inconsistência em tempo de execução, mesmo quando o código Rust é sintaticamente “seguro”.
- Há debate sobre se um novo solucionador de traits e refatorações relacionadas (restrições implícitas, coindução) são pré-requisitos para uma correção adequada; links observam que este bug está explicitamente bloqueado por esse trabalho.
- Alguns são céticos em relação à narrativa de que “o novo solucionador vai corrigir isso”, mas outros observam que há um plano técnico claro, apenas difícil e lento.
Garantias de segurança, inconsistência e marketing
- Um lado argumenta: mesmo com mais de 80 problemas abertos de “inconsistência”, Rust é muito mais seguro do que C/C++, e esses são casos extremos raros, muitas vezes difíceis de atingir por acidente.
- Outros contrapõem: qualquer inconsistência enfraquece as alegações de “segurança de memória”; Rust deveria ser descrito como “mais seguro em memória” até que esses bugs sejam corrigidos.
- Há discussão sobre se isso é um bug do compilador ou uma falha mais profunda da teoria da linguagem/tipos; alguns insistem que o design pode ser tornado consistente, mas a implementação está atrasada.
Ergonomia e facilidade de aprendizado
- Alguns leitores acham o código que dispara o bug assustador ou ilegível e se preocupam que Rust seja “muito simbólico” e gere RSI.
- Outros respondem que esse é um código obscurecido, no estilo repro mínimo, e não representa o Rust típico; a maioria do código real tem poucos lifetimes explícitos.
- Lifetimes são explicados informalmente como “pools de memória” com rótulos, o que vários consideram esclarecedor.
- Há críticas e defesa mais amplas das escolhas sintáticas de Rust, com sugestões de que alguma sintaxe relacionada a
unsafee a sintaxe de funções poderiam ter sido projetadas melhor.
Impacto prático e explorabilidade
- Muitos enfatizam que explorar isso exige código artificial e truques anti-otimização; é improvável que seja escrito por acidente.
- Ainda assim, comentadores observam que mesmo um único buraco desses contradiz a expectativa de que código Rust seguro não possa causar corrupção de memória, e deve ser levado a sério.
- Faz-se comparação com outros caminhos como
/proc/self/mem, com a lembrança de que as garantias do Rust cobrem apenas o que o próprio programa faz, e não processos externos ou o sistema operacional.
Miscelânea
- O licenciamento de brincadeira do projeto (GLWTS) e uma função
download_more_ram()são observados como toques bem-humorados. - Alguém pergunta sobre o prompt do shell; outros o identificam como uma ferramenta popular de prompt.