NOW Briefing
Drupal 코어 데이터베이스 API SQL 인젝션 취약점 (CVE-2026-9082)
■ 개요
2026년 5월 20일, Drupal 보안팀은 SA-CORE-2026-004를 공개했습니다. 이 취약점은 코어(CMS 기본 제공 핵심 코드베이스)의 데이터베이스 추상화 API에 존재하는 SQL 인젝션 결함이며, CVE-2026-9082로 등록되었습니다. 영향 범위는 8.9.0부터 11.3.9까지로 넓지만, 실제 취약 대상은 PostgreSQL을 데이터베이스로 사용하는 사이트로 한정됩니다.
해당 취약점은 인증이 필요 없고 공격 복잡도도 낮아, 익명 사용자가 조작된 요청을 보내는 것만으로 임의 SQL을 실행할 수 있습니다. Drupal의 데이터베이스 API는 쿼리를 자동 정제해 인젝션을 차단하도록 설계되었지만, 이번 결함은 해당 보호 설계를 우회합니다. 이로 인해 비공개 데이터 열람, 데이터 변조·삭제가 가능하며, 일부 환경에서는 권한 상승과 RCE까지 이어집니다.
Drupal 보안팀은 5월 18일 보안 공지(PSA-2026-05-18)를 통해 'Highly critical(최고 위험도)' 등급의 취약점 패치 릴리스를 사전 예고했습니다. 이후 CVE 및 세부 정보를 엠바고 상태로 유지하다가, 5월 20일 정식 어드바이저리를 공개했습니다. 공개 후 수 시간에서 수일 내에 익스플로잇이 등장할 수 있다고 경고한 상태이며, 현재 공개된 PoC나 실제 악용 사례는 없습니다. 다만 과거 Drupalgeddon(SA-CORE-2014-005)에서 공개 수 시간 만에 대규모 자동 공격이 시작된 전례가 있어 신속한 대응이 필요합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-9082(SA-CORE-2026-004) |
| CVSS 점수 |
Drupal 자체 위험도 산정 점수 20/25(Highly critical) 공식 CVSS v3.1 점수 미부여(5/21 기준) |
| 취약점 유형 | CWE-89, SQL 인젝션(데이터베이스 추상화 API) |
| 영향/위험 |
- 인증 불필요, 익명 공격자 악용 가능 - 비공개 데이터 열람 등 정보 유출 - 데이터 변조·삭제 가능 - 일부 환경에서 권한 상승·RCE 가능 |
| 취약 버전 | PostgreSQL 사용 시 8.9.0 이상, 각 브랜치의 패치 버전 미만(10.4·10.5·10.6·11.1·11.2·11.3) |
| 패치 버전 | 11.3.10, 11.2.12, 11.1.10, 10.6.9, 10.5.10, 10.4.10(EOL 8.9·9.5는 수동 패치 제공) |
■ 기술 분석
Drupal의 데이터베이스 추상화 API는 직접 SQL을 작성하는 대신 조건과 플레이스홀더로 쿼리를 조립하는 안전 계층입니다. 이번 취약점은 엔티티 쿼리(Entity Query)의 조건 처리 과정에서 발생합니다.
패치 커밋(ea9524d9)에서 수정된 핵심 파일은 PostgreSQL 드라이버의 core/modules/pgsql/src/EntityQuery/Condition.php입니다. 코어의 Entity/Query/Sql/Condition.php와 ConditionAggregate.php에도 동일한 보정이 추가되었습니다.
문제의 원인은 조건 값 배열을 순회할 때 배열 키를 그대로 신뢰해 쿼리 조립에 사용한 것입니다. 공격자가 요청을 통해 배열 키를 조작하면, 정상적인 정수 인덱스 대신 악의적인 값이 쿼리 생성 로직에 흘러 들어갑니다. 이 경로는 PostgreSQL 백엔드에서만 인젝션으로 이어집니다.
수정 방식은 array_values()로 키를 0부터의 연속 정수로 다시 인덱싱하는 것입니다. 외부에서 주입된 비정상 키가 쿼리 생성 로직에 도달하지 못하도록 차단합니다. PostgreSQL 드라이버에서는 순회 자체를 array_values()로 감쌌고, 코어 조건 클래스에는 배열 정규화를 별도로 추가해 모든 백엔드에 보안 조치를 적용했습니다. 배열 키 주입을 통한 SQL 인젝션이라는 점에서 Drupalgeddon 계열 결함과 구조적으로 유사한 패턴입니다.
// core/modules/pgsql/src/EntityQuery/Condition.php
/* [패치 전] */
foreach ($condition['value'] as $key => $value) {
// 배열의 키를 그대로 신뢰해 조건 조립에 사용
}
/* [패치 후] */
foreach (array_values($condition['value']) as $key => $value) {
// 키를 0부터의 정수로 재인덱싱하여 주입 차단
}
/* [패치 후] 코어 측 정규화 (Entity/Query/Sql/Condition.php) */
if (is_array($condition['value'])) {
$condition['value'] = array_values($condition['value']);
}
■ 탐지 및 점검
✅ CHECK
가장 먼저 데이터베이스 드라이버가 PostgreSQL인지 확인합니다. PostgreSQL이 아니면 이 취약점의 직접 대상이 아닙니다.
• 사이트 상태 보고서나 drush status에서 데이터베이스 드라이버가 pgsql인지 확인합니다.
• composer show drupal/core로 코어 버전을 확인하고, 해당 브랜치의 패치 버전 미만이면 노출 상태로 간주합니다.
• 익명 접근 경로의 웹 로그에서 UNION SELECT, pg_sleep, information_schema 등 비정상 파라미터 패턴을 점검합니다.
• PostgreSQL 서버 로그에서 syntax error 급증과 pg_catalog·information_schema에 대한 비정상 조회를 확인합니다.
• 침해가 의심되면 신규 관리자 계정, users·권한 테이블 변조, 예약 작업·PHP 파일 생성 여부를 점검합니다.
■ 대응 방안
💡 TIP
이번 릴리스에는 SQL 인젝션 패치 외에 Twig 3.26.0, Symfony 7.4.12 보안 업데이트가 함께 포함됩니다.
부분 수정이 아니라 코어 전체를 패치 버전으로 올려야 모든 수정이 반영됩니다.
• PostgreSQL 사이트는 즉시 해당 브랜치의 패치 버전(11.3.10·11.2.12·11.1.10·10.6.9·10.5.10·10.4.10)으로 업데이트합니다.
• 즉시 패치가 어려우면 WAF(Web Application Firewall, 웹 방화벽)에서 익명 요청의 SQL 인젝션 패턴을 차단하고, 익명 접근 경로의 외부 노출을 최소화합니다.
• EOL 상태인 8.9·9.5 사이트는 공식 수동 패치를 적용한 뒤 지원 버전으로 마이그레이션을 계획합니다.
• 패치 후에도 공개 이전 침해 가능성을 고려해 관리자 자격 증명·세션·API 키를 교체하고 로그를 소급 점검합니다.
[참고 자료]
Drupal.org, Drupal 11.3.10 릴리스



