Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Wildfire — CVE-2026-39154, CometChat JS SDK의 저장형 XSS | Kitploit
도구/GitHubGitHub/defineid/wildfire
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingPayload DevelopmentAPI Security
GitHubdefineid/wildfire

Wildfire

CVE-2026-39154, CometChat JS SDK의 저장형 XSS

저장소 보기
252개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39154 · CometChat 그룹 메시지의 저장형 XSS (JS SDK 3.0.12)

이 디렉터리에는 CVE-2026-39154의 배후에 있는 렌더 싱크(render sink) 를 정직하고 자기 완결적인 방식으로 재현한 내용이 담겨 있습니다. 이는 CometChat JavaScript SDK 3.0.12의 저장형 크로스 사이트 스크립팅 결함으로, 그룹 메시지의 data.text 필드가 컨텍스트에 맞는 출력 인코딩 없이 다른 멤버들의 클라이언트에 렌더링되는 문제입니다.

이것은 전적으로 로컬에서 합성 데이터로 실행됩니다. 실제 CometChat 서비스나 어떤 제3자에도 접속하거나, 탐지하거나, 인증하지 않습니다. 이는 취약한 클라이언트 렌더 경로만을 보여주는 로컬 데모입니다.

일치하는 PoC 저장소(라이드업에 명시됨): https://github.com/defineid/Wildfire 라이드업: 이 포트폴리오의 writeup-cometchat-xss.html.

사실 관계 (라이드업 / 권고문에 기재된 대로)

필드값
CVECVE-2026-39154
벤더 / 제품CometChat · JavaScript SDK 3.0.12
분류저장형 크로스 사이트 스크립팅 (CWE-79)
엔드포인트POST /v3.0/messages · 주입 필드 data.text
수신자receiverType: group
상호작용없음; 멤버가 그룹을 열면 저장된 페이로드가 자동 실행됨
공개2026년 2월 CometChat에 보고됨 (요청 42660); 벤더가 Solved로 표시; CVE는 MITRE가 할당
참조https://www.cve.org/CVERecord?id=CVE-2026-39154

수정 버전에 관한 참고: 공개된 라이드업은 벤더가 문제를 해결했다고("VENDOR: SOLVED") 명시하고 있으나, 구체적인 수정 SDK/빌드 번호를 명시하지 않으며, 위의 CVE 레코드 외에 별도의 벤더 권고문 URL도 제시되지 않습니다. 라이드업이 제공하지 않으므로 여기서도 수정 버전 번호를 단정하지 않습니다.

메커니즘 (구체적인 필드와 싱크)

CometChat TextMessage는 텍스트를 data.text에 담아 전달하며, 이는 UI 코드에 message.getText()로 노출됩니다. 인증된 멤버는 그룹에 data.text에 HTML 마크업이 포함된 메시지를 보낼 수 있습니다. 예를 들면 다음과 같습니다:

POST /v3.0/messages
{
  "receiverType": "group",
  "receiver": "<groupId>",
  "category": "message",
  "type": "text",
  "data": { "text": "" }
}

플랫폼은 해당 문자열을 그대로 저장합니다. 그룹 구성원 누구든 대화를 열면, 클라이언트의 메시지 목록 렌더링 경로가 data.text를 가져와 HTML로, 컨텍스트 출력 인코딩 없이 DOM에 삽입합니다(textContent 쓰기가 아닌 innerHTML 방식의 쓰기). 따라서 `` 마크업이 파싱되며, src=x가 로드에 실패하면서 onerror 핸들러가 실행되고, 공격자의 스크립트가 피해자의 세션에서 실행됩니다. 메시지가 저장되기 때문에 이는 지속적이며, 피해자는 그룹을 조회하는 것 외에 아무런 상호작용도 필요하지 않습니다.

공개된 수정 사항은 이 필드를 정화/컨텍스트 인코딩하므로, 동일한 입력이 실행되지 않고 무해한 텍스트로 렌더링됩니다.

위협 모델

인증된 그룹 구성원이 공격자이며, 피해자는 해당 그룹의 다른 구성원들입니다. 페이로드는 한 번 전달되어 서버 측에 저장되고, 구성원들이 대화를 조회할 때 각자의 브라우저에서 자동으로 실행됩니다. 클릭, 권한 부여, 추가 상호작용은 필요하지 않습니다. 원본 보고서에서의 영향: 각 구성원의 세션에서 임의 스크립트 실행(세션/토큰 탈취, 피해자 대신 수행되는 행위, 대화 데이터 노출).

이 디렉터리의 내용

  • repro.html — 오직 취약한 SDK 3.0.12 렌더링 경로만을 대표하는 최소한의 로컬 페이지(순수 흰색, 최소한의 CSS, 간단한 메시지 목록 영역)입니다. 정화되지 않은 싱크의 충실한 로컬 사본을 담고 있습니다:

    function getText(message){ return message.data.text; }   // mirrors TextMessage#getText()
    ...
    body.innerHTML = getText(message);   // *** the SDK 3.0.12 sink, reproduced ***
    

    이 싱크를 통해 합성 저장 메시지 객체를 렌더링하여 주입된 스크립트가 로컬에서 실행되도록 합니다. 페이지의 인라인 정직한 주석에는 이것이 SDK 3.0.12 싱크의 로컬 재현이며, 수정된 SDK는 해당 필드를 정제하고, 실제 CometChat 서비스는 관여하지 않는다고 명시되어 있습니다.

  • payload.json — 합성 저장된 TextMessage 객체입니다. 해당 data.text 필드가 주입 지점입니다(JSON에는 주석이 없으므로 _injection_point / _note 키로 주석 처리됨). 주입 벡터(``)는 공개된 보고서와 동일하며, 동작은 무해한 페이지 내 마커로 변경되었습니다.

  • payload.txt — 동일한 주입을 일반 텍스트로 문서화한 것으로, 원래 조작된 요청을 포함하며 어디로도 전송되지 않는다는 명시적 주석이 있습니다.

이 repro.html은 분석 글의 메커니즘을 바탕으로 작성된 최소한의 대체물입니다. 벤더의 소스 코드에서 추출한 것이 아닙니다; 실제 SDK는 이 재현을 위해 입수하거나 디스어셈블하지 않았습니다.

로컬 재현의 작동 방식과 실행 방법

이 재현의 페이로드는 무해합니다: alert(document.domain) 대신 onerror 핸들러가 window.__xss_fired = true를 설정하고, 페이지에 RESULT: XSS-FIRED를 기록하며, 문서 제목을 설정합니다. 어떤 것도 유출되지 않습니다.

cd poc/CVE-2026-39154
python3 -m http.server 5599
# then open http://localhost:5599/repro.html in a browser

repro.html은 저장된 메시지의 내장 복사본을 동기적으로 렌더링하여(헤드리스 캡처 환경에서도 싱크가 결정적으로 실행되도록) payload.json을 추가로 가져와 디스크상의 아티팩트가 로드되고 동일한 필드를 포함하는지 확인합니다.

예상 결과

  • 메시지 행에는 깨진 이미지 아이콘이 표시되고(``가 텍스트로 표시되지 않고 HTML로 파싱됨), 페이지에는 빨간색으로 **RESULT: XSS-FIRED**가 표시됩니다. 이는 주입된 onerror 스크립트가 정화되지 않은 innerHTML 싱크를 통해 실행되었음을 증명합니다.
  • 수정된 SDK에서는 동일한 data.text가 인코딩되어 스크립트 실행 없이 리터럴 텍스트 ``로 표시됩니다.

검증 상태

  • 이 환경에서 완료됨: 로컬 재현이 실제로 실행되었습니다. payload.json은 올바른 형식의 JSON으로 검증되었으며 data.text에 주입(벡터)이 포함되어 있음이 확인되었습니다. 디렉터리는 `python3 -m http.server 5599`로 제공되었고, `repro.html`은 `--screenshot`을 통해 **Firefox 140.11.0esr 헤드리스**에서 로드되었습니다(여기에 `repro-screenshot.png`로 저장됨). 캡처된 스크린샷은가 깨진 이미지 요소로 렌더링됨(즉, data.text가 텍스트로 표시되지 않고 HTML로 파싱됨)과 RESULT: XSS-FIRED가 DOM에 기록됨을 보여줍니다. 이는 정화되지 않은 innerHTML 싱크가 메시지 필드에서 주입된 스크립트를 실행함을 확인합니다.
  • 이 환경에서 완료되지 않음: 라이브 CometChat 서비스나 제3자와의 상호작용은 발생하지 않았습니다. /v3.0/messages로 전송된 것은 없으며, 계정이나 그룹이 사용되지 않았고, 실제 SDK 빌드가 다운로드, 실행 또는 디스어셈블되지 않았습니다. 여기의 싱크는 벤더가 배포한 코드가 아니라 분석 문서에 설명된 메커니즘을 기반으로 한 충실한 수작업 대체 구현입니다. 분석 문서에 명시되어 있지 않아 정확한 수정 SDK 버전은 확인되지 않았습니다.

범위 및 윤리

이는 합성된 자체 생성 데이터만을 사용한 로컬 오프라인 재현으로, 이미 보고되어 벤더가 해결한 CVE를 문서화하기 위해 작성되었습니다. 라이브 또는 제3자 시스템이 아닌 취약한 렌더링 경로의 로컬 대체 구현을 대상으로 합니다. 페이로드는 무해한 페이지 내 마커이며, 해당 필드가 정화되지 않은 채 렌더링됨을 입증하는 것 외에 유출이나 무기화는 포함하지 않습니다.

도구 다운로드