No QCon New York 2019, Kate Sills, engenheira de software da Agoric, discutiu alguns dos desafios de segurança na construção de componentes de contratos inteligentes compostos com JavaScript. Duas propostas emergentes da TC39 JavaScript, realms e Secure ECMAScript (SES), foram apresentadas como soluções para riscos de segurança com o processo de instalação do npm.
Hoje, ao executar o comando npm install, um módulo e todas as suas dependências têm acesso a muitas operações nativas, incluindo sistema de arquivos e acesso à rede. O principal risco de segurança é que uma dependência não confiavél de um módulo confiável poderia ser comprometida e substituída pela lógica destinada a acessar informações privadas em uma máquina local, como uma carteira criptografada, e então carregar essas informações para um servidor remoto por meio de uma conexão HTTP.
O TC39, o comitê técnico responsável por versões futuras do padrão JavaScript, tem duas propostas que estão atualmente no estágio 2 de sua aprovação. O primeiro, realms, torna fácil isolar o código-fonte, restringindo o acesso a compartimentos nos quais o código reside. A proposta do realms resolve o problema de limitar o acesso a um sandbox, restringindo o acesso a si mesmo, a busca e a outras APIs fora do sandbox. O realms têm muitos casos de uso em potencial, além do isolamento de segurança, incluindo plugins, editores de código no navegador, renderização no lado servidor, teste/mocks e transpilação no navegador. O projeto realms shim está disponível para alavancar o atual projeto de proposta de realms hoje.
Outro potencial vetor de ataque é o prototype poisoning, onde o protótipo de um objeto é alterado inesperadamente. A proposta para combater este vetor de ataque é o Secure ECMAScript (SES), atualmente no estágio 1 do processo de aprovação do TC39, que combina o Realms com o congelamento transitivo. O npm install SES fornece acesso ao SES shim.
Realms e SES bloqueiam com sucesso o JavaScript, mas muitos aplicativos precisam acessar APIs como o sistema de arquivos e a rede. Durante a palestra de Sills, ela destacou o princípio da menor autoridade para conceder apenas o que é necessário e nada mais.
Sills forneceu um exemplo de linha de comando de um aplicativo que depende de uma dependência comum no ecossistema JavaScript, para modificar o estilo do console. Este módulo requer acesso a um objeto do sistema operacional, mas apenas para solucionar uma falha de cor encontrada em sistemas operacionais específicos. Com o SES, é possível atenuar o acesso para restringir a disponibilidade da dependência para acessar apenas os recursos no objeto, os necessários para corrigir o problema de cor.
Durante a apresentação, Sills também destacou o Moddable XS, que tem suporte total para o ES2018, bem como suporte para SES, possibilitando que os usuários instalem aplicativos em dispositivos IoT com segurança. Outros exemplos de implementações atuais do SES incluem uma carteira Ethereum com todas as dependências em um ambiente SES e o dispositivo de bloqueio do Salesforce.
O SES e o Realms têm um futuro promissor, mas atualmente existem algumas limitações, desafios de desempenho e ergonomia do desenvolvedor (por exemplo, os módulos precisam ser convertidos em string) para serem resolvidos antes que essas propostas se tornem uma parte oficial da linguagem JavaScript.