Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Network-reachable admin endpoint, low complexity, requires a low-privilege authenticated account (PR:L), and arbitrary action execution yields total confidentiality, integrity and availability impact.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
Lifecycle Timeline
4DescriptionGitHub Advisory
Avo is a framework to create admin panels for Ruby on Rails apps. Prior to version 3.31.2, a broken access control vulnerability was identified in the ActionsController of the Avo framework. Due to insecure action lookup logic, an authenticated user can execute any Action class (descendants of Avo::BaseAction) on any resource, even if the action is not registered for that specific resource. This leads to Privilege Escalation and unauthorized data manipulation across the entire application. This issue has been patched in version 3.31.2.
AnalysisAI
Privilege escalation in the Avo admin framework for Ruby on Rails (all 3.x versions prior to 3.31.2) lets any authenticated low-privilege user invoke arbitrary Action classes against arbitrary resources, because the ActionsController resolves actions by name across all Avo::BaseAction descendants without checking resource registration. An attacker can trigger sensitive operations such as ToggleAdmin on records they should not control, resulting in unauthorized data manipulation and role escalation across the entire application. A proof-of-concept exists in the GitHub advisory (SSVC exploitation: poc); this is no public exploit identified as actively exploited, and EPSS is low at 0.04%.
Technical ContextAI
Avo is a Ruby gem (cpe:2.3:a:avo-hq:avo) that auto-generates CRUD admin panels for Rails apps, where 'Actions' are server-side operation classes (subclasses of Avo::BaseAction) that operators register per-resource to control which bulk/record operations are exposed. The root cause is CWE-284 (Improper Access Control): the action_class method in app/controllers/avo/actions_controller.rb resolves the target action by iterating Avo::BaseAction.descendants and matching params[:action_id] to the class name, with no validation that the action is registered for the resource named in the request URL. Because Ruby's descendants reflection enumerates every loaded action class globally, the controller trusts an attacker-supplied class name and executes it, decoupling the intended resource-to-action authorization mapping from the code path that actually runs the action.
RemediationAI
Vendor-released patch: upgrade the avo gem to 3.31.2 or later (bundle update avo, then confirm Gemfile.lock pins >= 3.31.2), per the advisory at https://github.com/avo-hq/avo/security/advisories/GHSA-qc5p-3mg5-9fh8 and release notes at https://github.com/avo-hq/avo/releases/tag/v3.31.2. Until the upgrade can be deployed, reduce exposure by restricting who holds Avo admin-panel credentials and tightening authorization: revoke or downgrade low-trust accounts, and if feasible network-restrict the admin mount path (e.g. /admin) to trusted operators via IP allowlist or VPN, accepting that this blocks legitimate remote operators. As a code-level stopgap you can override or wrap the ActionsController action lookup to verify that the requested action_id is actually among the actions registered for the target resource before executing it, though custom patches carry maintenance and correctness risk versus simply upgrading to 3.31.2.
Avo is an open source ruby on rails admin panel creation framework. Rated high severity (CVSS 8.8), this vulnerability i
Avo is a framework to create admin panels for Ruby on Rails apps. Rated medium severity (CVSS 5.4), this vulnerability i
Avo is a framework to create admin panels for Ruby on Rails apps. Rated medium severity (CVSS 5.4), this vulnerability i
Avo is an open source ruby on rails admin panel creation framework. Rated medium severity (CVSS 5.4), this vulnerability
Same weakness CWE-284 – Improper Access Control
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-28836
GHSA-qc5p-3mg5-9fh8