CVE-2023-34102
Executive Summary
CVE-2023-34102 is an unsafe reflection / partial denial of service vulnerability in the Avo Ruby on Rails admin panel creation framework. The vulnerability resides in the polymorphic field type, which fails to validate user-supplied class names on the back end when records are updated, allowing an authenticated or semi-privileged user to influence which classes are instantiated or operated on. This can result in unexpected application behavior, remote code execution, or application crashes when a manipulated record is viewed. The vendor has committed a fix (ec117882d) but has not yet shipped a release containing it; affected deployments remain exposed and should restrict access to untrusted users until the patch is available.
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 exists in the Avo framework's handling of polymorphic associations. In Rails, a polymorphic relationship stores both an object's ID and its class name in a database column. When an Avo admin panel user edits a record, the form submits the class name through a field meant to store the polymorphic type. Per the NVD description, the polymorphic field type "stores the classes to operate on when updating a record with user input, and does not validate them in the back end."
The specific flaw is a lack of server-side validation on the class name value that reaches the application through the polymorphic field. An attacker who can craft a request to the admin panel can submit an arbitrary class name rather than one belonging to a legitimate model. When the record is later rendered or processed, Rails attempts to resolve and potentially invoke functionality associated with that attacker-controlled class name — a classic unsafe deserialization/reflection pattern.
Because Avo is a framework that runs inside a Rails application, the attack surface is any Avo-powered admin interface. The privilege requirement is low in many deployments: Avo is often configured to allow authenticated editors/submitters to create or update records. In configurations with broad permissions, any user who can access the record-editing forms can attempt to submit a malicious class name.
The mechanism is not a classic memory-corruption or injection flaw; it is a logic/design weakness in the framework's input handling. The "unexpected behavior" can range from NameError exceptions that crash the process (denial of service) to, if a gadget class exists within the application's load path, remote code execution through Ruby's object-model — the attacker controls which class is instantiated or which class method is invoked. The NVD description explicitly states the consequences: "unexpected behavior, remote code execution, or application crashes when viewing a manipulated record."
The patch commit ec117882d presumably adds whitelist validation on the polymorphic field. No official release version has been declared, and the NVD data provides no additional technical details on the exact validation logic implemented.
Exploitation Scenarios
Because there is no public PoC and the fix has not been released, the following attack chain is inferred strictly from the NVD description and the vulnerability class (unsafe reflection via unvalidated polymorphic class names).
Step 1 — Reconnaissance / Target Identification
The attacker identifies a publicly accessible Avo admin panel. This is done via:
- Shodan/Censys queries for Avo-specific headers or page titles (e.g., "Avo" in HTML title).
- Google dorking for paths commonly used by Rails admin panels.
- Observing the Rails stack trace or asset fingerprints in the page source that reveal Avo usage.
The attacker then identifies the application's authentication model. Avo typically requires an authenticated user; in misconfigured deployments, the panel may be unauthenticated or accessible with default credentials.
Step 2 — Triggering the Flaw Class
The attacker locates a record that uses a polymorphic association and contains an editable "type" or "class" field. In the Avo UI, this appears as a polymorphic field on the form. The attacker intercepts the update request (e.g., via browser developer tools or a proxy like Burp Suite) and replaces the legitimate class name in the type parameter with a different value.
Example at the class level — not a specific function name — the attacker changes the polymorphic type value from a legitimate model class to an arbitrary string. The NVD description states the framework "stores the classes to operate on when updating a record with user input, and does not validate them in the back end," which confirms the attacker's submitted value is persisted without server-side verification.
Step 3 — Payload / Execution Method
The payload is the class name itself. Because the framework stores the class to "operate on," the attacker can:
- Submit a class that does not exist → upon rendering the record, Rails raises
NameError→ application error/500 and potential crash (denial of service). - Submit a class that exists in the application or in loaded gems and whose initialization or class-level methods have side effects → remote code execution. The attacker needs to know which classes are available, which they can determine through error messages (verbose Rails errors) or by reading open-source code of the target application's stack.
This is a blind attack at the class-selection level: the attacker cannot pass arbitrary arguments via this vector unless the polymorphic field also exposes an ID or other fields that affect behavior; the description only mentions the class name being attacker-controlled.
Step 4 — Post-Exploitation Impact
If remote code execution is achieved, the attacker gains code execution in the context of the Rails application process (typically non-root). They can:
- Exfiltrate data from the database.
- Read environment variables containing secrets (database credentials, API keys,
RAILS_MASTER_KEY). - Pivot laterally within the network if the application has access to internal resources.
If full RCE is not achieved, the attacker can still cause repeated application crashes, effectively denying service to legitimate admin users.
Impact Assessment
Business Impact: The Avo framework is used by development teams to rapidly deploy admin panels for content management, data curation, and back-office operations. An unpatched Avo deployment exposes the organization to:
- Confidentiality (High, per CVSS 8.3): RCE allows direct database access and sensitive data exfiltration.
- Integrity (High): An attacker can modify or delete records through the admin panel, tamper with application logic by manipulating stored polymorphic types, or plant malicious data that triggers the flaw on every subsequent view.
- Availability (High): The denial-of-service vector (submitting an invalid class name) is trivial to exploit repeatedly, and requires no special payload beyond a string.
Affected Systems: Any Rails application that depends on the affected version of the Avo gem and exposes record-editing capabilities to users with update permissions. High-risk scenarios include:
- Internet-facing admin panels with weak authentication.
- Deployments with role-based access control that grants "editor" or "content manager" roles to non-trusted parties (e.g., external content contributors).
- Applications that run the admin panel on the same infrastructure as production databases.
Blast Radius: The vulnerability is in a framework, meaning a single vulnerable dependency affects all applications using it. The CVSS base score of 8.3 (High severity) reflects the network-attack vector, low privilege requirement, and the combined high impact on confidentiality, integrity, and availability. EPSS at 0.01610 suggests low immediate exploit probability, but the score is not a guarantee of safety — it is a statistical likelihood.
Detection Guidance
The following detections target the exploitation pattern of CVE-2023-34102. Because the vulnerability is server-side reflection via a polymorphic class field, network-level and log-level detections focus on anomalies in the type/class request parameters.
Sigma Rule
title: Avo Admin Panel Polymorphic Class Injection Attempt
id: 3f6dc4a2-8a44-4a35-9c5e-2f9b4b1d2c10
status: experimental
description: Detects attempts to submit a non-standard polymorphic class name to an Avo admin panel update endpoint.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2023-34102
author: Valtersit Threat Intelligence
date: 2025/01/01
logsource:
category: webserver
product: nginx
definition: Detection based on HTTP request URI and POST body inspection.
detection:
selection:
cs-method: 'POST'
cs-uri-extension: 'update'
filter_known:
cs-uri-query|contains:
- 'type=Normal'
- 'type=Featured'
- 'type=Published'
filter_no_body:
cs-uri-query|contains: 'type='
condition: selection and not filter_known
falsepositives:
- Legitimate new polymorphic classes introduced during application development.
- Form submissions where the type parameter is not present in the URI but in the POST body (requires body inspection; this rule relies on query-based detection).
level: high
tags:
- attack.t1190
- cve.2023.34102
- cwe.502
YARA Rule
rule Avo_Polymorphic_Class_Injection
{
meta:
author = "Valtersit Threat Intelligence"
description = "Detects suspicious class names in Avo admin panel HTTP payloads"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2023-34102"
date = "2025-01-01"
cve = "CVE-2023-34102"
strings:
$svc_root = "polymorphic" ascii nocase
$class_pattern = /type=(?!(Normal|Featured|Published|Draft))[A-Z][a-zA-Z0-9_:]+/ nocase
$ruby_gadget = /(Open3|Kernel|IO|File|ERB|ActiveRecord)::/ ascii
$dangerous_suffix = "eval" ascii nocase
condition:
$svc_root and $class_pattern and 1 of ($ruby_gadget, $dangerous_suffix)
}
Suricata IDS Rule
alert http any any -> $HOME_NET any (
msg:"CVE-2023-34102 - Avo polymorphic class parameter anomaly";
flow:established,to_server;
http.method;"POST";
http.uri; content:"update"; nocase;
http.request_body; content:"type="; distance:0;
http.request_body; pcre:"/type=(?!(Normal|Featured|Published|Draft))[A-Za-z0-9_:]+/";
reference:cve,2023-34102;
classtype:attempted-admin;
sid:10002341;
rev:1;
)
Elastic Detection
// Elastic EQL query assuming a proxy/WAF log index with fields: method, url.path, request.body, status_code
sequence by source.ip with maxspan=5m
[ network where method == "POST" and url.path contains "update" and
request.body like "*type=*" ]
[ any where status_code == 500 and
(message like "*NameError*" or message like "*uninitialized constant*") ]
Splunk SPL Query
index=web sourcetype=access_combined
| where method == "POST"
| regex _raw="\/update"
| regex _raw="type=[A-Za-z0-9_:]+"
| regex _raw="type=(?!(Normal|Featured|Published|Draft))"
| table _time, src_ip, uri, status
| eval class_name = mvindex(regex_extract(_raw, "type=(?<cn>[A-Za-z0-9_:]+)"), 0)
| stats count by src_ip, class_name, status
Wazuh OSSEC Rule
<group name="web_application,">
<rule id="100341" level="10">
<if_sid>31122</if_sid>
<match>update</match>
<regex type="pcre2">type=(?!(Normal|Featured|Published|Draft))[A-Za-z0-9_:]+</regex>
<description>Avo (CVE-2023-34102) attempt: polymorphic class name parameter modified in update request.</description>
<group>attack.t1190,cve.2023-34102,</group>
<mitre>
<id>T1190</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Important: Patch confidence is 0/4. No vendor release contains the fix. The only patch evidence is commit ec117882d in the Avo repository, expected to be included in an upcoming release. Until a tagged release is published, affected installations remain vulnerable.
Immediate Mitigations (do these now):
- Restrict admin panel access: The NVD description explicitly advises limiting access to untrusted users. Place the Avo admin panel behind a VPN or IP allowlist.
- Enforce strong authentication: Require multi-factor authentication for all admin panel accounts.
- Disable untrusted user roles: If the application has roles like "editor" or "contributor", disable them or suspend accounts until the patch is applied.
- Bulletproof the app-level validation: As a temporary code-level mitigation, add a custom validation before update that whitelists allowed polymorphic class names, even if Avo does not. This is an application-specific workaround — it intercepts the request in the controller before Avo processes the polymorphic field.
- Enable verbose logging: Turn on request-body logging in front of the Rails app (Nginx
$request_body) to detect exploitation attempts for correlation.
Patch / Upgrade Steps:
- Monitor the Avo GitHub repository for new releases.
- When a release containing commit
ec117882dis published, upgrade immediately:bundle update avoand restart the Rails process. - If using a non-release branch (e.g., a git source in the Gemfile), you may pin the gem to a ref that includes the fix commit. This is only recommended for staging/integration testing, not production, unless fully vetted.
Long-Term Hardening:
- Static analysis in CI: Add Brakeman or Semgrep rules that flag unvalidated polymorphic fields in Rails models.
- Dependency scanning: Use
bundler-auditand Dependabot to stay ahead of framework vulnerabilities. - Runtime protection: Deploy a WAF with a virtual patch rule that blocks non-standard
typeparameter values on Avo update endpoints, and update that rule as legitimate classes change. - Principle of least privilege: Audit existing admin panel user roles and remove update access for all non-admin roles until patched.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2023-34102 — Official CVE listing with CVSS 8.3 and description.
- GitHub Advisory / Vendor Repository: https://github.com/avo-hq/avo — The upstream repository; commit
ec117882dis the patch reference. Monitor for release announcements. - EPSS Data: https://www.first.org/epss/data_stats — EPSS model data indicating exploit probability (0.01610 at 73.6% percentile).
- CISA KEV: https://www.cisa.gov/known-exploited-vulnerabilities-catalog — CISA KEV was checked and does NOT list CVE-2023-34102 as actively exploited in the wild as of the report date.
Threat Actor Activity:
No known threat actor campaigns have been publicly attributed to CVE-2023-34102. There is no public PoC, no Nuclei template, and no exploit code available as of this report. The EPSS score (0.01610) reflects a low statistical likelihood of exploitation within the next 30 days, but the high CVSS severity and the triviality of the denial-of-service vector warrant proactive patching as soon as the vendor ships a fix.
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.