본문 바로가기
Linux/보안

CVE-2026-26980 블라인드 SQL 인젝션 취약점

by 데브믹서 2026. 9. 19.

취약점 식별자: CVE-2026-26980 / GHSA-w52v-v783-gw97 / ANT-2026-69D8H6RP
심각도 등급: CVSS 9.4 (Critical, GitHub CNA 기준) / 7.5 (High, NVD 독립 평가)|


1. 취약점 개요

1.1 핵심 식별 정보

항목 내용
CVE ID CVE-2026-26980
취약점 명칭 Ghost CMS Content API Blind SQL Injection
취약점 유형 Blind SQL Injection (블라인드 SQL 인젝션)
CWE 분류 CWE-89: Improper Neutralization of Special Elements used in an SQL Command
CVSS v3.1 점수 9.4 (Critical) — GitHub CNA / 7.5 (High) — NVD 독립 평가
CVSS 벡터 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
공격 벡터 네트워크 (Network)
공격 복잡도 낮음 (Low)
권한 요구 없음 (None) — 인증 불필요
사용자 상호작용 없음 (None) — 서버 측 취약점
영향 제품 Ghost CMS (Node.js 기반 오픈소스 CMS)
영향 버전 3.24.0 ~ 6.19.0
수정 버전 Ghost CMS 6.19.1
패치 공개일 2026년 2월 19일
실제 악용 확인 2026년 2월 27일 (SentinelOne 최초 문서화) / 2026년 5월 7일 (XLab 대규모 캠페인 탐지)
악용 규모 700개 이상 도메인 침해 확인
EPSS 점수 56.66% (98백분위) / 32.74% (탐지 시점 기준)
공개 PoC 2건 이상 공개 익스플로잇 존재

1.2 취약점 설명

CVE-2026-26980은 Ghost CMS의 Content API 입력 직렬화기(input serializer) 에서 발생하는 인증 불필요 블라인드 SQL 인젝션 취약점이다. Ghost 버전 3.24.0부터 6.19.0까지 영향을 미치며, 2026년 2월 19일 공개된 버전 6.19.1에서 수정되었다.

이 취약점의 핵심은 Content API 키가 테마 HTML에 직접 임베드되도록 설계되어 있어, 공격자 관점에서 해당 엔드포인트가 사실상 인증이 필요 없는 상태라는 점이다. 공격자는 단일 조작된 요청을 통해 데이터베이스에서 Admin API 키를 추출할 수 있으며, 이를 이용해 사이트의 모든 게시물을 수정하고 악성 JavaScript를 주입할 수 있다.

1.3 발견 경위

이 취약점은 전통적인 침투 테스트나 수동 코드 리뷰를 통해 발견된 것이 아니라, Anthropic의 연구원 Nicholas Carlini가 대규모 언어 모델(LLM) Claude를 활용하여 발견하였다. Carlini는 Ghost 코드베이스를 Claude에 입력하고 보안 취약점을 찾도록 지시했으며, 약 90분의 자율적 코드 분석 끝에 Claude가 slug-filter-order.js 입력 직렬화기에서 블라인드 SQL 인젝션을 식별하였다. 이 발견은 Black Hat LLM 컨퍼런스에서 발표되었으며, 공개 PoC 저장소에도 기여자로 등재되었다.

2. 기술적 심층 분석

2.1 Ghost CMS 아키텍처와 공격 표면

Ghost는 Node.js 기반의 오픈소스 콘텐츠 관리 시스템으로, 52,000개 이상의 GitHub 스타를 보유하고 있으며 독립 출판사, 미디어 조직, 뉴스레터, 기술 블로그 등에서 널리 사용된다. Ghost는 다음과 같은 API 체계를 운영한다.

API 유형 접근 권한 주요 기능 인증 방식
Content API 공개 (읽기 전용) 포스트, 태그, 작성자 정보 조회 Content API Key (HTML에 임베드)
Admin API 제한 (읽기/쓰기) 콘텐츠 생성·수정·삭제, 사이트 관리 Admin API Key + JWT
Members API 제한 (사용자 인증) 구독자 관리, 로그인 세션/토큰

Content API는 /ghost/api/content/posts/ 경로에서 공개적으로 접근 가능하며, 요청은 테마 HTML에 직접 임베드된 Content API 키로 인증된다. 이 설계상의 특성으로 인해 Content API 엔드포인트는 공격자 관점에서 사실상 인증이 없는 상태와 동일하다.

2.2 취약점의 근본 원인: slugFilterOrder 함수

취약점의 근본 원인은 Ghost의 Content API 입력 직렬화기 내 slug-filter-order.js 파일에 위치한 slugFilterOrder(table, filter) 함수에 있다.

이 함수는 NQL(Ghost Query Language) 필터에서 slug:[a,b,c] 형태의 표현식을 파싱하여 SQL의 ORDER BY 절에 사용될 원시 SQL CASE WHEN … END ASC 프래그먼트를 생성한다. 문제는 공격자가 제어하는 slug 값이 JavaScript 문자열 보간(string interpolation)을 통해 직접 연결되며, 살균 처리나 쿼리 바인딩이 전혀 적용되지 않는다는 점이다.

정상적인 쿼리 구조는 다음과 같다:

SELECT * FROM posts WHERE slug IN (...) ORDER BY CASE WHEN slug = '<사용자 입력값>' THEN 1 ... END ASC

slugFilterOrder의 반환 값이 원시 SQL 문자열이기 때문에, 주입된 페이로드는 데이터베이스 엔진에 의해 ORDER BY 절 내에서 그대로 실행된다. SQLite 기본 구성(Ghost 개발자 이미지에 포함)과 프로덕션 MySQL 배포 모두 영향을 받는다.

2.3 NQL 파서 우회 메커니즘

취약점에 도달하려면 Ghost의 NQL 파서를 우회해야 한다. NQL 파서는 작은따옴표, 괄호, 쉼표 등의 토큰에 대해 어휘 규칙(lexer rules) 을 적용한다. 우회 기법은 NQL과 slugFilterOrder 간의 불일치를 악용한다.

구체적으로, NQL은 따옴표로 묶인 STRING 토큰을 단일 slug 값으로 허용하지만, slugFilterOrder는 대괄호 내용에 대해 순진한 .split(',') 연산을 수행하여 NQL 문자열을 관통해 분할하고 여러 개의 합성 "slug" 값을 생성한다. 각 합성 slug는 자체 WHEN … = '<slug>' THEN n 절에 삽입되며, 공격자는 짝을 이룬 작은따옴표와 SQL || 연결 연산자를 사용하여 결과 프래그먼트를 하나의 공격자 제어 스칼라 표현식으로 결합한다.

2.4 블라인드 오라클 구현

공격자는 데이터베이스 유형에 따라 다음과 같은 블라인드 오라클을 사용한다.

데이터베이스 오라클 유형 기법
SQLite (개발/소규모 배포) 오류 기반 (Error-based) json(char(123)) — 잘못된 JSON을 생성하여 SQLITE_ERROR 발생
SQLite 타이밍 기반 (Timing-based) SLEEP()이 존재하지 않으므로 length(hex(randomblob(50000000)))을 사용하여 약 400ms의 일관된 지연 생성
MySQL (프로덕션) 타이밍 기반 SLEEP() 함수 사용

PoC는 CASE 표현식의 ELSE 분기가 json('{') — 구문 오류를 발생시키는 잘못된 JSON — 을 평가하도록 구성하여, 엔드포인트를 users 및 api_keys 테이블에 대한 임의의 하위 쿼리를 실행할 수 있는 불리언 오라클(boolean oracle) 로 전환한다. TRUE 조건은 태그 JSON을 반환하고, FALSE 조건은 SQLITE_ERROR BadRequestError를 반환한다.

3. 공격 체인 상세 분석

3.1 전체 공격 흐름 개요

CVE-2026-26980을 이용한 공격은 단일 취약점 악용에서 시작하여 다단계 공급망 공격으로 확장되는 복합적 체인을 형성한다. XLab이 2026년 5월 7일 최초 탐지한 대규모 캠페인의 전체 공격 체인은 다음과 같다.

[1] 정찰 → [2] SQL 인젝션 → [3] Admin API 키 탈취 → [4] JWT 서명 및 악성 스크립트 주입
→ [5] 2단계 로더 실행 → [6] 클로킹/TDS → [7] FakeCaptcha(ClickFix) → [8] 드로퍼 실행 → [9] 최종 페이로드 배포

3.2 단계별 상세 분석

단계 1: 정찰 및 취약 대상 식별

공격자는 Ghost CMS 버전 3.24.0~6.19.0을 실행하는 인터넷 노출 인스턴스를 식별한다. Ghost CMS는 고유한 응답 헤더와 /ghost/api/content/ 경로의 API 엔드포인트를 통해 식별 가능하며, Shodan, Censys 등의 검색 엔진을 활용할 수 있다.

단계 2: SQL 인젝션 실행

공격자는 다음과 같은 조작된 요청을 전송한다(개념적 예시):

GET /ghost/api/content/tags/?key=KEY&filter=id:TAG_ID,slug:[' OR (SELECT CASE WHEN (<조건>) THEN 1 ELSE json(char(123)) END) > 0 OR slug=']&limit=all

PoC는 약 2,600회의 요청을 통해 관리자 이메일, bcrypt 비밀번호 해시, Admin API 시크릿을 추출할 수 있음을 입증하였다.

단계 3: Admin API 키 탈취

SQL 인젝션을 통해 추출되는 데이터는 다음과 같다:

데이터 유형 테이블 추출 정보
사용자 자격 증명 users 이메일 주소, bcrypt 비밀번호 해시, 역할
API 키 api_keys Admin API 키 ID + 시크릿
세션 시크릿 api_keys / 세션 테이블 JWT 서명에 사용되는 시크릿

단계 4: JWT 서명 및 악성 스크립트 주입

탈취한 Admin API 시크릿으로 JWT를 서명한 후, Ghost Admin API를 통해 게시물 본문 하단에 <script> 로더를 삽입한다.

주입된 1단계 로더의 특징:

  • 경량 JavaScript 로더: 외부 도메인에서 2단계 코드를 런타임에 가져옴
  • base64 인코딩: atob()으로 디코딩된 스크립트의 src를 설정하며, btoa(origin) 태그를 포함하여 C2가 소스 사이트를 핑거프린팅할 수 있도록 함
  • 1회 실행 메커니즘: localStorage 키 ghost_once_footer_<hash>를 사용하여 단일 실행 보장
  • 유연성: 로더를 수정하지 않고도 외부 도메인의 2단계 페이로드를 교체 가능

단계 5: 클로킹 및 트래픽 분배 (TDS)

2단계 페이로드는 상용 클로킹 서비스인 Adspect에서 파생된 트래픽 분배 스크립트(TDS)이다. 이 스크립트는 다음과 같은 브라우저 핑거프린팅 정보를 수집한다.

  • WebGL 벤더/렌더러 정보
  • 타임존
  • 터치 이벤트 지원 여부
  • 콘솔 변조 여부
  • 프레임 상태

수집된 정보는 C2 서버로 전송되며, 19가지 유형의 액션(로컬 실행, fetch, 프록시, 301-307 리다이렉트, iframe, 폼, PHP, JS/eval 등)을 지원한다. 클로킹의 핵심 목적은 보안 스캐너와 크롤러에게는 정상 페이지를 보여주고, 실제 표적에게만 악성 페이로드를 제공하는 것이다.

단계 6: FakeCaptcha (ClickFix) 공격

표적으로 판정된 방문자에게는 iframe을 통해 가짜 Cloudflare "인간 확인" 페이지가 표시된다. 이 페이지는 사용자에게 Windows 실행 대화상자(Win+R)에 명령을 붙여넣도록 유도한다.

구체적 실행 흐름:

  1. setTimeout(500) — 500ms 후 update.zip을 조용히 다운로드
  2. 클립보드에 base64 인코딩된 드로퍼 명령을 미리 설정
  3. 사용자가 Win+R → Ctrl+V → Enter를 실행하면 드로퍼가 실행됨

단계 7: 드로퍼 및 최종 페이로드 배포

드로퍼 명령은 다음과 같은 구조를 가진다:

cmd /c "move ... && tar -xf ... && start /min update.bat"

update.bat / NotepadPlusPlus.cmd는 PowerShell 명령을 실행하여 원격 도메인에서 DLL 파일을 다운로드하고, rundll32.exe로 실행한 후, 사용자에게 YouTube, IPLogger, bc[.]ax/Supp.html 등의 가짜 페이지를 열어 주의를 분산시킨다.

관찰된 최종 페이로드 유형:

페이로드 유형 설명
DLL 로더 Rust 기반 DLL 로더, Storj CDN 또는 taketwolabs[.]com에서 배포
JavaScript 드로퍼 DLL을 JavaScript 페이로드로 대체한 변종
UtilifySetup.exe Electron 기반 자격 증명 탈취 트로이목마, 보고 시점에 VirusTotal 탐지 0건

Electron 기반 스틸러는 세션 토큰, 브라우저 자격 증명, 인증 자료를 수집하도록 설계되었다.

3.3 공격자 클러스터 분석

XLab은 최소 2개의 독립적인 공격자 클러스터가 이 취약점을 악용하고 있음을 확인하였다.

구분 위협 행위자 A (주요) 위협 행위자 B (보조)
C2 인프라 clo4shara[.]xyz/11z77u3.php → com-apps[.]cc/11z77u3.php .pro, .digital, .buzz, .top, .xyz 도메인 로테이션
JS 난독화 base64 + localStorage 1회 실행 키 역문자열 난독화 (reverse-string)
주입 위치 게시물 본문 하단 <script> 로더 /api/css.js 동적 로드
행태 Adspect 클로커 사용, 19개 액션 지원 정리된 사이트 재감염, Actor A의 코드 제거 후 자체 코드 삽입
재감염 사례 bitsy.ai, Harvard International Review (24시간 내 재감염) 동일

두 클러스터가 동일한 도메인을 두고 경쟁하며, 한 클러스터가 다른 클러스터의 주입 코드를 제거하고 자신의 코드를 삽입하는 행태가 관찰되었다.

4. 영향 범위 및 피해 규모

4.1 침해 규모

XLab은 700개 이상의 도메인이 침해되었음을 확인하였다. 피해 기관의 업종별 분포는 다음과 같다.

업종 피해 사례
교육 기관 Harvard University, Oxford University, Auburn University
검색/기술 DuckDuckGo 블로그
커뮤니티/비영리 EuroPython Society
핀테크 다수의 금융 기술 기업
AI/SaaS 인공지능 및 소프트웨어 서비스 기업
Web3/블록체인 블록체인 관련 프로젝트
미디어/보안 미디어 아울렛, 보안 연구 사이트
개인 블로그 다수의 개인 운영 사이트

4.2 영향도 분석

영향 영역 구체적 내용
기밀성 (Confidentiality) 데이터베이스 내 모든 테이블에 대한 임의 읽기 가능: 사용자 이메일, bcrypt 해시, Admin API 키, 세션 시크릿, 사이트 구성 정보
무결성 (Integrity) Admin API를 통한 모든 게시물 일괄 수정, 테마 파일 변경, 관리자 계정 생성, 사이트 설정 변경
가용성 (Availability) 악성 코드 주입으로 인한 사이트 평판 손상, 검색 엔진 블랙리스트 등재, 호스팅 제공업체의 사이트 차단
2차 피해 사이트 방문자(최종 사용자)의 Windows 시스템 감염, 자격 증명 탈취, 세션 토큰 유출

4.3 구조적 취약성: 셀프 호스팅 모델의 패치 지연

Ghost CMS는 SaaS 플랫폼과 달리 셀프 호스팅 모델을 채택하고 있어, 관리자가 직접 업그레이드를 적용해야 한다. 이로 인해 패치가 공개된 후에도 상당 기간 동안 미패치 인스턴스가 잔존하며, 구조적 패치 지연 익스플로잇(patch-lag exploitation) 에 노출된다. 실제로 패치는 2026년 2월 19일에 공개되었으나, 5월까지 대규모 악용이 발생하였다. SentinelOne은 패치 공개 8일 후인 2026년 2월 27일에 이미 활발한 악용을 문서화하였다.

5. 탐지 및 식별

5.1 웹 서버 수준 탐지

탐지 대상 방법
SQL 인젝션 시도 웹 서버 접근 로그에서 filter 파라미터에 slug:[', CASE WHEN, json(char( 패턴 포함 요청 검색
비정상 Admin API 호출 Admin API 접근 로그에서 비인가 IP, 비정상 시간대, 대량 게시물 수정 활동 확인
주입된 스크립트 게시물 본문에서 <script> 태그, atob(, localStorage, ghost_once_footer_ 패턴 검색

5.2 엔드포인트 수준 탐지

탐지 대상 방법
ClickFix 실행 Win+R을 통한 의심스러운 명령 실행, rundll32의 비정상 경로 DLL 로드, PowerShell 다운로드 명령
악성 파일 배포 UtilifySetup.exe, update.bat, NotepadPlusPlus.cmd 파일 생성 모니터링
네트워크 연결 clo4shara[.]xyz, com-apps[.]cc, link.storjshare[.]io, taketwolabs[.]com 등 IoC 도메인 연결 차단

5.3 침해 지표 (IoC)

유형 지표
도메인 clo4shara[.]xyz, com-apps[.]cc, taketwolabs[.]com, link.storjshare[.]io, cloud-verification[.]com
IP 144.31.236[.]66 (다수의 악성 도메인 해석)
파일 UtilifySetup.exe, update.bat, NotepadPlusPlus.cmd, update.zip
레지스트리/파일시스템 C:\ProgramData\cloudflare
JavaScript ghost_once_footer_<hash> (localStorage 키), atob( 기반 동적 스크립트 로드

6. 대응 및 완화 방안

6.1 즉각적 조치 (24시간 이내)

  1. 버전 확인 및 패치 적용
    • Ghost CMS 6.19.1 이상으로 즉시 업그레이드
    • 3.24.0 ~ 6.19.0 버전 사용 중인 모든 인스턴스 식별
  2. Admin API 키 회전(Rotation)
    • 모든 Admin API 키를 즉시 폐기하고 신규 발급
    • Content API 키도 함께 교체 권장
    • 중요: 패치 적용 전이라도 키 회전을 먼저 수행해야 함 — 공격자가 이미 키를 탈취했을 가능성이 있기 때문
  3. 게시물 및 테마 감사
    • 모든 게시물 본문에서 <script> 태그, <iframe> 요소, atob(), localStorage 패턴 검색
    • 테마 파일(.hbs, .js)의 무결성 검증

6.2 단기적 조치 (1주일 이내)

  1. 침해 지표(IoC) 헌팅
    • 웹 서버 접근 로그에서 SQL 인젝션 패턴 검색
    • Admin API 호출 로그에서 비인가 활동 확인
    • 최소 30일간의 Admin API 접근 로그 보존 — 사후 조사 지원을 위해 필수
  2. WAF/리버스 프록시 규칙 적용
    • Content API 요청에서 slug%3A%5B 또는 slug:[ 패턴 차단
    • 단, 이는 임시 완화책이며 정상적인 slug 필터 기능을 손상시킬 수 있음
    • 애플리케이션 수준의 워크어라운드는 존재하지 않음 — Content API 키가 설계상 공개되므로 키 접근 제한은 취약점을 완화하지 못함
  3. 사용자 공지
    • 사이트 방문자에게 ClickFix 공격 가능성 및 의심스러운 명령 실행 금지 안내

6.3 장기적 조치 (지속적)

조치 설명
정기적 패치 관리 Ghost CMS 보안 업데이트 실시간 모니터링, 72시간 내 적용
CSP(Content Security Policy) 적용 인라인 스크립트 실행 차단, 외부 스크립트 로드 제한
SRI(Subresource Integrity) 적용 외부 리소스 무결성 검증
모니터링 강화 Ghost CMS 로그를 SIEM에 통합하여 실시간 이상 탐지
계정 감사 모든 직원 계정 검토, 불필요한 관리자 권한 제거
정기적 보안 감사 게시물 및 테마의 정기적 무결성 검증

7. 결론 및 시사점

CVE-2026-26980은 단일 취약점이 어떻게 다단계 공급망 공격의 진입점이 될 수 있는지를 보여주는 대표적 사례이다. 이 취약점의 핵심 시사점은 다음과 같다.

첫째, 패치 지연의 치명적 결과. 취약점은 2026년 2월 19일에 패치되었으나, 5월까지 대규모 악용이 발생했다. SentinelOne은 패치 공개 8일 후인 2월 27일에 이미 활발한 악용을 문서화했으며, 셀프 호스팅 모델의 구조적 특성으로 인해 수백 개의 사이트가 3개월 이상 미패치 상태로 남아 있었다. 이는 패치 관리의 속도가 곧 보안임을 입증한다.

둘째, 공개 API의 위험성. Content API는 공개적으로 설계된 읽기 전용 인터페이스이지만, 데이터베이스 접근 계층에서의 입력 검증 실패가 전체 시스템 장악으로 이어진다. Content API 키가 테마 HTML에 임베드되는 설계는 편의성을 제공하지만, API 게이트웨이 수준이 아닌 데이터 접근 계층에서의 방어가 필수적임을 보여준다.

셋째, AI 기반 취약점 발견의 부상. 이 취약점은 Anthropic의 Claude가 약 90분의 자율적 코드 분석을 통해 발견하였다. AI 기반 취약점 발견이 전통적인 수동 코드 리뷰를 대체하거나 보완하는 새로운 패러다임으로 자리 잡고 있음을 시사한다.

넷째, 클로킹 및 사회공학의 진화. Adspect 상용 클로킹 서비스를 활용한 트래픽 분배, 브라우저 핑거프린팅, FakeCaptcha를 통한 ClickFix 공격은 공격자들이 보안 스캐너를 회피하면서 신뢰할 수 있는 웹사이트를 통해 최종 사용자를 직접 감염시키는 정교한 전략을 구사하고 있음을 보여준다.

다섯째, CVSS 평가의 다의성. GitHub CNA(9.4)와 NVD(7.5) 간의 심각도 평가 차이는 취약점 평가가 단일 점수로 완전히 포착될 수 없음을 보여준다. 조직은 CVSS 점수뿐 아니라 실제 악용 여부, 공격 체인의 복잡성, 자산의 중요도를 종합적으로 고려해야 한다.