FlawOpen

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

● Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · 심각
보안 연구 · FlawOpen

MOVEit Transfer: SQL 인젝션과 대규모 데이터 탈취

CVE-2023-34362는 MOVEit Transfer의 인증 없는 SQL 인젝션 취약점이었습니다. Mandiant는 2023년 5월 27일부터 악용을 관찰했으며, 이후 LEMURLOOT 웹 셸 배치와 데이터 탈취가 이어졌습니다.[4], [3]

💡 알기 쉬운 설명 (ELI5)

“폴더 번호” 입력란이 있는 양식을 생각해 보세요. 담당자가 그 값을 보관 시스템에 보내는 명령문에 그대로 복사합니다. 입력란이 폴더를 지정하는 데 그치지 않고 명령문을 바꿀 수 있다면, 작성자는 시스템이 의도보다 많은 일을 하게 만들 수 있습니다. SQL 인젝션도 같은 경계를 넘습니다. 신뢰할 수 없는 입력이 값이 아니라 SQL 문법으로 처리됩니다.[5]

핵심 개념 및 용어

SQL 인젝션(CWE-89)
데이터베이스 쿼리에 이어 붙인 입력이 값으로 취급되지 않고 쿼리가 하는 일 자체를 바꾸는 것입니다.[5]
관리형 파일 전송(MFT)
조직이 협력사와 대용량 또는 민감한 파일을 주고받는 데 쓰는 소프트웨어입니다. 서버 하나에 여러 조직의 데이터가 모일 수 있습니다.[3]
웹 셸
공격자가 접근을 유지하려고 웹 서버에 심는 스크립트입니다. Mandiant는 여기서 쓰인 것을 LEMURLOOT라고 불렀습니다.[3]
매개변수화 쿼리
값을 쿼리 본문과 따로 보내는 쿼리입니다. 데이터베이스가 데이터를 SQL로 해석하는 일이 없습니다.[5]
영향을 받는 버전 및 수정 버전
Progress에 따르면 각 브랜치에서 2021.0.6, 2021.1.4, 2022.0.4, 2022.1.5, 2023.0.1보다 이전 버전이 영향을 받으며, 나열된 버전에 수정 사항이 포함됩니다. 사용 중인 브랜치와 현재 업그레이드 경로는 Progress 권고문에서 확인하세요.[1]

프레임워크 매핑

사고 타임라인

2023-05-27

Mandiant는 MOVEit Transfer 악용의 가장 이른 관찰 증거가 2023년 5월 27일이라고 보고했습니다.[3]

2023-05-31

Progress가 취약점을 공개하고, 패치할 때까지 HTTP·HTTPS 트래픽을 차단하라고 고객에게 권고합니다.[1]

2023-06-02

CISA가 CVE-2023-34362를 알려진 악용 취약점 목록에 추가합니다.[9]

2023-06-07

CISA와 FBI는 공동 권고 AA23-158A를 발표하고 이 캠페인을 CL0P 랜섬웨어 활동으로 설명합니다. 이후 Mandiant는 중복되는 정황을 근거로 귀속을 갱신해 UNC4857을 FIN11에 통합했습니다.[2], [3]

단계별 공격 실행 흐름

단계 1

인증 없는 요청

Mandiant는 LEMURLOOT가 나타나기 전에 MOVEit Transfer의 guestaccess.aspx로 조작된 POST 요청이 전송된 것을 관찰했습니다. 이 활동에는 일반 사용자 로그인이 필요하지 않았습니다.[3]

단계 2

입력이 쿼리의 의미를 바꾼다

요청은 취약한 SQL 작업에 도달했습니다. CISA는 이 결함이 인증 없이 데이터베이스에 접근하게 하며, 데이터베이스 엔진에 따라 정보를 추론하거나 데이터를 변경·삭제할 수 있다고 설명했습니다.[2], [5]

단계 3

웹 셸이 설치된다

악용 후 Mandiant는 LEMURLOOT 웹 셸을 관찰했습니다. 파일을 열거하고 가져오며 특정 애플리케이션 사용자를 조작할 수 있었습니다. 일반적인 관리자 권한 획득은 출처에서 확인되지 않습니다.[3]

단계 4

파일이 대량으로 도난당한다

Mandiant는 대량 파일 탈취를 관찰했습니다. CISA와 FBI는 더 넓은 캠페인을 CL0P 랜섬웨어 활동으로 설명했고, Mandiant는 후속 귀속 갱신에서 이를 FIN11과 연결했습니다.[2], [3]

소스 코드 비교: 취약한 구현 vs 보안 패치

설명용 C#이며 MOVEit 소스 코드가 아닙니다. 강화된 메서드는 식별자를 해당 열이 실제로 저장하는 형식으로 변환하고 나머지는 거부한 뒤 형식이 지정된 매개변수로 보내므로 값이 SQL 본문에 포함되지 않습니다. 두 통제 중 하나만으로도 이 인젝션을 막을 수 있으며, 함께 쓰면 쿼리 실행 전에 잘못된 식별자도 거부합니다.[5]

취약한 구현
using System.Data.SqlClient;

public static class FolderLookup
{
    public static SqlDataReader Find(SqlConnection conn, string folderId)
    {
        // 쿼리 텍스트와 요청 데이터가 연결되므로 데이터베이스는
        // 개발자가 어느 부분을 데이터로 의도했는지 구분할 수 없습니다.
        string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
        var cmd = new SqlCommand(sql, conn);
        return cmd.ExecuteReader();
    }
}
보안 강화 패치
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");

        // 값은 쿼리 텍스트와 분리된 타입 지정 매개변수로 전달됩니다.
        var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
        cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
        return cmd.ExecuteReader();
    }
}

엔지니어링 및 시스템 보안 강화 체크리스트

출처