FlawOpen

flawopen.com/Teardowns/cve-2026-104286-fortimail-ibe-path-traversal

● CVE-2026-104286 · CVSS 9.8[7] · Crítica
Pesquisa · FlawOpen

CVE-2026-104286: path traversal no FortiMail IBE

CVE-2026-104286 permite que requisições HTTP(S) sem autenticação gravem arquivos em sistemas FortiMail vulneráveis por path traversal. A Fortinet relata exploração ativa; desative IBE ou restrinja o acesso web, investigue e atualize.[1], [5]

💡 Explicação em Linguagem Simples (ELI5)

Imagine uma sala de correspondência onde um funcionário arquiva anexos. A falha permite que uma solicitação indique uma pasta enganosa e grave um arquivo fora da área prevista. A mitigação fecha a entrada de IBE ou restringe quem acessa a interface web enquanto a equipe atualiza e verifica sinais de invasão.[1], [5]

Conceitos Centrais e Termos

Path traversal (CWE-22)
Componentes de caminho não confiáveis escapam da pasta destinada à operação. A Fortinet descreve gravação arbitrária de arquivos no FortiMail afetado.[1], [6]
Identity-Based Encryption (IBE)
Recurso do FortiMail para fluxos de mensagens criptografadas. A mitigação temporária do fornecedor é desativar IBE; avalie o impacto operacional.[1], [5]
CISA KEV
A CISA adicionou CVE-2026-104286 ao catálogo KEV em 1º de outubro de 2026. Isso confirma exploração conhecida, não invasão de um equipamento específico.[2], [5]
Divergência de versões
O resumo da Fortinet e avisos governamentais citam as linhas 7.2, 7.4, 7.6 e 8.0; os dados estruturados CNA também citam 7.0. Confirme 7.0 diretamente com a Fortinet.[6], [5], [4]

Mapeamentos de frameworks

Análise de Causa Raiz

A Fortinet descreve CVE-2026-104286 como uma falha de path traversal que permite gravar arquivos sem autenticação por requisições HTTP ou HTTPS. O firmware é fechado e o aviso público não fornece as linhas vulneráveis nem um diff do patch; este artigo não inventa esses detalhes. Os avisos governamentais confirmam o impacto de gravação arbitrária, a exploração e as orientações de versão, mas não descrevem o handler interno do FortiMail. O aviso da Fortinet é a fonte da medida temporária de desativar IBE ou restringir o acesso web, bem como dos IOCs publicados. Contenha e investigue o equipamento e depois instale a versão corrigida adequada; não encontrar IOC não prova segurança. A descrição em prosa do registro CVE lista 7.2.0–7.2.9, 7.4.0–7.4.8, 7.6.0–7.6.6 e 8.0.0–8.0.1. A tabela estruturada do mesmo registro informa limites superiores menores para 7.4 e 7.6 e também inclui 7.0.0–7.0.9, ao contrário dos resumos governamentais. A seção de soluções do registro lista versões futuras menores — 7.4.8, 7.6.6, 8.0.1 e 7.2.10 — em conflito com os próprios dados de versões afetadas e com o aviso canadense de 1º de outubro. Use esse aviso governamental datado como orientação operacional publicada e confirme com a Fortinet a disponibilidade atual e o escopo de 7.0; não deduza uma versão corrigida dos campos CNA conflitantes.[1], [3], [5], [4], [6], [7]

Matriz operacional: versões e resposta inicial

ÁreaO que dizem as fontes oficiaisAção defensiva
FortiMail 7.0Os dados do NVD/CNA listam 7.0.0–7.0.9; os resumos oficiais do Canadá e da França não listam a linha 7.0. O mesmo registro também diverge entre a descrição e a tabela nos limites superiores de 7.4 e 7.6. A seção de soluções também lista versões futuras menores (7.4.8, 7.6.6, 8.0.1 e 7.2.10), em conflito com os intervalos afetados e o aviso canadense.Peça confirmação à Fortinet; não conclua que uma linha omitida está segura.
FortiMail 7.2O aviso canadense recomenda atualizar para a linha 7.4 ou posterior.Planeje a migração para uma linha compatível corrigida; não presuma que existe correção para 7.2.
FortiMail 7.4 / 7.6 / 8.0O aviso canadense lista as correções nas versões 7.4.9, 7.6.7 e 8.0.2, respectivamente.Use o aviso canadense AV26-989 como orientação publicada de versão; confirme disponibilidade e suporte no aviso atual da Fortinet antes de atualizar. Não use os limites menores da seção CNA sem confirmação.
Contenção e investigaçãoA Fortinet relata exploração e publica indicadores de comprometimento; a medida temporária é desativar IBE ou restringir o acesso web.Preserve evidências, aplique a medida temporária, confira os indicadores do fornecedor, atualize e avalie possível comprometimento.

Fluxo de Ataque Passo a Paso

Passo 1

Uma requisição sem autenticação chega ao fluxo web

A Fortinet informa que requisições HTTP ou HTTPS especialmente formadas podem acionar a falha sem credenciais. O aviso não revela o handler interno nem a implementação exata.[1], [5], [4]

Passo 2

O caminho sai do limite previsto

O fornecedor classifica o problema como path traversal (CWE-22), permitindo gravar arquivos no FortiMail afetado. Não deduza um método específico de persistência apenas pela descrição do CVE.[1], [6], [5]

Passo 3

Arquivos gravados podem ampliar o impacto

A Fortinet atribui CVSS 3.1 9,8 Crítico e relata exploração ativa. Use os IOCs atuais do fornecedor para orientar a investigação.[1], [5], [4]

Passo 4

Mitigue, preserve evidências e atualize

Desative IBE ou restrinja o acesso web a redes confiáveis. Preserve logs e configurações, consulte os IOCs e instale a correção própria do ramo.[1], [5]

Código-Fonte: Vulnerável vs. Seguro

O firmware do FortiMail e o diff do patch do fornecedor não são públicos; este é um padrão genérico de defesa em Python, não código da Fortinet nem reprodução da falha. Ele abre uma vez um diretório confiável, usa um nome opaco gerado pelo servidor e cria um novo arquivo relativo ao descritor desse diretório, com criação exclusiva e flags que não seguem links. É específico de POSIX e falha de forma segura quando as flags necessárias não estão disponíveis. Para caminhos aninhados, percorra um componente validado por vez usando descritores de diretório; não verifique um caminho textual para depois reabri-lo pelo nome. Para corrigir a CVE-2026-104286, aplique a atualização ou a mitigação oficial da Fortinet. Todos os componentes do caminho raiz configurado, incluindo os diretórios pais, devem permanecer sob controle administrativo; O_NOFOLLOW protege apenas o componente final ao abrir essa raiz.

IMPLEMENTAÇÃO VULNERÁVEL
from pathlib import Path

def destination(root: Path, request_path: str) -> Path:
    # Exemplo do projeto inseguro: entrada da requisição
    # é juntada sem verificar se permanece na raiz permitida.
    return root / request_path
PATCH SEGURO E ROBUSTO
import os
import uuid

# Abra uma vez o diretório confiável do serviço; os diretórios pais do caminho devem ficar sob controle administrativo.

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)

# Não converta um caminho da requisição em caminho de arquivo; gere um nome opaco.
# O_EXCL falha se o nome já existir; O_NOFOLLOW rejeita um link simbólico 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

Lista de Verificação de Segurança para Engenharia

Fontes