A Microsoft apresentou trabalhos relacionados ao projeto CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), que visa bloquear problemas de segurança no código existente escrito em C e C++. O CHERIoT oferece uma solução que protege as bases de código existentes em C/C++ sem a necessidade de reescrevê-las. A proteção é implementada por meio do uso de um compilador modificado que utiliza um conjunto de instruções de processador (ISA) estendido, fornecido pelo próprio processador e que rastreia o acesso à memória em nível de hardware, garantindo a correção do manuseio de ponteiros e assegurando a isolação de blocos de código.
O projeto foi criado com a consciência de que a natureza de baixo nível da linguagem C se torna uma fonte de erros ao lidar com a memória, levando a problemas como estouro de buffer, acesso à memória já liberada, desreferenciamento de ponteiros e dupla liberação de memória. A prática mostra que até grandes corporações, como Google e Microsoft, que têm uma política rigorosa de revisão de mudanças e aplicam métodos modernos de desenvolvimento e ferramentas de análise estática, não conseguem garantir a ausência de erros ao trabalhar com memória (por exemplo, cerca de 70% das vulnerabilidades nos produtos de software da Microsoft e Google são causadas por manuseio inseguro da memória).
O problema pode ser resolvido usando linguagens de programação que garantem um manuseio seguro da memória ou wrappers com verificações adicionais, como a aplicação de ponteiros do tipo MiraclePtr (raw_ptr), que realiza verificações adicionais ao acessar áreas de memória liberadas. Mas esses métodos são mais adequados para novos códigos, e reescrever projetos existentes em C/C++ é bastante problemático, especialmente se eles foram projetados para serem executados em ambientes com recursos limitados, como sistemas embarcados e dispositivos de Internet das Coisas.
Os componentes de hardware do CHERIoT são configurados como um microcontrolador baseado na arquitetura RISC-V, implementando a arquitetura de processador seguro CHERI (Capability Hardware Extension to RISC-V), que oferece um modelo de acesso controlado à memória baseado em "capabilities" (cada operação de leitura e gravação na memória é autorizada). Com a arquitetura do conjunto de instruções (ISA) fornecida pelo CHERIoT, foi desenvolvida um modelo de software que garante a segurança no trabalho com a memória em nível de objetos individuais, protegendo contra acessos a memória já liberada e implementando um leve sistema de isolamento de acesso à memória. Este modelo de software de proteção é diretamente refletido no modelo de linguagem C/C++, permitindo a sua aplicação para proteger aplicações existentes (sendo necessária apenas a recompilação e execução em hardware que suporte a ISA CHERIoT).
A solução proposta permite bloquear erros que causam ultrapassagens de limites do objeto na memória, não permitindo a substituição de ponteiros (todos os ponteiros devem ser gerados a partir de ponteiros já existentes), rastreia acessos à memória após a liberação (qualquer acesso à memória por um ponteiro incorreto ou por um ponteiro que referencia um objeto liberado resulta na geração de uma exceção). Por exemplo, a utilização do CHERIoT permite realizar verificações automáticas de limites e rastrear o tempo de vida das áreas de memória, garantindo a integridade dos ponteiros em componentes que processam dados não confiáveis, sem necessidade de alterações no código.
O projeto inclui a especificação da arquitetura estendida do conjunto de instruções CHERIoT, a implementação de referência de uma CPU RISC-V de 32 bits com suporte à ISA CHERIoT e um conjunto de ferramentas LLVM modificado. Os esquemas do protótipo da CPU e as descrições dos blocos de hardware no idioma Verilog são distribuídos sob a licença Apache 2.0. Como base para a CPU, foi utilizado o núcleo Ibex do projeto lowRISC. O modelo de código da ISA CHERIoT é definido na linguagem Sail e é distribuído sob a licença BSD.
O protótipo do sistema operacional em tempo real CHERIoT RTOS foi adicionalmente proposto, oferecendo a capacidade de isolar compartimentos (compartment) mesmo em sistemas embarcados com 256 MB de RAM. O código CHERIoT RTOS é escrito em C++ e é distribuído sob a licença MIT. Os componentes básicos do SO, como bootloader, escalonador e sistema de alocação de memória, estão organizados na forma de compartimentos.
Um compartimento no CHERIoT RTOS representa uma combinação isolada de código e variáveis globais, que se assemelha a uma biblioteca compartilhada, mas ao contrário desta, pode mudar seu estado (mutable) e ser executada em um contexto de segurança separado. Nenhum código externo pode passar o controle para o código no compartimento ou acessar objetos, exceto ao se referir a pontos de entrada especificamente definidos e ao usar ponteiros para objetos explicitamente passados ao chamar outro compartimento. A integridade e a confidencialidade de códigos e objetos globais no compartimento são garantidas.
Fonte: opennet.ru
