Segurança aprimorada

Suporte para mascaramento de ponteiros em espaço de usuário RISC-V está pronto para o Linux 6.13

Relógio despertador marcando a hora com um papel colorido ao fundo escrito 'Linux 6.13', simbolizando a iminência do lançamento da nova versão do sistema.

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:

  1. Smmpm: configurável no modo M, com efeito nesse mesmo modo.
  2. Smnpm: configurado no modo M, atuando no próximo modo inferior (modo S ou U).
  3. 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.