Pitfalls in VM Implementation on CHERI: Lessons from Porting CRuby

Este artigo analisa os desafios e armadilhas específicas na implementação de máquinas virtuais no hardware CHERI, utilizando o caso de estudo da portabilidade do CRuby para identificar como suposições sobre comportamentos indefinidos do C em arquiteturas tradicionais causam falhas e para propor soluções validadas.

Hanhaotian Liu (University of Tokyo, Japan), Tetsuro Yamazaki (University of Tokyo, Japan), Tomoharu Ugawa (University of Tokyo, Japan)

Publicado Mon, 09 Ma
📖 6 min de leitura🧠 Leitura aprofundada

Each language version is independently generated for its own context, not a direct translation.

Imagine que você tem uma biblioteca de livros muito antiga e valiosa (o CRuby, que é o "cérebro" da linguagem de programação Ruby). Essa biblioteca foi construída há décadas, e os bibliotecários (os programadores) sempre assumiram certas regras sobre como os livros funcionam. Por exemplo, eles achavam que, se um livro estava na prateleira 5, ele podia ser movido para a prateleira 6 sem problemas, ou que podiam escrever anotações em qualquer página do livro, desde que estivesse dentro do mesmo armário.

Agora, imagine que a biblioteca está se mudando para um novo prédio superseguro chamado CHERI.

Neste novo prédio, as regras são muito mais rígidas e inteligentes:

  1. Chaves Mágicas (Capabilities): Em vez de apenas um número de prateleira (um ponteiro comum), cada livro tem uma "chave mágica" que diz exatamente qual livro é, onde ele está, e o que você pode fazer com ele (ler, escrever, ou apenas olhar).
  2. Limites Rígidos: Se a chave diz que você só pode tocar na página 10, você não consegue, nem por acidente, tocar na página 11. O sistema bloqueia.
  3. Selos de Segurança: Alguns livros têm um "selo de segurança" (como endereços de retorno de funções). Se alguém tentar rasgar uma página ou mudar o selo, o sistema soa um alarme e trava tudo.

O Problema: A Mudança de Casa

Os autores deste artigo (Hanhaotian Liu, Tetsuro Yamazaki e Tomoharu Ugawa) decidiram mover a biblioteca CRuby para esse novo prédio CHERI. Eles esperavam que fosse fácil, mas descobriram que a biblioteca antiga estava cheia de "truques de mágica" que funcionavam no prédio velho, mas que viraram desastres no novo.

Eles chamam esses desastres de "Armadilhas" (Pitfalls). Aqui estão as principais armadilhas que eles encontraram, explicadas com analogias simples:

1. A Armadilha do "Mapa de Área" (Invalid Derived Pointer)

  • O Truque Antigo: No prédio velho, se você pegasse um livro da prateleira e dissesse "a partir daqui, eu vou contar até o fim do corredor", o sistema deixava. Você podia andar livremente pelo corredor.
  • O Problema no CHERI: No novo prédio, a chave do livro diz "você só pode tocar neste livro específico". Se você tentar usar essa chave para "andar" pelo corredor (varrer a pilha de memória), o sistema grita: "Ei! Essa chave não tem permissão para tocar no resto do corredor!".
  • A Solução: Em vez de usar a chave do livro individual, os bibliotecários agora carregam uma "Chave Mestra" que abre todo o corredor inteiro. Eles usam essa chave mestra para navegar, e só usam a chave pequena para pegar o livro específico quando necessário.

2. A Armadilha do "Livro Falso" (Dereferencing Ambiguous Pointers)

  • O Truque Antigo: O sistema de segurança (Garbage Collector) olhava para um pedaço de papel na mesa. Se o papel tivesse números que pareciam um endereço de livro, o sistema assumia: "Ah, isso é um livro! Vou abrir e ler".
  • O Problema no CHERI: No novo prédio, nem todo número é uma chave válida. Às vezes, é apenas um número aleatório. Se o sistema tentar abrir um "livro" que é apenas um número falso, a chave não tem o "selo de validade" e o sistema trava.
  • A Solução: Antes de tentar abrir o livro, o sistema agora verifica o "selo de validade" na chave. Se não tiver o selo, ele ignora o papel. Isso até torna o sistema mais rápido, pois ele para de tentar ler papéis que não são livros.

3. A Armadilha do "Expansão de Sala" (In-Place Reallocation)

  • O Truque Antigo: Imagine que você tem uma caixa de ferramentas. Se ela fica pequena, você pede para o zelador esticá-la no lugar. O zelador estica a caixa, mas diz: "A chave antiga ainda serve, ela agora é maior".
  • O Problema no CHERI: No novo prédio, quando o zelador estica a caixa, ele entrega uma nova chave com novos limites. A chave antiga diz "até a parede X", mas a caixa agora vai até a parede Y. Se você continuar usando a chave antiga, vai bater na parede e o sistema bloqueia.
  • A Solução: O código foi reescrito para sempre pegar a "nova chave" que o zelador entrega, em vez de insistir na antiga.

4. A Armadilha do "Espaço Vazio" (Using Padding Bits)

  • O Truque Antigo: Os programadores usavam caixas de 128 bits (o tamanho das chaves no novo prédio) para guardar números pequenos, assumindo que podiam usar todos os 128 bits para fazer cálculos matemáticos.
  • O Problema no CHERI: No novo prédio, a caixa de 128 bits não é só para números. A metade superior é usada para guardar os "segredos" da chave (limites, permissões). Se você tentar fazer cálculos matemáticos usando esses bits de segredo, você corrompe a chave e o sistema trava.
  • A Solução: Eles pararam de usar as caixas gigantes para cálculos simples e passaram a usar caixas menores e puras (tipos inteiros exatos) que não têm segredos escondidos.

5. A Armadilha do "Selo Quebrado" (Modifying Sealed Capabilities)

  • O Truque Antigo: Às vezes, o sistema pegava um endereço de retorno (um "mapa de volta para casa") e fazia cálculos matemáticos nele para encontrar informações.
  • O Problema no CHERI: Esses endereços de retorno são "selados". É como se estivessem lacrados com cera. Se você tentar fazer uma conta matemática neles, você quebra o lacre. O sistema vê o lacre quebrado e trava por segurança.
  • A Solução: Antes de fazer a conta, eles transformam o endereço selado em um simples número (sem a chave), fazem a conta, e só depois olham o resultado. Eles não tentam quebrar o lacre.

O Resultado Final

Depois de consertar todas essas armadilhas, os autores testaram a biblioteca.

  • Funciona? Sim! O CRuby agora roda no CHERI e passa na maioria dos testes (cerca de 87% dos testes originais).
  • É lento? Quase nada. Em média, o novo sistema é apenas 1,8% mais lento que o antigo. Em alguns casos específicos (como fibras, que são como "mini-tarefas"), houve uma queda maior porque a versão antiga usava truques de hardware muito específicos que não existem no novo prédio, mas a solução geral é muito eficiente.

Conclusão

Este artigo é um manual de sobrevivência. Ele diz aos programadores: "Se vocês querem construir softwares seguros no futuro (usando CHERI), parem de fazer truques de mágica que funcionavam no passado. O novo sistema é mais inteligente e seguro, mas exige que você seja mais honesto e preciso sobre como manipula a memória."

É como mudar de uma casa onde você podia pular de um telhado para o outro sem cair, para uma casa onde cada janela tem um vidro à prova de balas. Você precisa aprender a usar as escadas corretamente, mas no final, sua casa estará muito mais segura contra invasores.