
Scripts de varredura automática e exploração remota para CVE-2020-1971 (OpenSSL NULL pointer dereference). Inclui código-fonte do OpenSSL 1.1.1i corrigido e scripts de instalação/atualização para Linux e Windows.
CVE-2020-1971 Script de varredura automática & exploração remota. Script de varredura local & correção automáticos.
17:03
Atualmente estou desenvolvendo os scripts e espero ter tudo pronto até esta noite. Por enquanto, este repositório contém apenas o código fonte corrigido do OpenSSL 1.1.1i. No momento, estou trabalhando em um script de correção de instalação/atualização.
17:50
Script de instalação para Linux Debian/Ubuntu enviado. Para instruções de instalação, veja "Instalação Linux"
18:40
O tipo X.509 GeneralName é um tipo genérico para representar diferentes tipos de nomes. Um desses tipos de nome é conhecido como EDIPartyName. O OpenSSL fornece uma função GENERAL_NAME_cmp que compara diferentes instâncias de GENERAL_NAME para verificar se são iguais ou não. Esta função se comporta incorretamente quando ambos os GENERAL_NAMEs contêm um EDIPARTYNAME. Uma desreferência de ponteiro NULL e uma falha podem ocorrer, levando a um possível ataque de negação de serviço.
O próprio OpenSSL usa a função GENERAL_NAME_cmp para dois propósitos
Comparar nomes de pontos de distribuição CRL entre uma CRL disponível e um ponto de distribuição CRL incorporado em um certificado X509
Ao verificar se o signatário do token de resposta de timestamp corresponde ao nome da autoridade de timestamp (exposto pelas funções da API TS_RESP_verify_response e TS_RESP_verify_token)
Se um invasor puder controlar ambos os itens sendo comparados, ele poderá provocar uma falha. Por exemplo, se o invasor enganar um cliente ou servidor para verificar um certificado malicioso contra uma CRL maliciosa, isso pode ocorrer.
Observe que alguns aplicativos baixam CRLs automaticamente com base em uma URL incorporada em um certificado. Essa verificação ocorre antes da verificação das assinaturas no certificado e na CRL. As ferramentas s_server, s_client e verify do OpenSSL suportam a opção "-crl_download" que implementa o download automático de CRL e este ataque foi demonstrado funcionar contra essas ferramentas.
Observe que um erro não relacionado significa que as versões afetadas do OpenSSL não podem analisar ou construir codificações corretas de EDIPARTYNAME. No entanto, é possível construir um EDIPARTYNAME malformado que o parser do OpenSSL aceitará e, assim, desencadear este ataque.
Todas as versões do OpenSSL 1.1.1 e 1.0.2 são afetadas por este problema. Outras versões do OpenSSL não são mais suportadas e não foram verificadas. Corrigido no OpenSSL 1.1.1i (Afetado 1.1.1-1.1.1h). Corrigido no OpenSSL 1.0.2x (Afetado 1.0.2-1.0.2w).
sudo chmod +x Linux_Patched_Install_From_Source_Script
Execute:
sudo ./Linux_Patched_Install_From_Source_Script
"OpenSSL nativo" usa as APIs do Windows diretamente em tempo de execução. Para construir um OpenSSL nativo, você pode usar:
Microsoft Visual C++ (MSVC) compilador C na linha de comando
ou
MinGW cross compiler executado no ambiente de desenvolvimento semelhante ao GNU MSYS2 ou executado no Linux ou Cygwin
"OpenSSL hospedado" depende de uma camada de compatibilidade POSIX externa para construção (usando shell, compilador e ferramentas GNU/Unix) e em tempo de execução. Para esta opção, você pode usar o Cygwin.
Além dos requisitos e instruções listados em INSTALL.md, estes também são necessários:
Perl. Strawberry Perl, disponível em http://strawberryperl.com/ Leia NOTES.PERL para mais informações, incluindo o uso do CPAN. Uma alternativa é o ActiveState Perl, https://www.activestate.com/ActivePerl para o qual você pode precisar construir explicitamente o módulo Perl Win32/Console.pm via https://platform.activestate.com/ActiveState e depois baixá-lo.
Compilador Microsoft Visual C.
Netwide Assembler (NASM), disponível em https://www.nasm.us Observe que o NASM é o único assembler suportado.
Instale o Perl
Instale o NASM
Certifique-se de que tanto o Perl quanto o NASM estão no seu %PATH%
Use o Prompt de Comando do Desenvolvedor do Visual Studio com privilégios administrativos, escolhendo uma de suas variantes dependendo da arquitetura pretendida. Ou execute "cmd" e execute "vcvarsall.bat" com uma das opções x86, x86_amd64, x86_arm, x86_arm64, amd64, amd64_x86, amd64_arm ou amd64_arm64. Isso configura as variáveis de ambiente necessárias para nmake.exe, cl.exe, etc. Veja também https://docs.microsoft.com/cpp/build/building-on-the-command-line
A partir da raiz do diretório fonte do OpenSSL, execute perl Configure VC-WIN32 se quiser OpenSSL 32 bits ou perl Configure VC-WIN64A se quiser OpenSSL 64 bits ou perl Configure para deixar o Configure descobrir a plataforma
nmake
nmake test
nmake install
Para instruções completas de instalação, ou se algo der errado em qualquer etapa, verifique o arquivo INSTALL.md.
Os diretórios de instalação padrão são derivados de variáveis de ambiente.
Para VC-WIN32, os seguintes padrões são usados:
PREFIX: %ProgramFiles(86)%\OpenSSL
OPENSSLDIR: %CommonProgramFiles(86)%\SSL
Para VC-WIN64, os seguintes padrões são usados:
PREFIX: %ProgramW6432%\OpenSSL
OPENSSLDIR: %CommonProgramW6432%\SSL
Se essas variáveis de ambiente não existirem (em uma instalação puramente Win32, por exemplo), esses fallbacks são usados:
PREFIX: %ProgramFiles%\OpenSSL
OPENSSLDIR: %CommonProgramFiles%\SSL
OBSERVE TAMBÉM que esses diretórios geralmente são protegidos contra gravação, mesmo que sua conta esteja no grupo Administradores. Para contornar isso, inicie o prompt de comando clicando com o botão direito e escolhendo "Executar como administrador" antes de executar 'nmake install'. A outra solução é, claro, escolher um conjunto diferente de diretórios usando --prefix e --openssldir ao configurar.
Os destinos UWP suportam apenas a construção das bibliotecas estáticas e dinâmicas.
Você deve definir o tipo de plataforma como "uwp" e a arquitetura alvo via "vcvarsall.bat" antes de compilar. Por exemplo, se quiser construir versões "arm64", execute "vcvarsall.bat x86_arm64 uwp".
As referências são fornecidas para conveniência do leitor, para ajudar a distinguir entre vulnerabilidades.