Descripción técnica del CVE-2021-32664
Introducción
Este artículo va enfocado en describir de manera técnica el descubrimiento del CVE-2021-32664, el cuál consiste en un cross-site scripting que es detonado con un cuenta de administrador dentro del aplicativo iTop.
¿Qué es ITop?
Es un herramienta que es desarrollada por Combodo, su objetivo es ayudar a la administración de recursos de TI apegado a ITIL.
La herramienta es un proyecto Open Source, puede ser usado por cualquier organización y cualquiera puede tener acceso al código fuente mediante su repositorio de código alojado en Github.
Haciendo una búsqueda en Shodan encontré que es una herramienta muy utilizada por varias empresas de telecomunicaciones y gobiernos de varios países.

¿Cómo se encontró la vulnerabilidad?
Por lo general cuando se tienen aplicaciones desarrolladas en lenguaje PHP se buscan concatenaciones dentro de las cadenas que puedan desencadenar en vulnerabilidades como cross-site scripting y/o inyecciones SQL.
En este caso encontré una linea de código interesante que probablemente pudiera ser vulnerable.

Después de hacer pruebas sobre ese código no se consiguió inyectar de alguna forma código HTML y/o Javascript, pero lo importante de
la función utils.ReadParam('transaction _id', '', false, 'transaction_id) es que maneja varias rutinas de sanitización de
los paramteros que se obtienen de la variable $_REQUEST, como se muestra en la siguiente imagen.

Siguiendo el flujo de la función ReadParam se encuentra la función Sanitize la cual invoca a una función más llamada Sanitize_Internal.

La función Sanitize_Internal tiene el código que ayuda a sanitizar las variables el cual esta contenido en un switch que depende
del modo en que el desarrollador lo mande invocar.
Se tiene 9 tipos de sanitización como se muestra en la siguiente imagen:

Cabe destacar que el modo de sanitización que posiblemente pudiera desembocar en vulnerabilidades es el de raw_data ya que no hace ningún tipo de sanitización.
Teniendo esto en cuenta este punto se procedió a buscar en el código una función que se asemeje a esta:
utils::ReadParam('','',false, 'raw_data')
Se encuentra el siguiente código en el archivo run_query.php.

- Tenemos el nombre del archivo run_query.php
- Tenemos 2 parametros: expression y encoding.
- Tenemos una validación sobre la variable
$sEncoding == 'crypted' - Tenemos un código el cual hace acciones de desencodeo y concatenación al código HTML.
Lo que hace el código vulnerable es obtener la variable $sExpression y $sEncoding de las variables de la petición web, en este caso de la variable $_REQUEST la cual nos da la ventaja que las variables pueden tener origen en $_GET o $_POST o $_COOKIE según dice la documentación de PHP link
También se observa que la variable $sExpression no tiene ningún tipo de sanitización ya que tiene definido raw_data y la variable
$sEncoding tiene por default el valor oql, en caso de no venir en la petición.
Ahora bien si observamos lineas mas adelante, se hace una validación sobre la variable $sEncoding == 'crypted' lo cual nos dirige a un bloque de código en el cual la variable $sExpression es desencodeada y posteriormente concatenada al texto html.
Viendo este código PHP hay una posibilidad grande de que exista una vulnerabilidad de cross-site scripting.
Generando la prueba de concepto.
Para poder acceder a /itop/web/pages/run_query.php se requiere tener credenciales de administrador por lo cual esta vulnerabilidad en caso de ser explotada correctamente afectaría a usuarios con privilegios altos dentro del aplicativo.
Se usa el siguiente polyglot de XSS
jaVasCript:/*-/*`/*\`/*'/*"/**/(/**/oNcliCk=eval(atob(`YWxlcnQoIlRFU1RJTkcgMSwyLDMiKQo=`)))//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=eval(atob(`YWxlcnQoIlRFU1RJTkcgMSwyLDMiKQo=`)) //>\x3e
Posteriormente se construye el la petición web.
/itop/web/pages/run_query.php?c[menu]=RunQueriesMenu&encoding=crypted&expression=amFWYXNDcmlwdDovKi0vKmAvKlxgLyonLyoiLyoqLygvKiAqL29OY2xpQ2s9ZXZhbChhdG9iKGBZV3hsY25Rb0lsUkZVMVJKVGtjZ01Td3lMRE1pS1FvPWApKSkvLyUwRCUwQSUwZCUwYS8vPC9zdFlsZS88L3RpdExlLzwvdGVYdGFyRWEvPC9zY1JpcHQvLS0hPlx4M2NzVmcvPHNWZy9vTmxvQWQ9ZXZhbChhdG9iKGBZV3hsY25Rb0lsUkZVMVJKVGtjZ01Td3lMRE1pS1FvPWApKSAvLz5ceDNl
Dentro de la cual estamos indicando la variable encoding con el valor crypted y en la variable expression se pone el polyglot de Javascript encodeado en base64.
Se prueba este link en el navegador y obtenemos la siguiente respuesta exitosa.

Procesos de reporte de la vulnerabilidad.
Dentro del repositorio de código de la herramienta existe un parte en la cual Combodo indica como hacer este tipo de reporte link.
Cronología.
9 mayo 2021 - Se envió el correo electrónico con las prueba de concepto de la vulnerabilidad.
10 mayo 2021 - El equipo de Combodo se comunica conmigo para validar la reproducción de la vulnerabilidad.
12 julio 2021 - Me avisan que la vulnerabilidad va ser compuesta en el release del 21 Julio 2021 en la version 2.7.5 y el CVE-2021-32664 será publicado a finales del mes de septiembre del 2021.
21 julio 2021 - Se publica el changelog de la nueva version, y el advisory dentro del repositorio de github de iTop a finales del mes de septiembre.