← back
CVE-2023-28434highunder attackCWE-269

MinIO is vulnerable to privilege escalation on Linux/MacOS

76Vexday Risk Score

Prioritize patching. It under exploitation confirmed by CISA and has a public proof of concept.

ssvc Actcvss 8.8epss 6.7%
from disclosure to weapon1 days
Published on NVDMar 22
1st PoC+1d
CISA KEV+181d
exploitation probability
6.7%top 7% of all CVEs
observed exploitation
yesCISA + VulnCheck
3 public exploit(s)
Action required by CISAfederal deadline: 2023-10-10

Apply mitigations per vendor instructions or discontinue use of the product if mitigations are unavailable.

Summary

Falha de bypass de controle de acesso no MinIO (framework de object storage multi-cloud) que permite a um usuário autenticado escrever objetos em qualquer bucket, incluindo buckets internos/reservados do sistema, ao abusar do endpoint PostPolicyBucket. O CVSS 8.8 é alto, mas a exploração exige duas pré-condições específicas — credenciais com permissão `arn:aws:s3:::*` e Console/Browser API habilitado — que reduzem a superfície real de exposição, ainda que não sejam raras em ambientes que usam políticas amplas.

Technical detail

O MinIO usa um handler central, `setRequestValidityHandler` (cmd/generic-handlers.go), para bloquear acesso a buckets reservados e ao bucket de metadados interno (`.minio.sys`). Esse bloqueio é liberado seletivamente para certos tipos de requisição legítimos — chamadas RPC internas, health checks, métricas, requisições admin/KMS e requisições de browser (`guessIsBrowserReq`). O problema é que o roteamento do endpoint `PostPolicyBucket` (upload via formulário multipart, usado por navegadores e integrações) usava, antes da correção, um casamento frouxo de Content-Type (`strings.Contains` com o substring "multipart/form-data") em vez de validar a assinatura AWS Signature V4 do PostPolicy propriamente. Essa inconsistência entre a lógica de roteamento e a lógica de verificação de bucket reservado abria uma janela: uma requisição craftada podia ser roteada para o handler de PostPolicy e, ao mesmo tempo, ser classificada de forma a escapar da checagem de `isMinioReservedBucket`/`isMinioMetaBucket`.

O resultado prático é a possibilidade de o atacante enviar um objeto para qualquer bucket do namespace, inclusive o bucket de metadados do sistema, driblando a checagem de nome de bucket que deveria impedir escrita fora do escopo autorizado. A CISA classifica isso como CWE-269 (Improper Privilege Management / gerenciamento inadequado de privilégios) — o mecanismo de restrição existe, mas é aplicado de forma inconsistente entre duas camadas do código (roteador HTTP e verificador de assinatura).

A correção (PR #16849, commit 67f4ba1) resolve o problema em duas frentes: o roteador passa a exigir explicitamente que a requisição tenha uma assinatura PostPolicy V4 válida (`isRequestPostPolicySignatureV4`) para ser despachada ao handler, e essa própria função de verificação passa a usar `mime.ParseMediaType` para comparar o media type de forma exata (`multipart/form-data`), em vez de uma verificação de substring que podia ser manipulada com variações de Content-Type.

How it’s exploited

O vetor é uma requisição HTTP POST multipart/form-data para o endpoint de PostPolicy, manipulando o Content-Type e/ou o nome do bucket de destino de forma a explorar a divergência entre o roteador e a checagem de bucket reservado, conseguindo depositar um objeto em um bucket que deveria estar bloqueado — incluindo o bucket interno de metadados. Não é uma falha pré-autenticação: o atacante precisa de credenciais válidas no MinIO cuja política conceda `arn:aws:s3:::*` (acesso amplo, tipo wildcard sobre todos os buckets), e a instância precisa ter a API de Console/Browser habilitada (ou seja, `MINIO_BROWSER` não configurado como `off`).

Dado que muitas implantações mantêm o console web ativo por padrão e que políticas com wildcard `s3:::*` são comuns em contas de serviço com propósito genérico, a barreira prática de exploração é mais baixa do que a redação da CVE sugere isoladamente — mas ainda exige que o atacante já tenha pé dentro do ambiente com algum nível de credencial válida, não é acesso anônimo.

O impacto final depende do que o atacante consegue sobrescrever ao escrever no namespace interno: potencialmente configuração, políticas IAM ou outros artefatos de estado do servidor, abrindo caminho para escalação de privilégio dentro do próprio MinIO. A CVE está no catálogo KEV da CISA (adicionada em 19/09/2023, prazo de remediação 10/10/2023), confirmando exploração ativa observada, e há PoC pública circulando — mas a CISA não classifica uso conhecido em campanhas de ransomware ('Unknown').

Versions

Affected
Todas as versões do MinIO anteriores a RELEASE.2023-03-20T20-16-18Z (advisory do fornecedor lista 'Affected versions: all').
Fixed in
RELEASE.2023-03-20T20-16-18Z e versões posteriores.

How to protect

Atualizar para RELEASE.2023-03-20T20-16-18Z ou posterior é a correção definitiva — o patch ajusta tanto o roteamento quanto a validação de Content-Type do PostPolicy. Não há indicação de backport para ramos antigos: o MinIO segue versionamento único por data de release, sem branches LTS separados.

Se a atualização não for imediata, o controle compensatório documentado pelo fornecedor é desabilitar a API de Console/Browser (`MINIO_BROWSER=off`), já que a exploração depende dela estar habilitada. Isso reduz a superfície de ataque mas tem custo funcional: remove o acesso ao console web de administração, forçando uso exclusivo de linha de comando (`mc`) ou SDKs. Vale notar que a redação do texto oficial sobre o workaround é ambígua/contraditória ('enable browser API access and turn off MINIO_BROWSER=off'); a leitura consistente com a pré-condição descrita na própria vulnerabilidade é desabilitar o Console (setar `MINIO_BROWSER=off`), não habilitá-lo.

Revisar e restringir políticas IAM que concedem `arn:aws:s3:::*` também reduz a exposição, já que essa permissão amplíssima é pré-requisito do ataque — não é mitigação contra a falha em si, mas reduz o número de identidades capazes de explorá-la. Restringir Content-Type ou bloquear multipart/form-data em um proxy reverso na frente do MinIO não é uma mitigação confiável, pois a falha está na lógica de roteamento interna do próprio binário, não em algo filtrável de forma genérica sem entender a assinatura V4 esperada.

How to detect

Nos logs de acesso do MinIO, procurar por requisições POST com Content-Type multipart/form-data direcionadas a nomes de bucket reservados/internos (ex.: variações relacionadas a `.minio.sys`) ou por chamadas ao endpoint de PostPolicyBucket vindas de credenciais com política `arn:aws:s3:::*` fora do padrão normal de upload via console. Vale também auditar criação de objetos inesperados dentro do namespace de metadados do sistema.

Não há assinatura de rede única e confiável para essa exploração, porque o abuso ocorre inteiramente dentro da lógica de validação HTTP do próprio MinIO usando um formato de requisição legítimo (multipart/form-data assinado); a diferenciação entre uso normal e exploração depende de correlacionar o bucket de destino com a política do usuário autenticado, não do payload em si.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
Minio is a Multi-Cloud Object Storage framework. Prior to RELEASE.2023-03-20T20-16-18Z, an attacker can use crafted requests to bypass metadata bucket name checking and put an object into any bucket while processing `PostPolicyBucket`. To carry out this attack, the attacker requires credentials with `arn:aws:s3:::*` permission, as well as enabled Console API access. This issue has been patched in RELEASE.2023-03-20T20-16-18Z. As a workaround, enable browser API access and turn off `MINIO_BROWSER=off`.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Affected products
minio · minio
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.