Pesquisadores da Universidade de Stanford, da Universidade da Califórnia em San Diego e da Universidade do Texas em Austin um conjunto de ferramentas , que pode ser aplicada como um nível adicional de isolamento para bloquear vulnerabilidades em bibliotecas de funções. RLBox visa resolver o problema de segurança de bibliotecas de terceiros não confiáveis, que não estão sob controle dos desenvolvedores, mas cujas vulnerabilidades podem comprometer o projeto principal.
A empresa Mozilla implementar RLBox em builds do Firefox para Linux 74 e em builds do Firefox para macOS 75 para isolar a execução da biblioteca , responsável pela renderização de fontes. Nesse sentido, RLBox não é específico para o Firefox e pode ser utilizado para isolar quaisquer bibliotecas em projetos variados. RLBox sob a licença MIT. Atualmente, RLBox suporta operação em plataformas Linux e macOS, com suporte para Windows previsto para mais tarde.
o funcionamento do RLBox consiste em compilar o código C/C++ da biblioteca a ser isolada em um código intermediário de baixo nível WebAssembly, que é então formatado como um módulo WebAssembly, cujas permissões são definidas vinculadamente apenas a esse módulo (por exemplo, uma biblioteca para manipulação de strings não poderá abrir um socket de rede ou um arquivo). A transformação do código C/C++ em WebAssembly é realizada com a ajuda de .
Para execução imediata, o módulo WebAssembly é compilado em código de máquina com o auxílio do compilador e é executado em um "nanoprocesso" separado, isolado da memória restante do aplicativo. O compilador Lucet é baseado no mesmo código que o mecanismo JIT , utilizado no Firefox para executar WebAssembly.
O módulo compilado opera em uma área de memória separada e não tem acesso ao restante do espaço de endereçamento. Em caso de exploração de uma vulnerabilidade na biblioteca, o atacante ficará limitado e não poderá acessar áreas de memória do processo principal ou transferir controle para fora do ambiente isolado.
Para os desenvolvedores, foi fornecido um nível elevado , que permite a chamada de funções da biblioteca em um modo isolado. Os manipuladores WebAssembly exigem quase nenhum recurso adicional, e a interação com eles não é muito mais lenta do que a chamada de funções normais (as funções da biblioteca são executadas na forma de código nativo, com sobrecarga ocorrendo apenas durante a cópia e verificação de dados no processo de interação com o ambiente isolado). As funções da biblioteca isolada não podem ser chamadas diretamente e, para acessá-las, é necessário utilizar
a camada invoke_sandbox_function().
Por sua vez, se a biblioteca precisar chamar funções externas, essas funções devem ser explicitamente definidas usando o método register_callback (por padrão, o RLBox fornece acesso às funções ). Para garantir uma operação segura da memória (memory safety), a simples execução isolada do código não é suficiente; é também necessário garantir a verificação dos fluxos de dados retornados.
Os valores formados no ambiente isolado são marcados como não confiáveis, limitados por meio de , e para sua 'limpeza' requerem e cópia para a memória do aplicativo.
Sem a limpeza, a tentativa de usar dados tainted em um contexto que exige dados normais (e vice-versa) resulta na geração de erros na fase de compilação. Pequenos argumentos de funções, valores retornados e estruturas são transmitidos por meio de cópia entre a memória do processo e a memória do ambiente isolado. Para grandes conjuntos de dados, a memória é alocada no ambiente isolado, enquanto um ponteiro direto 'sandbox-reference' é retornado ao processo principal.
Fonte: opennet.ru
