Online compiladores e repls - não é um grande buraco de segurança?

5

Existem muitos compiladores e serviços REPL na web. Por exemplo: Fay ide .

Acho que implementar alguma tecnologia similar seria muito interessante. Mas parece uma grande falha de segurança. Estou errado em pensar que expor um compilador seria arriscado? Um intérprete parece ainda pior.

update: Eu posso ser um pouco mais específico. O tipo de serviço em que estou pensando em me hospedar (um experimento de pensamento nesta fase) seria mais ou menos próximo do caso do ide Fay acima. Você recebe informações do usuário, processa-as e as devolve, potencialmente como javascript executável para o mesmo ou para outros usuários. Vamos ver esse exemplo em particular.

A preocupação de segurança mais óbvia que vejo nesse caso, como eu não avalio o lado do servidor de código, seria para os usuários, pois eles executariam código feito por um autor 'desconhecido'. O fato de que eles têm permissão para ler o código antes de executá-lo deve ser uma salvaguarda significativa a esse respeito.

Embora eu também me pergunto se e quando a tradução de código constitui uma ameaça para o servidor? Que tipo de vetores de exploração poderiam ser pensados neste contexto?

Resumo:

  1. Além do que você pode esperar de qualquer servidor da Web configurado e além das preocupações mais óbvias (ou talvez algumas dessas preocupações óbvias também), como um usuário poderia comprometer o outro? -. Como o aplicativo do servidor pode ser fortalecido para garantir que não seja comprometido?
  2. Que questões importantes eu negligenciei? ;)
  3. Eu gostaria de experimentar alguns experimentos, e eu tenho quase metade da fala em mente como host. Eu poderia imaginar que tal uso poderia ser proibido por seus termos de uso? Ou talvez eu possa confiar neles para ter certeza de que eles já colocaram o sandbox na minha conta bem o suficiente. Quais deveriam ser as minhas salvaguardas "mínimas", para testar as coisas e que salvaguardas seriam possíveis com um ambiente de hospedagem tão limitado?

update2: Acredito que a compilação para javascript para avaliação do lado do cliente ou a avaliação de edsls limitados cobriria a maioria dos casos de uso que tenho em mente. Eu entendo que isso significa que eu realmente não coloco o lado do servidor em um risco mais proeminente do que usual . E eu não vejo como o usuário está sendo colocado em mais risco do que ir a um link aleatório no jsFiddle.

    
por worldsayshi 28.01.2013 / 17:43
fonte

1 resposta

7

Se tudo o que você está fazendo é compilar código (pegar o código do usuário e transformá-lo sem executá-lo), não é diferente de proteger qualquer outro programa online. Você tem um programa (um compilador) que recebe uma entrada de usuário potencialmente não confiável (o código do usuário) e faz algo com ele, e você precisa ter certeza de que ele não fará nada que não deveria, mesmo quando receber uma entrada maliciosa. Para um compilador, muitos dos riscos de segurança da Web padrão (injeção de SQL, CSRF) realmente não se aplicam, mas você precisaria verificar riscos como estes:

  • Para recursos de idioma como o #include do C, faça Certifique-se de não permitir a inclusão de arquivos fora dos arquivos de biblioteca padrão.
  • Algumas linguagens podem ter CPU ou memória arbitrariamente grande para compilar (graças a recursos como os modelos Turing-complete do C ++, então você precisa se proteger contra a negação de serviço. No entanto, os sistemas operacionais e servidores da web há muito tempo têm recursos para encerrar processos que demoram muito ou crescem demais.

Se você estiver interpretando e executando o código do usuário, a segurança exigirá a execução do código do usuário em um sandbox de algum tipo. Por exemplo, se você desabilitar todas as chamadas de biblioteca que envolvem E / S de arquivo ou rede e chamadas de sistema operacional semelhantes, e se você tiver os limites acima mencionados em CPU e memória, então, em teoria, o código de usuário não pode fazer nada ruim. Na prática, isso pode ser muito complicado para acertar. Por exemplo, o Python permite que você execute código facilmente com globais restritos (para restringir o módulo os ), mas os recursos de linguagem e introspecção incorporados ainda fornecem funcionalidade suficiente para sair da área restrita. (Veja aqui .)

Outra abordagem para proteger um intérprete on-line ou REPL é executar tudo do lado do cliente (usando JavaScript e, possivelmente, ferramentas como Emscripten Se o código do usuário for executado na máquina do usuário, então o código do usuário mal-intencionado não é realmente o seu problema.

Atualização: Como aponta @JimmyHoffa, outra abordagem é usar o software OS ou VM para fornecer uma caixa de proteção mais completa do que a linguagem de programação foi projetada para fazê-lo. Para ver exemplos disso, consulte o sandbox do Chromium para Windows ou várias opções do Linux .

    
por 28.01.2013 / 18:29
fonte