flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023
MOVEit Transfer: SQL 인젝션과 대규모 데이터 탈취
CVE-2023-34362는 MOVEit Transfer의 인증 없는 SQL 인젝션 취약점이었습니다. Mandiant는 2023년 5월 27일부터 악용을 관찰했으며, 이후 LEMURLOOT 웹 셸 배치와 데이터 탈취가 이어졌습니다.[4], [3]
“폴더 번호” 입력란이 있는 양식을 생각해 보세요. 담당자가 그 값을 보관 시스템에 보내는 명령문에 그대로 복사합니다. 입력란이 폴더를 지정하는 데 그치지 않고 명령문을 바꿀 수 있다면, 작성자는 시스템이 의도보다 많은 일을 하게 만들 수 있습니다. 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]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-89
- CISA KEV — 추가일 2023-06-02 — CVE-2023-34362
사고 타임라인
Mandiant는 MOVEit Transfer 악용의 가장 이른 관찰 증거가 2023년 5월 27일이라고 보고했습니다.[3]
Progress가 취약점을 공개하고, 패치할 때까지 HTTP·HTTPS 트래픽을 차단하라고 고객에게 권고합니다.[1]
CISA가 CVE-2023-34362를 알려진 악용 취약점 목록에 추가합니다.[9]
단계별 공격 실행 흐름
소스 코드 비교: 취약한 구현 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();
}
}엔지니어링 및 시스템 보안 강화 체크리스트
- ✓모든 SQL 값을 매개변수화하고 신뢰할 수 없는 문자열을 SQL 명령 API에 연결하면 CI가 실패하게 하세요. MITRE CWE-89는 매개변수화된 쿼리를 예방책으로 제시합니다.[5]
- ✓FlawOpen 권고: 인젝션 결함 하나를 찾으면 쿼리를 만드는 모든 경로에서 동일한 데이터와 SQL 경계 문제를 검색하세요. 후속 CVE는 공통 근본 원인이 권고문으로 입증되지 않는 한 별개 문제로 취급하세요.
- ✓배포된 모든 MOVEit Transfer 인스턴스에 Progress의 패치 지침을 적용하세요. 일반적인 외부 노출을 복구하기 전에 인스턴스를 목록화하고 수정된 버전을 기록하세요.[1]
- ✓악용이 의심되면 서비스 복구 전에 호스트를 조사하세요. LEMURLOOT와 영향을 받은 계정을 찾고 노출 가능성이 있는 자격 증명이나 비밀을 교체하세요.[3]
- ✓FlawOpen 권고: 파일 전송 제공업체에 어떤 시스템이 데이터를 보유했는지 확인하고, 이 목록으로 통지 및 사고 대응 범위를 정하세요.
- ✓FlawOpen 권고: 데이터 민감도와 계약상 필요에 따라 보존 기간을 정하고 삭제 여부를 확인하세요. MOVEit 피해자의 보존 이력을 추측하지 않고 노출을 줄일 수 있습니다.
출처
- Progress — MOVEit Transfer 치명적 취약점 (2023년 5월 31일)
- CISA·FBI — 권고 AA23-158A: 랜섬웨어 조직 CL0P의 CVE-2023-34362 악용
- Mandiant — 데이터 탈취에 악용된 MOVEit Transfer 제로데이 취약점
- CVE-2023-34362 — CVE 레코드
- MITRE CWE-89
- SQL 인젝션 — 11개 언어에 걸친 전체 클래스 참고 자료
- 저장 프로시저로 SQL 인젝션을 막을 수 있을까?
- CVE-2025-1094: 이스케이프 함수 자체가 취약점이었을 때
- CISA KEV 카탈로그 — CVE-2023-34362