CVE-2023-3532
Threat Intelligence Report: CVE-2023-3532
Executive Summary
CVE-2023-3532 is a stored cross-site scripting (XSS) vulnerability affecting the Outline knowledge base and wiki platform (GitHub repository: outline/outline) in versions prior to 0.70.1. An authenticated attacker with the ability to create or edit content within an Outline instance can inject malicious JavaScript that executes in the browsers of other users who view the affected content. With a CVSS score of 8.5, successful exploitation enables session hijacking, credential theft, and potential full account takeover of privileged users, including workspace administrators.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
Vulnerability Class: Stored Cross-Site Scripting (XSS) — CWE-79
Affected Product: Outline is a collaborative knowledge base and wiki platform, commonly deployed as a self-hosted web application. The application is built on Node.js and React, providing rich-text editing capabilities to users. The vulnerability exists in the handling of user-generated content within the application's document/wiki system.
Vulnerability Mechanism: The issue constitutes a stored XSS flaw, meaning that the injected malicious payload is persistently stored on the server (within the application's database) and subsequently delivered to all users who access the affected content. Unlike reflected XSS (which requires a victim to click a crafted link), stored XSS requires no further interaction from the victim beyond viewing the compromised page or document.
Attack Surface: The attack surface includes any portion of the application where user-supplied content is rendered without adequate sanitization or output encoding. In the context of Outline, this includes document bodies, comments, and potentially other user-controlled fields within the wiki interface. The attack requires an authenticated account with permission to create or edit content — in most deployments, this would be any standard user account.
Technical Details: The NVD description provides minimal implementation-specific information, stating only that the vulnerability exists "prior to 0.70.1." Insufficient technical detail is available regarding the exact sanitization bypass or vulnerable rendering function. The vulnerability class (stored XSS) indicates a failure to properly neutralize or encode user-supplied input during server-side processing and subsequent HTML rendering. The application likely fails to sanitize certain HTML tags, attributes, or event handlers within rich text content, allowing JavaScript to be executed in the context of the victim's session.
CVSS Analysis: The CVSS score of 8.5 (High) with vector components indicating: Network attack vector (AV:N), Low attack complexity (AC:L), Low privilege requirements (PR:L), User interaction required (UI:R), Changed scope (S:C), High confidentiality impact (C:H), High integrity impact (I:H), and No availability impact (A:N). The changed scope indicates the vulnerability can impact resources beyond the vulnerable component's security scope, and the high confidentiality/high integrity impacts reflect the severe consequences of stored XSS in a collaborative workspace context.
Exploitation Scenarios
Important note: No public proof-of-concept (PoC) code is currently available, and no Nuclei templates or exploit code have been identified. The attack chain below is inferred from the vulnerability class and standard stored XSS exploitation methodology.
Step 1 — Reconnaissance and Target Identification: An attacker identifies a self-hosted Outline instance that may be running a vulnerable version (< 0.70.1). This can be accomplished through internet-wide scanning for Outline-specific headers, favicon hashes, or login page indicators. Shodan queries such as http.title:"Outline" or product:"Outline" can aid discovery. The attacker may also attempt to finger posture the application's version by examining page source, API responses, or publicly accessible version indicators.
Step 2 — Gaining Authenticated Access: The attacker must have (or obtain) an account on the target Outline instance. This could involve registering a new account if the instance allows self-registration (common in corporate deployments where SSO is configured), or using compromised credentials obtained through other means such as data breaches, phishing, or credential stuffing against the authentication endpoint.
Step 3 — Injecting the Stored Payload: Once authenticated, the attacker creates a new wiki document or comment and embeds a malicious JavaScript payload within the content. The payload could be hidden in:
- HTML elements with event handler attributes (e.g.,
onmouseover,onload) - JavaScript URLs in link elements
- Malformed HTML constructs designed to bypass input sanitization
- SVG or media elements containing executable code
The payload is submitted through the normal document creation/editing interface. Due to the stored XSS vulnerability, the application stores the malicious content without proper sanitization or fails to neutralize the dangerous elements during rendering.
Step 4 — Victim Interaction and Execution: Any user (including administrators) who views the malicious document triggers the JavaScript payload in their browser session. The payload executes in the context of the Outline application's origin (the victim's authenticated session), granting the attacker:
- Session Hijacking: The malicious script can capture the victim's session tokens or cookies and exfiltrate them to an attacker-controlled server (e.g., via a
fetch()orXMLHttpRequestcall to an external IP). - Credential Theft: The script can inject a fake login form or redirect to a credential-phishing page, harvesting the victim's plaintext credentials.
- Account Takeover: With admin credentials or session information, the attacker can escalate privileges, modify workspace settings, extract sensitive documents, create backdoor accounts, or exfiltrate the entire knowledge base.
- Lateral Movement: The stolen session or credentials could be used to access integrated services (e.g., Slack, Google Workspace, GitHub) if the Outline instance uses SSO and the attacker compromises the primary identity.
Post-Exploitation Impact: Stored XSS in a knowledge management platform is particularly damaging because wiki content is designed to be widely read. A single malicious document can spread the payload to every user who accesses it, potentially compromising the entire organization's knowledge base integrity. The attacker could also leverage the compromised session to modify other documents, planting further malicious content, or to access connected applications through OAuth token reuse.
Impact Assessment
Business Impact: Outline serves as a central knowledge repository, often containing sensitive intellectual property, internal procedures, credentials, architecture decisions, and employee information. Successful exploitation can result in:
- Confidential Data Exposure (High): CVSS confidentiality impact is rated High (C:H). The attacker gains access to all documents visible to the compromised user, potentially including restricted content.
- Data Integrity Compromise (High): CVSS integrity impact is rated High (I:H). The attacker can modify or delete content, plant additional malicious code, or corrupt the knowledge base.
- Operational Disruption: While availability impact is rated None (A:N), the aftermath of remediation (content review, credential rotation, incident response) will cause operational downtime.
- Regulatory and Compliance Impact: Organizations subject to GDPR, HIPAA, or other data protection regulations face potential fines and notification obligations if the knowledge base contains personal data.
- Supply Chain Risk: The compromised knowledge base may be used to distribute further malicious instructions (e.g., typosquatting, social engineering) to teams that rely on Outline for operational guidance.
Affected Systems: All self-hosted Outline deployments running versions prior to 0.70.1. Per the vendor's project lifecycle, some versions may have reached end-of-life and will not receive the patch.
Blast Radius: Given the collaborative nature of the platform, the blast radius is organization-wide. Any authenticated user can trigger the vulnerability, and any document reader can be affected. The CVSS scope change (S:C) indicates the vulnerability can impact resources beyond the outline application itself — potentially affecting connected identity providers, file storage systems, or downstream integrations.
EPSS Note: The EPSS (Exploit Prediction Scoring System) score is 0.00495 (39.9th percentile), indicating a relatively low probability of exploitation in the wild within the next 30 days. However, stored XSS in widely deployed collaboration tools tends to have a longer exploitation lifecycle, and the score may rise as PoC becomes available.
Detection Guidance
Sigma Rule
title: Potential Stored XSS Exploitation Attempt Against Outline Knowledge Base
id: 1a2b3c4d-5e6f-7a8b-9c0d-ef1234567890
status: experimental
description: Detects suspicious document creation or content modification requests to Outline that may contain XSS payload indicators
author: Valtersit Threat Intelligence
date: 2024/01/15
tags:
- attack.t1190
- attack.t1059.007
- cve.2023.3532
logsource:
category: webserver
product: nginx
definition: Web server access logs for Outline application instances
detection:
selection_paths:
cs-method:
- 'POST'
- 'PUT'
- 'PATCH'
cs-uri-stem:
- '/api/documents.create'
- '/api/documents.update'
- '/api/documents.*'
- '/api/comments.create'
selection_payload:
cs-uri-query|contains:
- '<script'
- 'javascript:'
- 'onerror='
- 'onload='
- 'onclick='
- '<img'
- '<svg'
- 'data:text/html'
- 'document.cookie'
- 'fetch('
condition: selection_paths and selection_payload
timeframe: 5m
level: high
falsepositives:
- Legitimate rich text formatting may include some HTML tags
- Development or testing activities on the platform
fields:
- clientip
- cs-uri-stem
- cs-uri-query
- cs-user-agent
- cs-referer
YARA Rule
rule CVE_2023_3532_Outline_Stored_XSS_Payload
{
meta:
author = "Valtersit Threat Intelligence"
description = "Detects potential XSS payloads targeting Outline knowledge base"
date = "2024-01-15"
cve = "CVE-2023-3532"
score = 60
reference = "https://nvd.nist.gov/vuln/detail/CVE-2023-3532"
strings:
$xss_pattern_1 = /<script[\s>]/ nocase
$xss_pattern_2 = /javascript\s*:/ nocase
$xss_pattern_3 = /on(?:error|load|click|mouseover)\s*=/ nocase
$xss_pattern_4 = /<iframe[\s>]/ nocase
$xss_pattern_5 = /document\.(?:cookie|location|domain)/ nocase
$xss_pattern_6 = /fetch\s*\(\s*["']/ nocase
$xss_pattern_7 = /XMLHttpRequest/ nocase
$xss_pattern_8 = /eval\s*\(/ nocase
$xss_pattern_9 = /atob\s*\(/ nocase
$xss_pattern_10 = /<img[^>]+src\s*=\s*["']?x/ nocase
$xss_pattern_11 = /svg[^>]*onload/ nocase
$xss_pattern_12 = /data:text\/html/ nocase
$outline_pointer_1 = /api\/documents/ nocase
$outline_pointer_2 = /api\/comments/ nocase
$outline_pointer_3 = /outline/ nocase
condition:
uint16(0) == 0x0B8A or // HTML file magic bytes (approximation)
filesize < 2MB and
2 of ($xss_pattern_*) and
(1 of ($outline_pointer_*) or 1 of ($xss_pattern_*))
}
Suricata IDS Rule
alert http any any -> $HOME_NET any (msg:"CVE-2023-3532 - Outline Document Update with Event Handler Attributes; flow:to_server,established; http.method; content:"PUT" or content:"PATCH"; http.uri; content:"/api/documents"; http.request_body; content:"onerror"; nocase; http.request_body; content:"="; http.request_body; content:"fetch"; nocase; classtype:web-application-attack; sid:1003533; rev:1; metadata:cve CVE-2023-3532;)```
### Elastic Detection (EQL)
```eql
// Detect document creation/update requests with XSS payload indicators
sequence by source.ip with maxspan=5m
[network where event.category == "web" and
http.request.method in ("POST", "PUT", "PATCH") and
url.path matches "/api/documents*" or url.path matches "/api/comments*"
]
[network where event.category == "web" and
wildcard(http.request.body.text, "*<script*") or
wildcard(http.request.body.text, "*javascript:*") or
wildcard(http.request.body.text, "*onerror=*") or
wildcard(http.request.body.text, "*onload=*") or
wildcard(http.request.body.text, "*fetch(*") or
wildcard(http.request.body.text, "*XMLHttpRequest*")
]
// Detect exfiltration attempts from Outline application context
sequence by process.entity_id with maxspan=1m
[process where event.action == "exec" and process.name == "chrome" or process.name == "firefox" or process.name == "safari"]
[network where event.category == "network" and
network.direction == "egress" and
destination.address != "127.0.0.1" and
not cidrMatch(destination.ip, "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16") and
process.name == "chrome" or process.name == "firefox"]
Splunk SPL Query
index=web sourcetype=access_combined
(method=POST OR method=PUT OR method=PATCH)
(uri_path="/api/documents.create" OR uri_path="/api/documents.update" OR uri_path="/api/documents.*" OR uri_path="/api/comments.*")
(
form_data IN ("*<script*", "*javascript:*", "*onerror=*", "*onload=*", "*onclick=*", "*fetch(*") OR
uri_query IN ("*<script*", "*javascript:*") OR
payload IN ("*<script*", "*javascript:*")
)
OR
index=proxy sourcetype=pan:traffic
url IN ("*outline*", "*api/documents*", "*api/comments*")
(
url IN ("*<script*", "*javascript:*", "*onerror=*") OR
http_content_type="text/html" AND
response_body IN ("*<script*alert*", "*document.cookie*", "*fetch*http*")
)
| eval threat_score = case(
match(form_data, "(?i)javascript:"), 8,
match(form_data, "(?i)onerror="), 7,
match(form_data, "(?i)<script"), 6,
match(form_data, "(?i)document.cookie"), 9,
true, 0
)
| where threat_score >= 6
| table _time, src_ip, user, uri_path, method, threat_score, form_data
| sort - _time
Wazuh OSSEC Rule
<group name="web,outline,cve_2023_3532,">
<rule id="100352" level="12">
<decoded_as>web</decoded_as>
<description>CVE-2023-3532: Potential stored XSS payload in Outline document submission</description>
<field name="url">/api/documents.(create|update)</field>
<field name="method">POST|PUT|PATCH</field>
<regex>(\<script|\<img|onerror=|onload=|javascript:|fetch\(|XMLHttpRequest|document\.cookie)</regex>
<group>web_application_attack,outline,xss,</group>
<mitre>
<id>T1190</id>
</mitre>
<alert>outline_xss_payload</alert>
<options>no_full_log</options>
</rule>
<rule id="100353" level="10">
<decoded_as>web</decoded_as>
<description>CVE-2023-3532: Potential XSS payload in Outline comment</description>
<field name="url">/api/comments.(create|update)</field>
<field name="method">POST|PUT|PATCH</field>
<regex>(\<script|\<iframe|javascript:|onerror=|onload=)</regex>
<group>web_application_attack,outline,xss,</group>
<mitre>
<id>T1190</id>
</mitre>
<alert>outline_xss_comment_payload</alert>
<options>no_full_log</options>
</rule>
<rule id="100354" level="14">
<if_sid>100352,100353</if_sid>
<decoded_as>web</decoded_as>
<description>CVE-2023-3532: Repeated XSS payload attempts against Outline - possible exploitation in progress</description>
<group>web_application_attack,outline,xss,repeated_attempt,</group>
<frequency>5</frequency>
<timeframe>60</timeframe>
<same_source_ip/>
<alert>outline_xss_attempts</alert>
<options>no_full_log</options>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 0/4 — UNPATCHED — no patch evidence from any tracked source. The vendor (outline/outline) has not been observed publishing an official security advisory or patch release for CVE-2023-3532 at the time of this report. The safe version threshold (0.70.1) is derived from the NVD metadata indicating the vulnerability exists "prior to 0.70.1."
1. Immediate Mitigations (to apply while awaiting official patch)
- Upgrade to Version 0.70.1 or Later: If version 0.70.1 or a subsequent release is available, upgrade immediately. This is the only definitive remediation identified. Test the upgrade in a staging environment before production deployment.
- Restrict Registration: If self-registration is enabled, disable it to reduce the attack surface. Require admin approval or SSO enforcement for all new accounts.
- Apply Web Application Firewall (WAF) Rules: Deploy WAF rules to block common XSS payload patterns in POST/PUT/PATCH requests to API endpoints (e.g.,
<script,javascript:, event handler attributes). This provides a stopgap but is NOT a complete fix; WAF bypasses are well-documented. - Enforce Content Security Policy (CSP): Configure a strict CSP header (e.g.,
default-src 'self'; script-src 'self') to limit the impact of any injected script. This does not prevent the injection but can block execution of external scripts. - Monitor for Unusual Document Activity: Actively review recently created/modified documents for suspicious HTML or JavaScript content. Consider temporary read-only mode for non-admin users.
- Principle of Least Privilege: Review user roles and restrict edit permissions to only those who require them. Reduce the potential population of attackers who can trigger the vulnerability.
2. Patch/Upgrade Steps
- Monitor the official outline/outline GitHub repository (https://github.com/outline/outline) for release announcements and security advisories.
- Test version 0.70.1 or later in a staging environment, verifying all integrations (SSO, document import/export, external storage) continue to function.
- If a newer patched version is released, apply it in production during a scheduled maintenance window.
- After upgrading, audit the knowledge base for any pre-existing injected content or suspicious modifications.
- If the deployment is managed through container orchestration (Docker/Kubernetes), ensure the image tag is updated to the patched version.
3. Long-Term Hardening
- Input Sanitization: Implement server-side HTML sanitization (e.g., allowlist-based sanitizer) even if the vendor addresses this specific issue. Defense-in-depth protects against future bypasses.
- Regular Security Audits: Periodically audit the Outline instance for unauthorized accounts, unusual content changes, and excessive permissions.
- Network Segmentation: Place the Outline instance behind an internal network boundary if it is only intended for internal use. Restrict external access unless explicitly required.
- Session Security: Ensure session cookies have the
HttpOnlyandSecureattributes, and enforce short session lifetimes to reduce the window for session hijacking. - Application Monitoring: Implement robust logging and alerting for authentication events, document modifications, and abnormal API patterns. Use the detection rules provided above.
- Vendor Engagement: Subscribe to outline/outline security notifications and participate in the project's security disclosure process. If this vulnerability remains unpatched after a reasonable timeframe, consider engaging the project maintainers directly or exploring mitigating configuration changes.
References
- NVD Entry for CVE-2023-3532 — https://nvd.nist.gov/vuln/detail/CVE-2023-3532
- outline/outline GitHub Repository — https://github.com/outline/outline
- huntr.dev Vulnerability Listing — https://huntr.com/bounties/ (search for CVE-2023-3532)
- CWE-79: Cross-site Scripting (XSS) — https://cwe.mitre.org/data/definitions/79.html
- MITRE ATT&CK Technique T1190: Exploit Public-Facing Application — https://attack.mitre.org/techniques/T1190/
Disclaimer: No known threat actor campaigns or exploit-in-the-wild evidence has been identified for CVE-2023-3532 as of the writing of this report. The EPSS score indicates low near-term exploitation probability; however, stored XSS vulnerabilities in collaboration platforms often see delayed exploitation windows as no public PoC has been released. Security teams are advised to prioritize patching and monitoring per the guidance above.
Report generated by Valtersit Threat Intelligence — January 2024.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.