
CVE-2026-9809는 Mautic 7(버전 7.0.0~7.1.1)에 영향을 미치는 저장형 교차 사이트 스크립팅(Stored XSS) 취약점입니다.
CVE-2026-9809는 Mautic 7(버전 7.0.0~7.1.1)에 영향을 주는 저장형 크로스 사이트 스크립팅(Stored XSS) 취약점입니다. 이 결함은 Projects 구성 요소에 존재하며, 프로젝트 이름이 관리자 페이지(캠페인, 이메일, 양식 등)에서 태그 및 호버 팝오버로 표시될 때 적절한 출력 무해화 없이 렌더링됩니다. 프로젝트를 생성하거나 편집할 수 있는 권한이 있는 인증된 사용자는 프로젝트 이름에 악성 HTML/JavaScript를 저장할 수 있습니다. 이후 관리자가 해당 프로젝트와 연결된 엔티티를 보고 태그 위에 마우스를 올리면 관리자 브라우저에서 악성 스크립트가 실행됩니다.
| 속성 | 값 |
|---|---|
| 제품 | Mautic |
| 영향받는 버전 | 7.0.0 – 7.1.1 |
| 수정된 버전 | 7.1.2 |
| 영향받는 구성 요소 | 프로젝트 (태그 및 팝오버) |
애플리케이션은 인증된 사용자가 제공한 프로젝트 이름을 저장합니다. 이후 관리자 페이지에서 프로젝트 태그와 팝오버 콘텐츠가 렌더링될 때, 저장된 값은 적절한 출력 인코딩이나 무해화 없이 HTML에 삽입됩니다.
개념적으로는 다음과 같습니다.
User creates project
│
▼
Project name stored in database
│
▼
Administrator opens Campaign / Email / Form
│
▼
Project tag & popover rendered
│
▼
Project name inserted into HTML without sanitization
│
▼
Browser executes embedded JavaScript
브라우저는 프로젝트 이름을 일반 텍스트로 처리하지 않고 HTML로 해석하므로 포함된 JavaScript가 실행될 수 있습니다.
Attacker
│
▼
Creates a project with a malicious project name
│
▼
Payload stored in database
│
▼
Administrator views Campaign / Email / Form
│
▼
Administrator hovers over the project tag
│
▼
Popover renders unsanitized project name
│
▼
Browser executes JavaScript
│
▼
Actions performed with administrator's privileges
인증된 사용자가 일반 텍스트 대신 HTML을 포함하는 이름으로 프로젝트를 생성한다고 가정해 보겠습니다.
애플리케이션이 입력 시 프로젝트 이름을 무해화하지 않으므로 프로젝트는 성공적으로 저장됩니다.
이후 관리자가 해당 프로젝트와 연결된 캠페인을 엽니다. 관리자가 프로젝트 태그 위에 마우스를 올리면 애플리케이션은 저장된 프로젝트 이름을 사용하여 팝오버를 생성합니다. 이 콘텐츠는 적절한 출력 인코딩 없이 페이지에 삽입되므로 브라우저는 이를 일반 텍스트가 아닌 HTML로 해석하고, 그 결과 포함된 JavaScript가 관리자의 세션에서 실행됩니다.
성공적인 악용 시 공격자는 다음을 수행할 수 있습니다.
이 취약점은 주로 기밀성과 무결성에 영향을 미칩니다.
| 메트릭 | 점수 |
|---|---|
| CVSS v3.1 (CNA) | 7.6 (높음) |
NVD는 아직 자체 CVSS 평가를 게시하지 않았으며, 현재 점수는 Mautic CNA가 제공한 것입니다.
참고: 공급업체는 정확한 취약 소스 코드를 공개하지 않았습니다. 다음은 취약점 패턴을 보여 줍니다.
// Project name retrieved from the server
const projectName = response.project.name;
// Unsafe: inserts user-controlled HTML
popover.innerHTML = `
<span class="project-tag">
${projectName}
</span>
`;
innerHTML은 브라우저가 저장된 프로젝트 이름을 HTML로 파싱하도록 만듭니다. 프로젝트 이름에 JavaScript 이벤트 핸들러가 있는 HTML 요소가 포함된 경우, 브라우저는 팝오버를 렌더링할 때 이를 실행합니다.
const tag = document.createElement("span");
tag.className = "project-tag";
// Safe: treat input as plain text
tag.textContent = response.project.name;
popover.replaceChildren(tag);
textContent를 사용하면 프로젝트 이름이 HTML이 아닌 리터럴 텍스트로 처리됩니다. HTML 특수 문자는 브라우저에 의해 해석되지 않고 표시되므로 포함된 스크립트의 실행을 방지합니다. HTML 렌더링이 필요한 경우 개발자는 삽입 전에 잘 관리되는 HTML 무해화 도구를 사용하여 신뢰할 수 없는 콘텐츠를 무해화해야 합니다.