CVE-2022-33910

01 Juillet 2022

Je vous propose mon analyse de la CVE-2022-33910, qui est une vulnérabilité de type Cross-Site Scripting (XSS) dans l'application de suivi de bogues MantisBT.

Description

Les versions <2.25.5 de Mantis Bug Tracker sont vulnérables à une faille de Cross-Site Scripting via l'upload d'un fichier au format SVG en tant que pièce jointe d'un rapport ou d'une note d'anomalie.

Analyse de la vulnérabilité

Il est possible d'attacher le fichier SVG créé pour l'occasion en déclarant une nouvelle anomalie :

ou également dans une note/commentaire d'une anomalie :

Une fois le fichier malveillant ainsi uploadé, il faudra que la victime visualise le fichier SVG, qui s'ouvrira alors dans un nouvel onglet, provoquant ainsi l'exécution du code malicieux, ou presque :

En effet, un problème de CSP vient empêcher l'exécution du script inline :

A noter que l'attaque ne peut être réalisée directement à la visualisation de l'anomalie, car le fichier SVG est affiché grâce à une balise <img /> :

Code vulnérable

Par défaut, tous les types de fichiers peuvent être uploadés :

config_default_inc.php
/**
 * Files that are allowed or not allowed.  Separate items by commas.
 * eg. 'php,html,java,exe,pl'
 * if $g_allowed_files is filled in NO other file types will be allowed.
 * $g_disallowed_files takes precedence over $g_allowed_files
 * @global string $g_allowed_files
 */
$g_allowed_files = '';

/**
 *
 * @global string $g_disallowed_files
 */
$g_disallowed_files = '';

Les fichiers ainsi présents en tant que pièces jointes sont soit, consultés directement dans le navigateur (pour les formats jpeg, gif, tiff, bmp, svg+xml, png et pdf), soit téléchargés :

file_download.php
$t_show_inline = $f_show_inline;
$t_mime_force_inline = array( 'image/jpeg', 'image/gif', 'image/tiff', 'image/bmp', 'image/svg+xml', 'image/png', 'application/pdf' );

A priori donc, rien n'interdit d'uploader un fichier SVG malveillant et aucun traitement d'assainissement ne semble être effectué :

malicious.svg
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
   <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
     <script type="text/javascript">
    alert(document.domain)
  </script>
</svg>

En temps normal, la visualisation du fichier SVG devrait provoquer l'exécution du code Javascript mais c'est sans compter sur la configuration par défaut de MantisBT. La configuration propose un ensemble de directives CSP, dont celle concernant l'exécution de Javascript, ne permettant l'exécution de fichiers Javascript provenant seulement du même domaine (self) :

HTTP/1.1 200 OK
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'; frame-ancestors 'none'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' 'self' data:
Content-Disposition: filename*=UTF-8''xss.svg; filename="xss.svg"
X-Content-Type-Options: nosniff
CContent-Type: image/svg+xml; charset=us-ascii

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
   <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
     <script type="text/javascript">
    alert(document.cookie)
  </script>
</svg>

Cette configuration est appliquée par la méthode http_security_headers() présente dans le fichier core/http_api.php :

http_api.php
# Define Content Security Policy
http_csp_add( 'default-src', "'self'" );
http_csp_add( 'frame-ancestors', "'none'" );
http_csp_add( 'style-src', "'self'" );
http_csp_add( 'style-src', "'unsafe-inline'" );
http_csp_add( 'script-src', "'self'" );
http_csp_add( 'img-src', "'self'" );
http_csp_add( 'img-src', "'self' data:" );

Pour exploiter cette vulnérabilité il faudra donc ici espérer un relâchement de la configuration de MantisBT de la part de l'administrateur en charge du site, ou alors, identifier un moyen d'uploader un fichier javascript sur le serveur puis de l'exécuter via le fichier SVG.

Correction

La vulnérabilité a été corrigée dans la version 2.25.5 de MantisBT. Tout d'abord, la configuration par défaut évolue et interdit maintenant l'upload de fichier au format SVG :

config_defaults_inc.php
/**
 * Forbidden file types (blacklist).
 *
 * All file extensions in this list will be unauthorized.
 * Separate items by commas, e.g. 'php,html,java,exe,pl,svg'.
 *
 * SVG files are disabled by default, for security reasons. It is recommended to
 * also disable all extensions that can be executed by your server;
 *
 * @see $g_allowed_files
 * @global string $g_disallowed_files
 */
$g_disallowed_files = 'svg';

Dans un second temps, lorsqu'un utilisateur va ouvrir une pièce jointe de type SVG (dans le cas ou l'administrateur aura modifié la configuration par défaut), le fichier ne sera plus visualisé dans le navigateur mais un téléchargement forcé sera effectué :

file_download.php
$t_mime_force_attachment = array(
  'application/x-shockwave-flash',
  'image/svg+xml', # SVG could contain CSS or scripting, see #30384
  'text/html',
);

Cette dernière modification permet également de corriger une vulnérabilité de type Injection CSS au sein d'un fichier SVG.

Ressources

Dernière mise à jour