O Linux 6.13 está para receber uma adição importante: o suporte para mascaramento de ponteiros em espaço de usuário na arquitetura RISC-V. Essa tecnologia, inspirada no Arm Memory Tagging Extension (MTE), introduz um nível extra de segurança na memória ao ignorar bits específicos do endereço efetivo em plataformas RISC-V. Com essa função, o sistema pode identificar acessos de memória indevidos em aplicativos, o que melhora a segurança em níveis elevados.
Estrutura técnica das extensões de mascaramento
Conforme detalhado por Samuel Holland, engenheiro da SiFive, o RISC-V define três extensões principais para mascaramento de ponteiros:
- Smmpm: configurável no modo M, com efeito nesse mesmo modo.
- Smnpm: configurado no modo M, atuando no próximo modo inferior (modo S ou U).
- Ssnpm: configurado no modo S, afetando o próximo modo inferior (VS, VU ou U).
Com essa série de alterações, o kernel do Linux poderá configurar Smnpm ou Ssnpm (dependendo do modo de privilégio em execução) para habilitar o mascaramento de ponteiros no espaço de usuário (modos VU ou U). A API PR_SET_TAGGED_ADDR_CTRL foi estendida do arm64 para viabilizar o mascaramento de ponteiros em RISC-V. Diferente do Top Byte Ignore do Arm, o mascaramento de ponteiros no espaço de usuário em RISC-V não é ativado por padrão. A largura de tag, ou PMLEN, é ajustável, permitindo que o espaço de usuário solicite uma largura específica para seus propósitos.
ABI de endereços marcados e impacto no kernel
Essa atualização também traz um ABI de endereços marcados semelhante aos existentes para arm64 e x86. Como o kernel acessa a memória do usuário seguindo suas próprias configurações de mascaramento de ponteiros, ele deve “desmarcar” esses ponteiros antes de acessá-los. Para garantir a eficiência do untagged_addr_remote() e outras operações de acesso, é essencial que a largura de tag seja mantida constante em todas as threads de um processo.
Habilitação do mascaramento de ponteiros pelo usuário
Na documentação RISC-V, a habilitação do mascaramento de ponteiros é realizada através das operações prctl(), PR_SET_TAGGED_ADDR_CTRL e PR_GET_TAGGED_ADDR_CTRL, sendo inicialmente desativada. O usuário define o campo PR_PMLEN para especificar o número desejado de bits de máscara. Caso o kernel não possa atender à solicitação, o processo falha, retornando o valor de bits real disponível em PR_PMLEN por meio da PR_GET_TAGGED_ADDR_CTRL.
Inclusão no Linux 6.13
Esse novo recurso de mascaramento de ponteiros foi recentemente incorporado ao branch “for-next” do Git para RISC-V, sob coordenação de Palmer Dabbelt, e já conta com testes adicionais, como o suporte de ISA para o controle de ABI e testes de verificação de registradores para extensões Smnpm e Ssnpm. Essa funcionalidade agora aguarda a inclusão no ciclo de desenvolvimento do Linux 6.13, dependendo de revisões finais de Linus Torvalds e outros mantenedores.
Com essa melhoria, a segurança e integridade da memória de aplicativos em RISC-V são significativamente aprimoradas, oferecendo uma camada de proteção contra uso incorreto de memória em aplicações de usuário, crucial para a confiabilidade de sistemas modernos.