단순 JSON 문자열로 위장해 보안망 우회... 패치 누락 시 DB 전체 탈취 위험
크리밋 김동현 대표 “코드 안에서 터지는 취약점... 시프트 레프트로 선제 차단해야”
[보안뉴스 조재호 기자] “ORM을 쓰면 SQL 인젝션은 걱정 없다”는 현장의 통념이 흔들리고 있다. SQL 인젝션 방어 대책으로 널리 권장돼 온 ORM 라이브러리 자체에서 고위험 취약점이 발견됐고, 웹방화벽(WAF)마저 이 공격을 탐지하기 어렵다는 구조적 한계가 드러났기 때문이다.
Node.js 생태계의 대표적인 ORM 라이브러리인 ‘시퀄라이즈(Sequelize) v6’ 계열에서 데이터베이스 전체를 탈취할 수 있는 SQL 인젝션 취약점(CVE-2026-30951)이 공개됐다. JSON 칼럼 기능을 사용하는 서비스가 영향권에 있는데, 6.37.8 버전으로의 즉각적인 업데이트가 요구된다.

[출처: 크리밋]
ORM(객체-관계 매핑)은 개발자가 복잡한 SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 다룰 수 있게 해주는 도구다. 식당으로 비유하자면, 손님(개발자)이 메뉴판에서 원하는 것을 고르면 주방(ORM)이 알아서 요리(SQL)해내는 방식이다. 사용자가 입력한 값을 자동으로 필터링해 해킹 공격을 원천 차단하는 핵심 보안 도구로 여겨져 왔다.
그러나 이번 취약점은 굳게 믿었던 주방 내부에서 발생했다. ORM이 JSON 칼럼을 처리할 때 데이터 형식을 변환하는 ‘캐스트 타입’(Cast Type) 명령어를 아무런 검증 없이 SQL에 그대로 삽입하는 버그가 확인된 것이다. 공격자가 API 요청에 ‘role::text) or 1=1--’ 같은 조작된 키를 넣으면, ORM이 이를 그대로 악성 SQL 문법으로 조립한다.
대다수 기업이 외부 공격 차단을 위해 애플리케이션 앞단에 WAF를 운영하고 있다. WAF는 들어오는 HTTP 요청을 실시간으로 검사해 SQL 인젝션 패턴을 차단한다. 하지만 이번 공격은 WAF가 요청을 검사하는 시점에는 아직 SQL이 아니라는 점이 핵심이다.
악성 코드는 WAF를 통과할 때까지 평범한 JSON 문자열처럼 보이다가, 서버 내부 깊숙한 곳의 ORM이 이를 SQL로 조립하는 순간 비로소 무기로 돌변한다. WAF 입장에서는 이미 안전하다고 통과시킨 요청이 서버 안쪽에서 위험한 SQL로 바뀌는 과정을 들여다볼 방법이 없는 것이다.
특수기호(::, or 등) 자체를 WAF에서 무조건 차단하는 방법을 사용해볼 수도 있겠지만, 문제는 이 기호들이 정상적인 데이터 전송 과정에서도 얼마든지 등장한다는 점이다. 무리하게 차단할 경우 멀쩡한 사용자의 서비스 이용까지 막히는 장애로 이어지기 때문에, 결국 WAF는 이 취약점의 실질적인 방어 수단이 되기 어렵다.
따라서 ORM은 만능 보안 도구가 아니며, WAF 역시 알려진 패턴만 막는 보완재에 불과하다. 소스코드 레이어에서 발생한 로직 버그는 직접 패치를 통해서만 해결할 수 있다. 시퀄라이즈 6.37.8 버전에서는 허용된 데이터 타입 목록(화이트리스트)을 통해서만 캐스트 타입을 검증하도록 로직이 수정됐으며, 명령어 한 줄(npm install sequelize@6.37.8)로 패치가 가능하다.
더 근본적으로는, 이 취약한 라이브러리가 서비스에 포함되는 것 자체를 배포 전에 자동으로 잡아낼 체계가 필요하다. 소프트웨어 개발 생명주기(SDLC) 초기 단계부터 보안을 점검하는 시프트 레프트(Shift-left) 접근법이 필수적이다.
김동현 크리밋 대표는 “WAF를 운영하고 있어도 HTTP 요청이 서버 안으로 들어온 뒤 ORM이 SQL을 조립하기 때문에 사전에 막기 어렵다”며, “네트워크 방어가 탄탄해도 코드 안에서 터지는 취약점은 결국 코드로 막을 수밖에 없다”고 말했다. 이어 “보안을 운영 레이어에서만 관리하는 조직은 한계가 있으므로, 개발자가 취약한 버전을 설치하는 순간 CI/CD 파이프라인 안에서 탐지하고 선제 차단하는 시프트 레프트 접근이 이번 사고가 주는 가장 중요한 교훈”이라고 강조했다.
[조재호 기자(zephyr@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>














