Os compiladores geralmente são validados para garantir que não serão utilizados pela máquina do usuário ao compilar algum trecho de código inteligente?
Em geral, são muito complexos e geralmente são escritos usando linguagens nas quais não é prático provar essa propriedade.
Possivelmente não com essa intenção específica, mas a noção de compilador de teste de fuzz é pelo menos conhecida (o LLVM agora pode testar o próprio fuzz ). Testes destinados a capturar entradas que causam falhas no compilador devido a erros do compilador tendem a também apresentar falhas exploráveis.
Naturalmente, você teria que verificar se o compilador específico no qual você está interessado é testado ou fuzz para encontrar possíveis falhas e se os bugs encontrados são realmente corrigidos. A regra geral é que, se houver falhas piores do que as exceções não detectadas na memória, sem investigar mais os detalhes, você deverá considerar uma possibilidade séria de que elas poderiam ser aproveitadas em explorações.
Quão seguro é compilar um pedaço de código de um estranho?
Infelizmente, quanto tempo é um pedaço de corda. Em princípio, o email pode explorar seu cliente de email ou o código-fonte pode explorar seu editor de texto ou cppcheck, antes mesmo de chegar ao seu compilador. A sugestão de Sebastian nos comentários de usar um compilador on-line é muito boa, mas é claro que o código deve estar no formato que o compilador aceitará.
Qualquer linguagem ou compilador com recursos para execução de código geral em tempo de compilação é, obviamente, altamente suspeito. Os modelos C ++ são funcionalmente completos, mas não têm acesso (pretendido) ao sistema, portanto, são relativamente de baixo risco. BЈовић menciona make
um risco extremamente alto (já que ele está executando o código do estranho, é só que o código está escrito na make
linguagem, não em C ++). Se o compilador funcionar system
, você estará no mesmo barco. Eu costumava trabalhar com um assembler que, se bem me lembro, poderia executar arbitrariamente a execução de código em tempo de compilação. Ele era destinado à computação de tabelas de consulta, mas acho que nada o impediu de fazer chamadas do sistema.
Na prática , se o código parecer bom para mim e acho que o compreendo, consideraria um risco extremamente baixo compilá-lo, risco muito menor do que dizer "navegar na Internet com um navegador bloqueado". Eu faço coisas arriscadas rotineiramente na minha máquina de uso geral, mas muitas delas eu não faria, por exemplo, dentro de um laboratório de vírus ou em um servidor crítico. Se o código é engraçado ou evidentemente ofuscado, não posso arriscar compilá-lo porque, além do risco de conter uma exploração oculta no lixo ilegível, é um código de lixo. Código secreto é difícil, mas possível. O código secreto que envia a máquina por meio de uma exploração do compilador precisa conter uma carga executável não trivial, portanto, é extremamente difícil.
Se você quiser aprofundar isso, tente perguntar às pessoas que hospedam compiladores online. Se não tiver sido feito com eles (com a exceção de você chamar a atenção da NSA ou equivalente), você pode razoavelmente supor que não será feito com você. Eles se esforçam para executar o compilador em uma sandbox adequada, o que pode ser mais trabalhoso do que você deseja, mas eles podem pelo menos ser capazes de lhe dizer com que frequência essa sandbox evita problemas.