FlawOpen

flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023

● Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · Crítica
Pesquisa · FlawOpen

MOVEit Transfer: SQL injection e roubo de dados em massa

A CVE-2023-34362 era uma SQL injection sem autenticação no MOVEit Transfer. A Mandiant observou exploração desde 27 de maio de 2023, seguida pelo web shell LEMURLOOT e pelo roubo de dados.[4], [3]

💡 Explicação em Linguagem Simples (ELI5)

Imagine um formulário com um campo “número da pasta”, mas o atendente copia esse campo diretamente para uma instrução enviada ao sistema de arquivos. Se o campo puder alterar a instrução em vez de apenas indicar uma pasta, quem preenche o formulário poderá fazer o sistema ir além do previsto. A SQL injection cruza essa mesma fronteira: uma entrada não confiável é tratada como sintaxe SQL, e não como um valor.[5]

Conceitos Centrais e Termos

Injeção de SQL (CWE-89)
Uma entrada concatenada numa consulta ao banco de dados muda o que a consulta faz, em vez de ser tratada como um valor.[5]
Transferência gerenciada de arquivos (MFT)
Software que as organizações usam para trocar arquivos grandes ou sensíveis com parceiros. Um único servidor pode guardar dados de muitas organizações.[3]
Web shell
Um script que o atacante planta num servidor web para manter o acesso. A Mandiant chamou o usado aqui de LEMURLOOT.[3]
Consulta parametrizada
Uma consulta cujos valores são enviados separados do texto, de modo que o banco nunca interpreta dados como SQL.[5]
Versões afetadas e corrigidas
A Progress lista como afetadas, em seus respectivos ramos, as versões anteriores a 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5 e 2023.0.1; essas versões listadas incluem a correção. Confirme seu ramo e o caminho de atualização atual no aviso da Progress.[1]

Mapeamentos de frameworks

Linha do Tempo do Incidente

2023-05-27

A Mandiant registra em 27 de maio de 2023 a evidência mais antiga de exploração do MOVEit Transfer que observou.[3]

2023-05-31

A Progress divulga a vulnerabilidade e pede aos clientes que cortem o tráfego HTTP e HTTPS até aplicar o patch.[1]

2023-06-02

A CISA inclui a CVE-2023-34362 no catálogo Known Exploited Vulnerabilities.[9]

2023-06-07

A CISA e o FBI publicam o alerta conjunto AA23-158A, que descreve a campanha como atividade do ransomware CL0P. Mais tarde, a Mandiant atualiza a atribuição e incorpora UNC4857 ao FIN11 com base em sobreposições.[2], [3]

Fluxo de Ataque Passo a Paso

Passo 1

Uma requisição sem autenticação

A Mandiant observou requisições POST manipuladas para guestaccess.aspx do MOVEit Transfer antes do surgimento do LEMURLOOT; a atividade não exigia um login normal de usuário.[3]

Passo 2

A entrada altera o significado da consulta

A requisição alcançava uma operação SQL vulnerável. A CISA descreveu a falha como acesso ao banco sem autenticação, incluindo inferência ou alteração/exclusão conforme o mecanismo de banco usado.[2], [5]

Passo 3

Um web shell é instalado

Após a exploração, a Mandiant observou o web shell LEMURLOOT. Ele podia enumerar e obter arquivos e manipular um usuário específico da aplicação; as fontes não comprovam controle administrativo genérico.[3]

Passo 4

Arquivos são roubados em massa

A Mandiant observou roubo de arquivos em grande escala. A CISA e o FBI descreveram a campanha mais ampla como atividade do ransomware CL0P; a atribuição posterior da Mandiant relacionou a atividade ao FIN11.[2], [3]

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

C# ilustrativo, não é código-fonte do MOVEit. O método reforçado converte o identificador para o tipo que a coluna realmente guarda e rejeita qualquer outra coisa; depois o envia como parâmetro tipado, para que o valor nunca faça parte do texto SQL. Qualquer um dos controles sozinho impede esta injeção; juntos, também rejeitam identificadores malformados antes da consulta.[5]

IMPLEMENTAÇÃO VULNERÁVEL
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        // O texto da consulta e os dados da requisição são concatenados, então o banco de dados
        // não consegue distinguir qual parte o desenvolvedor pretendia tratar como dado.
        string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
        var cmd = new SqlCommand(sql, conn);
        return cmd.ExecuteReader();
    }
}
PATCH SEGURO E ROBUSTO
using System;
using System.Data;
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        if (!long.TryParse(folderId, out long id) || id <= 0)
            throw new ArgumentException("folderId must be a positive integer");

        // O valor é enviado como parâmetro tipado, separado do texto da consulta.
        var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
        cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
        return cmd.ExecuteReader();
    }
}

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

Fontes