
PoC de vulnerabilidade de bypass de segurança do Apache Tomcat

Recentemente, a Apache divulgou um aviso de segurança informando que várias versões do Apache Tomcat 7, 8 e 9 apresentam uma vulnerabilidade de bypass de segurança. Um atacante pode explorar esse problema para contornar certas restrições de segurança e executar operações não autorizadas, o que pode facilitar ataques adicionais.
As restrições de segurança definidas por anotações de servlet do Apache Tomcat são aplicadas apenas uma vez, depois que o servlet é carregado. Como as restrições de segurança definidas dessa forma são aplicadas ao padrão de URL e a qualquer URL sob esse ponto, é provável que dependam da ordem de carregamento dos servlets, o que pode expor recursos a usuários não autorizados a acessá-los.
CVE-2018-1305
Apache Tomcat < 9.0.5
Apache Tomcat < 8.5.28
Apache Tomcat < 8.0.50
Apache Tomcat < 7.0.85
Médio
O Java EE fornece a anotação ServletSecurity, semelhante a uma verificação de permissão ACL, que pode ser usada para decorar um servlet e protegê-lo. Se houver dois servlets, Servlet1, com caminho de acesso "/servlet1/" e anotação ServletSecurity adicionada, e Servlet2, com caminho de acesso "/servlet1/servlet2/" mas sem anotação ServletSecurity, ao acessar pela primeira vez servlet1/servlet2, a anotação ServletSecurity do servlet1 não terá efeito e não será capaz de proteger o caminho "/servlet1/servlet2", o que pode resultar em acesso não autorizado.
Se "/servlet1" for acessado antes de "/servlet1/servlet2", o Tomcat carregará a ACL e iniciará a proteção de "/servlet1/servlet2", e a vulnerabilidade não será acionada.

Adicione a anotação ServletSecurity ao Servlet1; o Servlet2 não possui essa anotação.

Após modificar o url-pattern correspondente ao servlet no arquivo web.xml, conforme mostrado na figura abaixo.

Execute o projeto. Ao acessar a URL do servlet2 pela primeira vez, é possível ver que o acesso não autorizado é permitido; a ACL do servlet1 não foi aplicada.
http://localhost:8080/CVE-2018-1305/servlet1/servlet2/

Na segunda vez, ao acessar a URL do servlet1, o acesso é negado; neste momento, a ACL está em vigor.
http://localhost:8080/CVE-2018-1305/servlet1/

Ao acessar novamente a URL do servlet2, o acesso é negado. Para que a ACL se aplique ao servlet2, é necessário que o servlet1 tenha sido acessado anteriormente.
http://localhost:8080/CVE-2018-1305/servlet1/servlet2/


Portanto, a reprodução da vulnerabilidade só é possível se, após a inicialização do Tomcat, a página "/servlet1/servlet2/" for acessada antes de "/servlet1/". Se alguém já tiver acessado a página "/servlet1/*" anteriormente, a vulnerabilidade não será acionada. A vulnerabilidade apresenta um alto nível de dano, porém as condições de exploração são difíceis, portanto o seu impacto não é muito amplo.
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1305