
Poc de vulnerabilidad de omisión de seguridad en Apache Tomcat

Recientemente, Apache publicó un aviso de seguridad en el que afirmaba que varias versiones de Apache Tomcat 7, 8 y 9 contienen una vulnerabilidad de bypass de seguridad. Un atacante podría aprovechar este problema para eludir ciertas restricciones de seguridad y realizar operaciones no autorizadas, lo que podría facilitar ataques posteriores.
Las restricciones de seguridad definidas por las anotaciones de servlet en Apache Tomcat solo se aplican una vez después de que se carga el servlet. Debido a que las restricciones de seguridad definidas de este modo se aplican a los patrones de URL y a cualquier URL bajo ese punto, es muy probable que dependan del orden de carga de los servlets, lo que podría exponer los recursos a usuarios no autorizados.
CVE-2018-1305
Apache Tomcat < 9.0.5
Apache Tomcat < 8.5.28
Apache Tomcat < 8.0.50
Apache Tomcat < 7.0.85
Medio
Java EE proporciona la anotación ServletSecurity, similar a la verificación de permisos ACL, que puede utilizarse para decorar servlets y protegerlos. Si hay dos servlets, Servlet1, con ruta de acceso "/servlet1/" pero sin anotación ServletSecurity, al acceder por primera vez a servlet1/servlet2, la anotación ServletSecurity de servlet1 no surte efecto y no puede proteger la ruta "/servlet1/servlet2", lo que podría provocar acceso no autorizado.
Si se ha accedido previamente a "/servlet1" antes de acceder a "/servlet1/servlet2", Tomcat cargará la ACL y activará la protección de "/servlet1/servlet2", por lo que la vulnerabilidad no se activará.

Agregue la anotación ServletSecurity a Servlet1; Servlet2 no tiene esta anotación.

Modifique el url-pattern correspondiente al servlet en el archivo web.xml como se muestra en la siguiente figura.

Ejecute el proyecto. Al acceder por primera vez a la URL de servlet2, se descubre que se puede acceder sin autorización; la ACL para servlet1 no ha surtido efecto.

Al acceder por segunda vez a la URL de servlet1, el acceso está prohibido; en este momento la ACL está activa.

Al acceder nuevamente a la URL de servlet2, se observa que el acceso está prohibido. Para que la ACL tenga efecto sobre servlet2, debe cumplirse la premisa de que se haya accedido previamente a servlet1.


Por lo tanto, la reproducción de la vulnerabilidad se limita a que, después de iniciar Tomcat, se haya accedido primero a la página "/servlet1/servlet2/" antes de acceder a "/servlet1/". Si alguien ya ha accedido a la página "/servlet1/*" antes, la vulnerabilidad no se activará. El impacto de la vulnerabilidad es alto, pero las condiciones de explotación son difíciles, por lo que su alcance no es amplio.