# CVE-2022-33910

> 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

* **Vendeur :** MantisBT (<https://www.mantisbt.org/>)
* **Produit :** MantisBT (<https://www.mantisbt.org/download.php>)
* **Version(s) impactée(s) :** < 2.25.5
* **Type de vulnérabilité :** Stored Cross-Site Scripting (XSS) ([CWE-79 - Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')](https://cwe.mitre.org/data/definitions/79.html))

Les versions <2.25.5 de Mantis Bug Tracker sont vulnérables à une faille de type 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.

![](/files/i8CHuP7Pdv5fsI6AZFFW)

## Analyse de la vulnérabilité

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

![](/files/PG0hTegHgxkZu6MbxCel)

ou également dans une note/commentaire d'une anomalie :&#x20;

![](/files/RwVmL2QYo8S7YRzWIAsO)

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 :

![](/files/zlEBn61WoAZ8S5Qyo66X)

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

![](/files/oXQS406i7X1G6Cdvo93g)

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 />` :&#x20;

![](/files/LDxNHAfqISSQHjp5XG0l)

## Code vulnérable

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

{% code title="config\_default\_inc.php" %}

```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 = '';
```

{% endcode %}

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 :&#x20;

{% code title="file\_download.php" %}

```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' );
```

{% endcode %}

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

{% code title="malicious.svg" %}

```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>
```

{% endcode %}

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`) :&#x20;

```http
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` :&#x20;

{% code title="http\_api.php" %}

```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:" );
```

{% endcode %}

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 :&#x20;

{% code title="config\_defaults\_inc.php" %}

```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';
```

{% endcode %}

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é :&#x20;

{% code title="file\_download.php" %}

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

{% endcode %}

{% hint style="info" %}
Cette dernière modification permet également de corriger une vulnérabilité de type Injection CSS au sein d'un fichier SVG.
{% endhint %}

## Ressources

* <https://github.com/mantisbt/mantisbt/commits/release-2.25.5>
* <https://mantisbt.org/bugs/view.php?id=29135>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sharpforce.gitbook.io/cybersecurity/cve/2022/cve-2022-33910.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
