
Avast JavaScript Shell Interativo
NOTA: Em 03/11/2020 a Avast anunciou que havia decidido desabilitar este interpretador globalmente!
O processo principal do antivírus Avast é chamado AvastSvc.exe, que é executado como SYSTEM.

Esse serviço carrega o mecanismo de antivírus de baixo nível e analisa dados não confiáveis recebidos de fontes como o minifilter do sistema de arquivos ou tráfego de rede interceptado.
Apesar de ser altamente privilegiado e processar entradas não confiáveis por design, ele não está em sandbox e tem cobertura de mitigação fraca. Quaisquer vulnerabilidades neste processo são críticas e facilmente acessíveis a atacantes remotos.
Então... talvez não seja bom que ele inclua um interpretador JavaScript personalizado....???? 🙃

Este repositório contém um shell interativo que permite testar o interpretador no Linux para pesquisa de vulnerabilidades.
Aqui está como experimentar, primeiro instale as dependências.
$ sudo apt install libreadline-dev:i386 libc6-dev-i386 gcc-multilib
$ sudo yum install readline-devel.i686 glibc-devel.i686 libgcc.i686
Agora você pode clonar este repositório.
$ git clone https://github.com/taviso/avscript.git
$ cd avscript
$ git submodule update --init --recursive
Se tudo parecer correto, compile-o e avscript deve estar pronto.
$ make
Por motivos de desempenho, a Avast não interpreta todos os arquivos JavaScript que encontra, eles usam uma heurística para determinar se é necessário. Descobri que anexar o arquivo javascript.txt incluído neste repositório é suficiente para sempre acionar a heurística.
Por exemplo, se você encontrou uma vulnerabilidade e deseja reproduzi-la no Windows, você faria primeiro o seguinte:
$ cat yourtestcase.js javascript.txt > ReproForWindows.js
Agora verifique se ele ainda faz o que você espera, por exemplo:
$ ./avscript ReproForWindows.js
main(): File ReproForWindows.js` loaded, about to initialize interpreter...
Segmentation fault (core dumped)
Em seguida, verifique se o crash foi reproduzido no Windows.
O serviço Avast é um processo protegido, o que significa que depurá-lo a partir do espaço do usuário é complicado. Se você tiver o kd configurado, pode simplesmente desfazer isso e então a depuração no espaço do usuário funciona perfeitamente.
Uma solução rápida e fácil que funciona em 32 bits é fazer isso (note que o PatchGuard não permitirá isso em x64, mas você pode fazer algo semelhante com comandos de breakpoint).

Há também uma configuração em "Solução de problemas" chamada "Ativar Autodefesa" que deve ser desativada. Acredito que essa configuração desabilita o hooking de OpenProcess() no SSDT, onde eles normalmente colocam seu próprio processo na lista negra.
Talvez seja necessário desativar temporariamente os "escudos" na interface do Avast enquanto você anexa, para que as operações do sistema de arquivos não entrem em deadlock enquanto o serviço estiver suspenso.
A Avast não publica símbolos para seu mecanismo, mas ainda é possível depurar com IDA ou gdb. Existem algumas notas sobre depuração de código do Windows a partir do Linux na documentação do loadlibrary.
Se você quiser usar o IDA, recomendo usar o backend gdbserver.
Basta usar algo como isto, talvez seja necessário instalar o pacote gdbserver primeiro:
$ gdbserver 0.0.0.0:23946 ./avscript
Isso funciona surpreendentemente bem, até breakpoints de pseudocódigo funcionam.

Se você encontrar uma vulnerabilidade, ela provavelmente é crítica e propagável.
🔥 Por favor, reporte-a com urgência. 🔥