
2,773개. 보안 회사 엠시소프트(Emsisoft)가 집계한 MOVEit 사고 피해 조직 수입니다. 연방 기관, 주 정부, 대학, 의료·금융사가 모두 들어 있습니다. 이 조직들을 연 것은 파일 전송 서버 한 제품에 있던 SQL 인젝션 하나였습니다. 피해자 대부분은 MOVEit을 직접 쓰지도 않았습니다. 급여·연금·보험을 처리하는 협력사가 이 제품을 썼고, 그 협력사에 맡긴 데이터가 함께 빠져나갔습니다.
사고 원인: 서드파티·공급망. 인터넷에 직접 노출된 파일 전송 서버에 제로데이 SQL 인젝션이 있었고, 그 서버에 협력사 고객의 파일이 오래 쌓여 있었습니다.
| 항목 | 내용 |
|---|---|
| 제품 | 프로그레스(Progress)의 MOVEit Transfer. 기업이 대용량 파일을 주고받는 데 쓰는 파일 전송 서버 |
| 공격자 | CL0P 랜섬웨어 조직(CISA·FBI). TA505로도 불림 |
| 공격 시작 | 2023-05-27, 미국 메모리얼데이 연휴(CISA) |
| 취약점 | 웹 애플리케이션의 SQL 인젝션 제로데이, CVE-2023-34362 |
| 피해 | 2,773개 조직, 약 9,580만 명(Emsisoft 집계, 2024-06 기준) |
| 방식 | 랜섬웨어 암호화 없이 데이터만 빼낸 뒤 협박 |
| 제재·소송 | SEC 조사 종결, 조치 권고 없음(2024-08). 매사추세츠 연방법원 MDL 집단소송 진행 중 |
피해 규모는 엠시소프트 집계이고, 각 조직이 따로 낸 유출 통지를 모은 숫자입니다. 수치는 2026년 11월 1일 기준 공개 자료입니다.

SQL 인젝션(사용자 입력이 데이터베이스 명령의 일부로 실행되는 취약점)은 교과서 첫 장에 나오는 유형입니다. 이번에는 그 취약점이 제로데이(제조사도 몰라 패치가 아직 없는 취약점) 상태로 쓰였습니다. 공격자는 이 취약점으로 서버에 웹셸(서버에 몰래 심어 원격으로 조종하는 파일)을 심었고, CISA·FBI는 이 웹셸을 LEMURLOOT라고 불렀습니다. 웹셸을 통해 데이터베이스에 있던 파일이 빠져나갔습니다. 서버마다 따로 침입할 필요가 없었습니다. 같은 제품을 쓰는 서버가 인터넷에 열려 있었기 때문에 한 번에 많은 조직이 피해를 입었습니다.
CISA·FBI 합동 권고와 프로그레스 공지, 분석 자료가 밝힌 원인은 네 가지로 묶입니다.
여기에 공격이 연휴 첫날에 몰려 대응 인력이 적었다는 점도 더해집니다. 1번은 제품을 만든 회사의 문제입니다. 2~4번은 제품을 쓰는 회사가 정할 수 있는 문제였습니다.
파일 전송 서버를 직접 만들지 않더라도, 쿼리를 짜는 코드는 대부분의 백엔드에 있습니다. 사고 회사의 코드가 아니라 같은 실수를 보여 주는 일반 예시입니다. 공격 입력은 싣지 않고, 값은 모두 가짜입니다.
# 위험한 모양 · 일반 예시
def find_files(folder_id, name):
sql = ("SELECT id, path FROM files "
"WHERE folder_id = " + folder_id +
" AND name = '" + name + "'")
return db.execute(sql).fetchall()
# 입력이 쿼리 문장에 그대로 섞인다
이 코드는 사용자가 보낸 값을 쿼리 문장에 그대로 이어 붙입니다. 데이터베이스는 어디까지가 개발자가 쓴 명령이고 어디부터가 사용자 입력인지 구분하지 못합니다. 입력이 명령의 일부로 해석될 여지가 남습니다.
# 고친 모양 · 일반 예시
def find_files(user, folder_id, name):
sql = ("SELECT id, path FROM files "
"WHERE folder_id = %s AND name = %s "
"AND owner_id = %s")
return db.execute(
sql, (int(folder_id), name, user.id)
).fetchall()
# 쿼리 문장과 값을 따로 보낸다
고친 모양은 세 군데가 다릅니다.
%s)만 두고 값은 따로 넘깁니다. 데이터베이스는 넘어온 값을 언제나 값으로만 다룹니다. 이 유형의 취약점은 이 방식으로 생기지 않습니다.ORM(객체와 데이터베이스 표를 이어 주는 도구)을 쓰더라도 원시 쿼리를 쓰는 부분은 남습니다. 그 부분은 코드 리뷰와 정적 분석(SAST, 소스 코드를 실행하지 않고 위험한 패턴을 찾는 검사)으로 따로 확인합니다.
외부에 여는 서버라면 운영 설정도 함께 봅니다. 아래는 같은 생각을 설정으로 옮긴 일반 예시입니다.
# 파일 전송 경로는 협력사 주소만 · 일반 예시
location /transfer/ {
allow 192.0.2.0/24; # 등록된 협력사
deny all;
}
# 전송 끝난 파일은 7일 뒤 자동 삭제(배치)
# 웹 루트에 새 실행 파일이 생기면 알림
롯데카드 297만 명(국내편 05편)도 인터넷에 열린 서버의 취약점으로 시작했습니다. 2022년 6월 이후 거래가 없던 결제 서버가 외부에 열려 있었고, 보안관제에서도 빠져 있었습니다. 다른 점은 취약점의 상태입니다. MOVEit은 제로데이였습니다. 공격이 시작된 5월 27일에는 고칠 패치가 세상에 없었습니다. 롯데카드의 WebLogic 취약점은 2017년에 패치가 나와 있었고, 금융보안원이 세 차례 관리 강화를 요구했는데도 8년 동안 적용되지 않았습니다. 패치가 없을 때는 노출을 줄이고 피해를 줄이는 장치가 버팀목이 되고, 패치가 나온 뒤에는 적용 속도가 차이를 만듭니다.
위 흐름도의 그린 표시와 같은 번호입니다.
1·3·4번은 패치가 없던 5월 27일부터 31일 사이에도 작동하는 장치입니다. 제로데이를 미리 알 수는 없어도, 열린 문의 수와 서버에 쌓인 데이터의 양은 미리 줄일 수 있습니다.
2026년 10월 말 기준 집단소송은 진행 중이라 결과는 바뀔 수 있습니다. 위 내용은 공개 보고서·발표를 정리한 것이며 법률 자문이 아닙니다.
인프런 「백엔드 개발자를 위한 서버 보안 실무」 수업
관련 velog 글
오늘 본 사고의 원인은 대부분 서버와 코드의 기본기에서 막을 수 있는 것들이었습니다. 직접 손으로 막아 보고 싶다면 이런 강의도 있습니다.
백엔드 개발자를 위한 서버 보안 실무: 해킹 방어부터 정보유출 방지까지
수치는 2026년 11월 1일 기준 공개 보고서·발표입니다. 진행 중인 사건은 바뀔 수 있고, 이 글은 법률 자문이 아닙니다.
이전 글 Salesloft Drift: 연동 토큰 하나로 700곳의 Salesforce가 열렸다
다음 글 막스앤스펜서·코옵: 헬프데스크 전화 한 통이 연 문
시리즈 전체 목록 해외 보안사고 사례 전체 목록