Uma técnica adicional para executar código arbitrário
Um pesquisador identificou mais um jeito de invocar funções aleatórias em JavaScript sem o uso de parênteses. A abordagem explora mecanismos internos do motor da linguagem para criar e executar código dinâmico, ampliando o repertório de técnicas já conhecidas.
O núcleo do método consiste em substituir a função prepareStackTrace do objeto Error. Essa função, normalmente responsável por formatar rastreamentos de pilha, é acionada quando o atributo stack de um erro é acessado. Ao reescrevê-la, o atacante pode gerar uma função JavaScript qualquer, desde que o segundo argumento forneça um código válido.
A função prepareStackTrace recebe dois parâmetros: o objeto de erro e uma representação estruturada da pilha, que é apenas um array contendo as posições do código. A estrutura se assemelha à do construtor Function, utilizado para criar funções em JavaScript. O segredo está em fazer com que esse segundo parâmetro contenha o código desejado.
Controlando a representação em forma de array
Para que a técnica funcione, é necessário manipular a saída de Array.prototype.toString() de modo que ele retorne o payload JavaScript. Há duas maneiras comuns de realizar isso.
A primeira consiste em substituir diretamente o método por uma função constante que devolva a string de código alvo. A segunda opção explora a poluição de protótipos para injetar o payload em outra função e, em seguida, sobrescrever o prototype do Array. O autor demonstra que é possível permanecer no escopo do Error e usar sua função toString, alterada ao poluir a propriedade message do Object.prototype.
Após gerar a função e garantir que o array produza a sequência correta, o passo final é invocar a nova função. O pesquisador escolheu o truque valueOf, que sobrescreve o método valueOf de um objeto e o chama como um primitivo. Alternativamente, é possível usar toString e concatenar o objeto com uma string para alcançar o mesmo efeito.
O payload completo, pronto para testes em qualquer console de navegador, demonstra a viabilidade do ataque e convida a comunidade a explorar novas variantes.
Com informações de: Hacker News (Y Combinator)