flawopen.com/Teardowns/cve-2026-104286-fortimail-ibe-path-traversal
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]
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]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-22
- CISA KEV — adicionado em 2026-10-01 — CVE-2026-104286
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
| Área | O que dizem as fontes oficiais | Ação defensiva |
|---|---|---|
| FortiMail 7.0 | Os 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.2 | O 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.0 | O 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ção | A 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
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.
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
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
- ✓Inventarie equipamentos e versões FortiMail. Os resumos Fortinet/governamentais não incluem 7.0, mas dados CNA incluem 7.0.0–7.0.9; confirme essa linha diretamente com a Fortinet.[1], [5], [6]
- ✓Aplique já a mitigação do fornecedor: desative IBE ou remova o acesso público à interface web e limite-a a redes privadas confiáveis. Valide o impacto de desativar IBE com os responsáveis pelo correio.[1]
- ✓Preserve logs, backups de configuração e evidência forense antes de reiniciar ou atualizar. Consulte os IOCs atuais no aviso Fortinet FG-IR-26-175 e investigue qualquer correspondência.[1], [4]
- ✓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.[5], [1], [7]
- ✓Separe atualização de investigação. Uma versão corrigida não remove arquivos, credenciais ou persistência deixados antes da correção; siga resposta a incidentes se encontrar sinais suspeitos.
- ✓Em manipuladores próprios de arquivos, valide o caminho canônico contra uma raiz permitida após uma única decodificação estrita, rejeite NUL e codificações inválidas e abra relativamente a um diretório confiável para evitar corridas de symlink.
Fontes
- Fortinet PSIRT — FG-IR-26-175 / CVE-2026-104286
- CISA KEV — CVE-2026-104286
- Cyber Security Agency of Singapore — exploração ativa
- CERT-FR — vulnerabilidade no FortiMail
- Centro Canadense de Cibersegurança — Fortinet AV26-989
- NVD — CVE-2026-104286 e dados de versões
- Registro do CVE Program — dados CNA da Fortinet