flawopen.com/Teardowns/cve-2026-104286-fortimail-ibe-path-traversal
CVE-2026-104286 : path traversal FortiMail IBE
CVE-2026-104286 permet à des requêtes HTTP(S) non authentifiées d’écrire des fichiers sur FortiMail par traversal de chemin. Fortinet signale une exploitation active ; désactivez IBE ou limitez l’accès web, enquêtez et mettez à jour.[1], [5]
Imaginez un local courrier où un employé classe les pièces jointes. La faille permet à une requête de lui fournir un chemin trompeur et d’écrire hors de la zone prévue. La mesure d’urgence ferme l’accès IBE ou limite l’accès à l’interface web pendant la mise à jour et la recherche d’une compromission antérieure.[1], [5]
Concepts Clés et Termes
Path traversal (CWE-22)- Des composants de chemin non fiables sortent du répertoire prévu. Fortinet décrit l’écriture arbitraire de fichiers sur les systèmes FortiMail concernés.[1], [6]
Identity-Based Encryption (IBE)- Fonction FortiMail utilisée pour le chiffrement des messages. La mesure temporaire du fournisseur consiste à désactiver IBE ; évaluez son impact métier.[1], [5]
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-22
- CISA KEV — ajouté le 2026-10-01 — CVE-2026-104286
Analyse de Cause Racine
Fortinet décrit CVE-2026-104286 comme une traversal de chemin permettant à des requêtes HTTP ou HTTPS sans authentification d’écrire des fichiers. Le firmware est fermé et l’avis public ne fournit ni lignes vulnérables ni diff du correctif ; cet article ne les invente pas. Les avis officiels confirment l’écriture arbitraire, l’exploitation et les indications de versions, mais ne décrivent pas le gestionnaire interne de FortiMail. L’avis Fortinet est la source de la mesure provisoire consistant à désactiver IBE ou limiter l’accès web, ainsi que des IOC publiés. Contenez et examinez l’appareil, puis installez la version corrigée adaptée ; l’absence d’IOC ne prouve pas l’absence de compromission. La description en prose de la fiche CVE indique 7.2.0–7.2.9, 7.4.0–7.4.8, 7.6.0–7.6.6 et 8.0.0–8.0.1. Son tableau structuré donne des bornes supérieures plus basses pour 7.4 et 7.6 et inclut aussi 7.0.0–7.0.9. Sa section des solutions mentionne des versions futures plus basses — 7.4.8, 7.6.6, 8.0.1 et 7.2.10 — en contradiction avec ses propres données et l’avis canadien du 1er octobre. Utilisez cet avis officiel daté comme consigne opérationnelle publiée et confirmez auprès de Fortinet la disponibilité actuelle et le périmètre de 7.0 ; ne déduisez pas la version corrigée des champs CNA contradictoires.[1], [3], [5], [4], [6], [7]
Matrice opérateur : versions et première réponse
| Domaine | Ce que disent les sources officielles | Action défensive |
|---|---|---|
| FortiMail 7.0 | Les données NVD/CNA indiquent les versions 7.0.0 à 7.0.9 ; les synthèses officielles du Canada et de la France ne citent pas la branche 7.0. La description et le tableau de cette même fiche divergent aussi sur les bornes supérieures de 7.4 et 7.6. La section des solutions cite aussi des versions futures plus basses (7.4.8, 7.6.6, 8.0.1 et 7.2.10), en contradiction avec les plages touchées et l’avis canadien. | Demandez confirmation à Fortinet ; ne déduisez pas qu’une branche omise est sûre. |
| FortiMail 7.2 | L’avis canadien recommande de passer à la branche 7.4 ou ultérieure. | Planifiez la migration vers une branche prise en charge et corrigée ; ne supposez pas qu’un correctif 7.2 existe. |
| FortiMail 7.4 / 7.6 / 8.0 | L’avis canadien indique les versions corrigées 7.4.9, 7.6.7 et 8.0.2, respectivement. | Utilisez l’avis canadien AV26-989 comme indication publiée de versions ; vérifiez disponibilité et prise en charge dans l’avis Fortinet actuel avant la mise à jour. Ne retenez pas les seuils CNA inférieurs sans confirmation. |
| Endiguement et investigation | Fortinet signale une exploitation et publie des indicateurs de compromission ; sa mesure provisoire consiste à désactiver IBE ou limiter l’accès web. | Préservez les preuves, appliquez la mesure provisoire, examinez les indicateurs du fournisseur, corrigez puis évaluez une éventuelle compromission. |
Déroulement de l'Attaque Étape par Étape
Code Source : Vulnérable vs Sécurisé
Le firmware FortiMail et le diff du correctif du fournisseur ne sont pas publics ; il s’agit d’un modèle générique de défense en Python, pas du code Fortinet ni d’une reproduction. Il ouvre une fois un répertoire de confiance, utilise un nom opaque généré par le serveur et crée un nouveau fichier relatif au descripteur de ce répertoire avec création exclusive et options sans suivi de lien. Ce modèle est spécifique à POSIX et échoue de manière sûre si les options requises manquent. Pour les chemins imbriqués, parcourir un composant validé à la fois avec des descripteurs de répertoire ; ne pas vérifier un chemin textuel puis le rouvrir par son nom. Appliquer la mise à jour ou la mesure temporaire officielle de Fortinet pour corriger CVE-2026-104286. Tous les composants du chemin racine configuré, y compris ses répertoires parents, doivent rester sous contrôle administratif ; O_NOFOLLOW ne protège que le composant final lors de son ouverture.
from pathlib import Path
def destination(root: Path, request_path: str) -> Path:
# Schéma illustratif à risque : l'entrée est jointe
# sans vérifier qu'elle reste sous la racine autorisée.
return root / request_path
import os
import uuid
# Ouvrir une fois le répertoire de confiance du service ; ses parents doivent rester sous contrôle administratif.
def open_upload_root(root):
required = ("O_DIRECTORY", "O_NOFOLLOW")
if not all(hasattr(os, flag) for flag in required) or os.open not in os.supports_dir_fd:
raise RuntimeError("POSIX directory protections unavailable")
flags = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW
return os.open(root, flags)
# Ne pas convertir un chemin de requête en chemin de fichier ; générer un nom opaque.
# O_EXCL échoue si le nom existe ; O_NOFOLLOW rejette un lien symbolique final.
ROOT_FD = open_upload_root("/srv/app-private/uploads")
def create_upload_file():
name = uuid.uuid4().hex
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW
fd = os.open(name, flags, 0o600, dir_fd=ROOT_FD)
return name, fd
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Inventoriez les appareils et versions FortiMail. Les résumés Fortinet/officiels omettent 7.0, mais les données CNA citent 7.0.0–7.0.9 ; faites confirmer cette branche par Fortinet.[1], [5], [6]
- ✓Appliquez immédiatement la mesure fournisseur : désactivez IBE ou retirez l’accès public à l’interface web et limitez-la aux réseaux privés de confiance. Évaluez l’impact d’IBE avec les équipes messagerie.[1]
- ✓Préservez journaux, sauvegardes de configuration et éléments forensiques avant redémarrage ou mise à jour. Consultez les IOC actuels de FG-IR-26-175 et enquêtez sur toute correspondance.[1], [4]
- ✓Utilisez l’avis canadien AV26-989 comme indication publiée de versions ; vérifiez disponibilité et prise en charge dans l’avis Fortinet actuel avant la mise à jour. Ne retenez pas les seuils CNA inférieurs sans confirmation.[5], [1], [7]
- ✓Séparez mise à jour et recherche de compromission. Une version corrigée ne supprime pas les fichiers, identifiants ou mécanismes de persistance déjà déposés ; suivez les procédures d’incident si des signaux apparaissent.
- ✓Dans vos propres gestionnaires, vérifiez le chemin canonique sous une racine autorisée après un décodage strict unique, rejetez NUL et encodages invalides et ouvrez relativement à un répertoire de confiance.