CVE-2026-73038
Executive Summary
CVE-2026-73038 is a stored cross-site scripting (XSS) vulnerability in NodeBB, an open-source forum platform, affecting all versions prior to 4.15.0. The flaw exists in the renderEmoji function, which fails to escape the tag.icon.url and tag.name attributes when rendering emoji tags, allowing remote attackers to inject arbitrary HTML and JavaScript into stored post content via crafted ActivityPub Create/Note objects. Successful exploitation executes attacker-controlled code in the browsers of every user who views the affected post, enabling session hijacking, account takeover, and tampering with forum content.
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
NodeBB is a widely deployed community forum platform that supports federation using the ActivityPub protocol. In federated deployments, remote instances exchange post content — typically ActivityPub Create activities wrapping Note objects — without requiring the recipient to create an account or authenticate for ingestion. This inbound-federation trust model substantially widens the attack surface, because any user of any federated instance can deliver content to the target platform.
The vulnerability is localized to the renderEmoji function. When NodeBB renders post content, emoji tags are processed and converted into HTML. According to the NVD description, the rendering path fails to escape two attributes of the emoji tag: tag.icon.url and tag.name. These attributes are part of the ActivityPub object model and are attacker-controllable via inbound federation. Because the values are interpolated into the rendered output without context-appropriate output encoding, an attacker can break out of the intended attribute or text context and inject arbitrary HTML elements and JavaScript. The resulting payload is stored as part of the post content, which is the defining characteristic of stored/persistent XSS (CWE-79).
The attack does not require authenticated access to the target instance. The malicious object is delivered over the network via the federation protocol (AV:N, PR:N), and no credentials or prior privileges are necessary. User interaction is required only in the sense that a victim must open or view the poisoned post (UI:R). The CVSS scope is changed (S:C) because the injected script executes in the browser's origin context for the NodeBB application — the same trust domain that holds the victim's session — rather than in the server-side process. The confidentiality and integrity impact are rated low (C:L/I:L): the impact is typically limited to session theft, data exposure, and content modification within the application, rather than direct server or database compromise.
The assigned CVSS score is 6.1 (Medium). The EPSS score of 0.00194 places this CVE in the 9.4th percentile of exploited-CVE likelihood, and it is not currently listed in CISA's Known Exploited Vulnerabilities catalog. The patch status is marked CLAIMED with confidence 2/4: a single source (OSV) reports that NodeBB 4.15.0 addresses the issue, but this is not independently corroborated by a vendor advisory at the time of writing. The NVD description is sparse on implementation details beyond the affected function and attributes, so no further function names, file paths, or endpoint specifics are available; the analysis presented here is therefore anchored at the vulnerability-class level where specific details are absent.
Exploitation Scenarios
No public PoC, Nuclei template, or exploit code was available at the time of writing. The attack chain below is inferred strictly from the NVD description and the known mechanics of the stored XSS vulnerability class; the exact payload syntax is not confirmed.
Reconnaissance and target identification. The attacker identifies NodeBB instances running version 4.15.0 or earlier. Public-facing forums can be located with internet-wide search engines using platform fingerprints such as "Powered by NodeBB" banners, default document titles, or characteristic HTTP response headers. The attacker additionally determines whether the target instance accepts inbound ActivityPub federation; only federated instances are reachable through the delivery vector described in the advisory.
Crafting and delivery of the malicious object. The attacker constructs an ActivityPub
Createactivity containing aNoteobject whose emoji tags are malformed. Thetag.icon.urlandtag.namefields are populated with values designed to escape their rendering context — for example, quoted payloads that terminate an HTML attribute early and introduce event-handler attributes or script elements. The object is then federated to the target NodeBB instance. Because ingestion of inbound federation content requires no authenticated access to the target (PR:N), the malicious note is accepted, recorded, and stored as part of the post body.Trigger and code execution. When any user — including forum administrators — views the stored post, the server invokes the
renderEmojifunction to render the emoji tags. Sincetag.icon.urlandtag.nameare not escaped, the injected HTML is emitted into the post response and parsed by the victim's browser. Arbitrary JavaScript executes in the security context of the NodeBB application origin, which holds the victim's active session.Post-exploitation impact. The injected script can read session cookies and CSRF tokens, exfiltrate them to an attacker-controlled server, and issue authenticated requests on behalf of the victim. Depending on the victim's privileges, the attacker can publish or edit posts, send direct messages, alter forum settings, or perform moderation actions. Because the payload is stored, every subsequent page view re-triggers execution, effectively amplifying the reach to the entire community that accesses the poisoned thread.
Impact Assessment
The primary business impact of CVE-2026-73038 is compromise of user trust and integrity of community content in NodeBB deployments. Stored XSS of this nature is particularly damaging for forum platforms because the injected payload is served to every visitor of the affected post without any additional attacker interaction. For enterprises that operate NodeBB as a customer-support, community-engagement, or internal-collaboration platform, the compromise chain can lead to session hijacking of support agents and administrators, account takeover, and abuse of privileged functionality.
Affected systems are all NodeBB instances prior to 4.15.0 that have ActivityPub federation enabled. Instances running without federation are not reachable through the ActivityPub delivery vector described in the advisory and would require a separate, unknown delivery mechanism; this materially reduces their exposure. The blast radius within an affected deployment is broad: the payload persists in the post and is delivered to all viewers, and the requirement for user interaction is satisfied simply by normal forum browsing.
The CVSS subscores support this assessment: the network attack vector and low attack complexity indicate trivial exploitation conditions; the changed scope (S:C) indicates that the injected script operates in a security context distinct from the vulnerable server component; and the low confidentiality and integrity scores reflect that the typical outcome is application-level data theft and manipulation rather than infrastructure-level compromise. The low EPSS score and absence from CISA KEV indicate that, as of this report, the vulnerability has not been observed in broad exploitation campaigns, but the public disclosure of the CVE and its stored-XSS nature make weaponization likely in the near term.
Detection Guidance
The detection rules below are designed to identify evidence of crafted ActivityPub emoji payloads in transit or in web-server logs. Because of the sparse technical detail in the advisory, the rules focus on content signatures (federation content-type, emoji tag structures, and script/event-handler payloads) rather than specific endpoint paths.
Sigma Rule
title: NodeBB Stored XSS via Crafted ActivityPub Emoji Tags (CVE-2026-73038)
id: bde1f74a-9c30-4e7f-8d5a-2f8c9a1b6e02
status: experimental
description: Detects inbound ActivityPub objects containing emoji tag structures with embedded script or event-handler payloads, targeting NodeBB before 4.15.0.
logsource:
category: webserver
product: generic
detection:
selection_activitypub_content:
http.content_type|contains:
- "application/activity+json"
- "application/ld+json"
selection_payload:
http.body|contains|all:
- "emoji"
- "tag"
selection_malicious:
http.body|contains|any:
- "<script"
- "javascript:"
- "onerror="
- "onload="
- "data:text/html"
condition: selection_activitypub_content and selection_payload and selection_malicious
falsepositives:
- Legitimate federated posts that discuss XSS or emoji rendering in chat
- Security researchers testing their own instances
level: medium
tags:
- attack.t1203
- attack.t1059.007
- cve.2026-73038
YARA Rule
rule CVE_2026_73038_NodeBB_Emoji_XSS
{
meta:
description = "Detects ActivityPub payloads with unescaped emoji tag attributes targeting NodeBB < 4.15.0"
author = "Valters IT Threat Intelligence"
reference = "CVE-2026-73038"
cve = "2026-73038"
date = "2026-02-01"
score = 61
strings:
$activity = "Create" ascii wide
$note = "Note" ascii wide
$emoji = "emoji" ascii wide
$url_attr = "\"icon\"" ascii wide
$name_attr = "\"name\"" ascii wide
$script = "<script" ascii wide
$js_uri = "javascript:" ascii wide
$handler = "onerror=" ascii wide
$data_uri = "data:text/html" ascii wide
condition:
uint16(0) == 0x7B7B or uint16(0) == 0x5B7B and
any of ($activity, $note) and
$emoji and
any of ($url_attr, $name_attr) and
any of ($script, $js_uri, $handler, $data_uri)
}
Suricata IDS Rule
alert http any any -> any any (
msg:"CVE-2026-73038 NodeBB Stored XSS via Crafted ActivityPub Emoji Tag";
content:"application/activity+json"; http.content_type;
content:"emoji"; http.request_body;
pcre:"/[\"'](?:tag\.icon\.url|tag\.name)[\"'][^}]{0,200}(?:javascript:|<script|onerror=|onload=|data:text\/html)/i";
reference:cve,2026-73038;
classtype:web-application-attack;
sid:2026073038; rev:1;
)
Elastic Detection
network where event.category == "network" and network.direction == "ingress"
and http.request.content_type in ("application/activity+json", "application/ld+json")
and http.request.body.text != null
and http.request.body.text like~ "*emoji*"
and (
http.request.body.text like~ "*<script*"
or http.request.body.text like~ "*javascript:*"
or http.request.body.text like~ "*onerror=*"
or http.request.body.text like~ "*onload=*"
)
Splunk SPL Query
index=web* OR index=proxy*
(http_content_type="*application/activity+json*" OR Content-Type="*application/activity+json*")
AND (payload="*emoji*" OR body="*emoji*")
AND (payload="*<script*" OR body="*<script*" OR payload="*javascript:*" OR payload="*onerror=*")
| stats count min(_time) as first_seen max(_time) as last_seen by src_ip, dest_host, uri, src_category
| where count > 0
| sort - count
| table first_seen, last_seen, src_ip, dest_host, uri, count
Wazuh OSSEC Rule
<group name="nodebb,web,xss,cve-2026-73038,">
<rule id="100730" level="12">
<if_sid>31100</if_sid>
<match>application/activity+json|application/ld+json</match>
<match>emoji</match>
<regex on="url">(<script|javascript:|onerror=|onload=|data:text/html)</regex>
<description>CVE-2026-73038: Possible stored XSS payload in ActivityPub emoji tag delivered to NodeBB</description>
<group>attack.t1203,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence is 2/4 (CLAIMED): a single source (OSV) states that NodeBB 4.15.0 fixes the vulnerability, but the patch is not independently confirmed and no vendor advisory was located at the time of writing. Administrators should treat the upgrade as the primary remediation while verifying its provenance.
Immediate mitigations. If federation is not business-critical, disable inbound ActivityPub federation on NodeBB instances until the patch is confirmed deployed. This eliminates the known delivery vector. If federation must remain enabled, place a web application firewall or reverse proxy in front of the instance and filter inbound requests carrying JSON content types for the payload signatures used in the detection rules above. Additionally, deploy a restrictive Content Security Policy (CSP) without
unsafe-inlineto reduce the impact of script injection; note that CSP is a compensating control and does not prevent the vulnerability itself.Patch and upgrade steps. Upgrade all NodeBB instances to version 4.15.0 or later. Because the patch is only single-source claimed, verify the fix in the official NodeBB release notes or changelog before deployment, and confirm the running version after the upgrade. Test the upgrade in a staging environment that mirrors the production federation configuration, then apply to production with a rollback plan. Re-scan the instance for XSS indicators and confirm that no malicious posts were stored prior to patching; if found, remove or sanitize them.
Long-term hardening. Adopt framework-level auto-escaping for all server-side rendering paths that handle federated or user-supplied data, and perform a security review of the
renderEmojicode path and any other functions that process ActivityPub object attributes. Harden cookies withHttpOnly,Secure, andSameSiteattributes to reduce session-theft impact. At the network layer, restrict inbound ActivityPub traffic to known trusted federated peers if the platform's threat model allows it. Monitor CISA KEV and vendor security advisories for updates to the exploitation status of CVE-2026-73038.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-73038
- OSV Vulnerability Entry: https://osv.dev/vulnerability/CVE-2026-73038
- MITRE ATT&CK Technique T1203 (Exploitation for Client Execution): https://attack.mitre.org/techniques/T1203/
- CISA Known Exploited Vulnerabilities Catalog: CVE-2026-73038 is not listed as of this report; catalog consulted at https://www.cisa.gov/known-exploited-vulnerabilities-catalog
No vendor advisory, researcher publication, or threat-actor campaign referencing CVE-2026-73038 was identified during analysis. No exploit-in-the-wild evidence was observed, consistent with the low EPSS score and the absence of the CVE from CISA KEV and public exploit databases.
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.