<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title type="text"><![CDATA[RubySec]]></title>
  <subtitle type="text"><![CDATA[Providing security resources for the Ruby community]]></subtitle>
  <link href="https://rubysec.com/atom.xml" rel="self"/>
  <link href="https://rubysec.com/" rel="alternate" hreflang="en" />
  <updated>2026-09-16T14:36:49+00:00</updated>
  <id>https://rubysec.com/</id>
  <author>
    <name><![CDATA[RubySec]]></name>
    
  </author>
  <generator uri="https://jekyllrb.com/">Jekyll</generator>

  
  <entry>
    <title type="html"><![CDATA[CVE-2026-88030 (mongo): MongoDB Ruby Driver - Improper neutralization of special elements in data query logic in the GridFS component]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-88030/"/>
    <id>https://rubysec.com/advisories/CVE-2026-88030</id>
    <updated>2026-09-10T00:00:00+00:00</updated>
    <content type="html"><![CDATA[Improper neutralization of special elements in data query logic in
the GridFS component of the MongoDB Ruby Driver can cause a
caller-supplied structured file identifier to be interpreted as a
query condition rather than as a literal identifier. An authenticated
user who can influence the identifier passed by an affected application
may obtain stored file content beyond the intended target or cause
all GridFS file chunks in the affected bucket to be removed,
rendering stored file content unreadable.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-85396 (rubyzip): path traversal vulnerability in pre-3.4.0 rubyzip gem]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-85396/"/>
    <id>https://rubysec.com/advisories/CVE-2026-85396</id>
    <updated>2026-09-03T00:00:00+00:00</updated>
    <content type="html"><![CDATA[rubyzip versions before 3.4.0 contain a path traversal vulnerability
in Zip::Entry#extract that fails to properly validate extraction
paths using prefix comparison without trailing separators. Attackers
can craft archive entries with names like ../upload_backup/owned.sh
to write files outside the intended extraction directory into
sibling paths sharing the destination prefix.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-g7vv-4mjj-6fgm (alchemy_cms): Account Takeover & Privilege-Escalation To Admin via Stored XSS in Menu Node Name Rendered in Page Properties Configure Dialog]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-g7vv-4mjj-6fgm/"/>
    <id>https://rubysec.com/advisories/GHSA-g7vv-4mjj-6fgm</id>
    <updated>2026-09-02T00:00:00+00:00</updated>
    <content type="html"><![CDATA[An improper input sanitization vulnerability in the Page Properties
menu node rendering allows Author-level users to inject stored
JavaScript that executes in an Admin's browser when they open the
Configure dialog for a page containing the malicious node. The
payload executes with the Admin's session privileges, allowing
an attacker to perform administrative actions and create an
attacker-controlled administrator account, resulting in full
account takeover and privilege escalation.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-4qhx-6wrv-5hg2 (alchemy_cms): Account Takeover & Privilege-Escalation To Admin via Stored XSS in Menu Node Name Rendered in Admin Configure Dialog Page Content]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-4qhx-6wrv-5hg2/"/>
    <id>https://rubysec.com/advisories/GHSA-4qhx-6wrv-5hg2</id>
    <updated>2026-09-02T00:00:00+00:00</updated>
    <content type="html"><![CDATA[An improper input sanitization vulnerability in the menu node name
rendering allows Author-level users to inject stored JavaScript
that executes in an Admin's browser when they open the configure
dialog for a page referencing the malicious node. The payload
executes with the Admin's session privileges, allowing an attacker
to perform administrative actions and create an attacker-controlled
administrator account, resulting in full account takeover and
privilege escalation.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-81097 (rails-mcp-server): The execute_ruby tool is documented as a read-only Ruby sandbox]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-81097/"/>
    <id>https://rubysec.com/advisories/CVE-2026-81097</id>
    <updated>2026-08-27T00:00:00+00:00</updated>
    <content type="html"><![CDATA[The execute_ruby tool is documented as a read-only Ruby sandbox
and is enforced by a pattern denylist together with replacements
for the process-spawning methods on Kernel.

The pseudo-terminal library's spawn entry points are neither in the
denylist nor replaced, so a normal tool call could reach them and
start a shell, executing commands as the account running the server
and outside  the guarded methods.

The denylist was introduced with the tool in 1.4.0 and
never covered those entry points through 1.6.0.

Version 1.6.1 restricts the requires the sandbox permits to a
data-only list and blocks dynamic dispatch to execution entry
points.

2.0.0 removes the tool.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-80213 (resolv): CVE-2026-80213 - Hostname validation bypass]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-80213/"/>
    <id>https://rubysec.com/advisories/CVE-2026-80213</id>
    <updated>2026-08-27T00:00:00+00:00</updated>
    <content type="html"><![CDATA[An application that checks a hostname against an allow list or an
SSRF filter and then resolves it can be made to look up a domain
other than the one it checked. The string that passes validation
and the name that reaches the network are not the same, so the
connection can end up at a host the application never approved.
This requires a hostname that exceeds the DNS length limits, so
validation that rejects names longer than 255 octets, or labels
longer than 63 octets, is not affected.

## Credits

Thanks to dalifit for discovering these issues.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-80212 (resolv): CVE-2026-80212 - Memory exhaustion through malicious DNS responses]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-80212/"/>
    <id>https://rubysec.com/advisories/CVE-2026-80212</id>
    <updated>2026-08-27T00:00:00+00:00</updated>
    <content type="html"><![CDATA[An application that resolves a hostname an attacker can influence,
such as a webhook target or a user-supplied URL, can be made to
consume memory without bound. The attacker points a domain at a
name server they control and returns responses that the library
retains permanently. Repeated lookups grow the process until it
runs out of memory and the service stops.

## Credits

Thanks to dalifit for discovering these issues.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-55107 (kobako): kobako Sandbox Escape - guest eval reaches host RCE via method_missing → public_send (any bound Service)]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-55107/"/>
    <id>https://rubysec.com/advisories/CVE-2026-55107</id>
    <updated>2026-08-18T00:00:00+00:00</updated>
    <content type="html"><![CDATA[### Summary

A guest mruby script running inside the Kobako sandbox can execute
arbitrary Ruby in the host process, fully escaping the sandbox.

### Impact

Complete sandbox escape leading to remote code execution in the host process,
defeating the gem's central guarantee of isolating untrusted mruby scripts.
Any deployment that runs untrusted or attacker-influenced scripts is affected.
All released versions (0.1.0 through 0.9.0) are vulnerable; the dispatcher
carried the same unguarded `public_send` sink under three successive names
(`registry` → `rpc` → `transport`).

### Credits

Reported and fixed by Ahmed Al Hafoudh.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-rmxg-5p3r-j6hh (graphql): Unsafe Marshal deserialization in the parser cache can lead to arbitrary Ruby code execution]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-rmxg-5p3r-j6hh/"/>
    <id>https://rubysec.com/advisories/GHSA-rmxg-5p3r-j6hh</id>
    <updated>2026-08-17T00:00:00+00:00</updated>
    <content type="html"><![CDATA[GraphQL::Language::Cache#fetch reads parser cache files and passes
their contents directly to Marshal.load without authenticating the
payloads. If an attacker can place a crafted payload in the expected
path and the application calls GraphQL::Language::Parser.parse_file,
then attacker-controlled marshal_load or _load methods are executed,
resulting in arbitrary Ruby code execution in the application process.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-67991 (ruby_llm): Polynomial-Time Regular Expression Denial of Service (ReDoS) vulnerability]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-67991/"/>
    <id>https://rubysec.com/advisories/CVE-2026-67991</id>
    <updated>2026-08-13T00:00:00+00:00</updated>
    <content type="html"><![CDATA[crmne/ruby_llm at commit fa6f279847d6d7027814539d9c0dfc3bbdfd2a83
contains a polynomial-time regular expression denial-of-service
condition in RubyLLM::Utils.underscore on Ruby 3.1.x.
A very long crafted class, agent, or tool name can cause
excessive CPU consumption and a denial of service.

Update: "the helper was extracted from existing code, so released
gems were affected too. All three reports concern polynomial-time
behavior on Ruby 3.1.x; exposure depends on untrusted data reaching
the affected operation."]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-73330 (camaleon_cms): CamaleonCMS 2.9.1 Server-Side Template Injection via test_email Action]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-73330/"/>
    <id>https://rubysec.com/advisories/CVE-2026-73330</id>
    <updated>2026-08-12T00:00:00+00:00</updated>
    <content type="html"><![CDATA[CamaleonCMS 2.9.1 contains a server-side template injection vulnerability
that allows authenticated administrators to execute arbitrary commands
by embedding ERB tags in the email parameter of the test_email settings
action, which are evaluated when an SMTP rejection reflects the recipient
address back in the exception message rendered as an inline ERB template.
Attackers can submit a crafted email parameter containing ERB expressions
through the admin settings test_email endpoint, causing the Rails inline
template renderer to evaluate attacker-controlled Ruby code and achieve
arbitrary command execution as the Rails process user.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-mwm8-39rw-8826 (sqlite3): Use-After-Free in SQLite Aggregate Arguments in Heap-Allocated Argument Array]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-mwm8-39rw-8826/"/>
    <id>https://rubysec.com/advisories/GHSA-mwm8-39rw-8826</id>
    <updated>2026-08-11T00:00:00+00:00</updated>
    <content type="html"><![CDATA[## Summary

Using Database#create_aggregate, #create_aggregate_handler, or
Database#define_aggregator to define an aggregate function that takes
two or more arguments, and then evaluating it over TEXT or BLOB column
values, can free the Ruby objects holding those arguments while a
later argument is still being converted, during ordinary garbage
collection. The aggregate's step method then receives an incorrect
object, or the process crashes with a segmentation fault.

## Credits

Reported by Jeremy Daer (@jeremy).]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-71847 (json): Ruby JSON - JSON::ResumableParser#partial_value dereferences a freed input buffer and crashes on truncated duplicate-key streams]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-71847/"/>
    <id>https://rubysec.com/advisories/CVE-2026-71847</id>
    <updated>2026-08-07T00:00:00+00:00</updated>
    <content type="html"><![CDATA[### Summary

Ruby's JSON native C extension clears the consumed `JSON::ResumableParser`
input buffer but leaves `state.start`, `state.cursor`, and `state.end`
pointing into released storage.

When `partial_value` reconstructs an incomplete object containing
duplicate keys, the duplicate-key warning path calls `cursor_position`,
which dereferences those stale pointers. This results in a
heap-use-after-free and can terminate the Ruby process.

An attacker who can supply JSON stream data to an application using
`JSON::ResumableParser` may cause process termination when the
application calls `partial_value` on incomplete attacker-controlled
input containing duplicate object keys.

The issue was reproduced in the native C extension from the official
RubyGems releases:

* JSON 2.20.0
* JSON 2.21.0
* JSON 2.21.1

The attached evidence demonstrates:

* an AddressSanitizer-confirmed heap-use-after-free;
* a native `SIGSEGV` using the official JSON 2.21.1 RubyGem;
* an end-to-end loopback TCP attacker/victim reproduction;
* four differential controls;
* successful execution after applying a tested patch control.

This was originally reported privately through Ruby's HackerOne program
as report `#3867755`. A Ruby maintainer independently confirmed
reproduction of the ASan failure and requested that further
coordination continue through this private advisory.

No code execution or information disclosure is claimed.

### Impact

This is a use-after-free that can result in native Ruby process termination.

An attacker must be able to supply JSON stream data to an application that:

1. uses `JSON::ResumableParser`;
2. processes attacker-controlled streaming input;
3. calls `partial_value` after parsing an incomplete document
   containing duplicate object keys.

In network-facing deployments meeting these conditions, an attacker
can cause process termination and denial of service.

The release-build crash was reproduced consistently in the tested
Linux environment. The AddressSanitizer result confirms the underlying
heap-use-after-free independently of normal allocator behavior.

The demonstrated impact is:

```text
Denial of service through native process termination
```

No confidentiality impact, integrity impact, arbitrary code execution,
or information disclosure is claimed.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-66748 (camaleon_cms): Camaleon CMS (2.1.1 to 2.9.1) contains an authenticated RCE vulnerability]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-66748/"/>
    <id>https://rubysec.com/advisories/CVE-2026-66748</id>
    <updated>2026-07-31T00:00:00+00:00</updated>
    <content type="html"><![CDATA[Camaleon CMS versions 2.1.1 through 2.9.1 contains an authenticated
remote code execution (RCE) vulnerability that allows users with
custom_fields manage permission to execute arbitrary Ruby code by
supplying a malicious expression through the select_eval custom field
type. Attackers can store an attacker-controlled Ruby expression in the
field options command parameter, which is evaluated via instance_eval
within an ERB view whenever a post edit page is rendered, achieving
server-side code execution with web server process privileges.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-pmwx-rm49-xv39 (activerecord-tenanted): ActiveRecord::Tenanted::Storage::DiskService#path_for has a possible path traversal]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-pmwx-rm49-xv39/"/>
    <id>https://rubysec.com/advisories/GHSA-pmwx-rm49-xv39</id>
    <updated>2026-07-29T00:00:00+00:00</updated>
    <content type="html"><![CDATA[### Summary

Active Record Tenanted's override of Active Storage's `DiskService#path_for`
does not validate that the resolved filesystem path remains within
the storage root directory. If a blob key containing path traversal
sequences (e.g. `../`) is used, it could allow reading, writing, or
deleting arbitrary files on the server. Blob keys are expected to be
trusted strings, but some applications could be passing user input
as keys and would be affected.

### Mitigation

Upgrade to Active Record Tenanted v0.7.0 or later.

As a workaround, do not use untrusted user input as blob keys. Blob
keys are expected to be trusted strings.

### Credit

This issue was responsibly reported by @tonghuaroot.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-66066 (activestorage): Possible arbitrary file read and remote code execution in Active Storage variant processing]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-66066/"/>
    <id>https://rubysec.com/advisories/CVE-2026-66066</id>
    <updated>2026-07-29T00:00:00+00:00</updated>
    <content type="html"><![CDATA[## Impact

In its default configuration, a Rails application that displays image
variants may allow an unauthenticated attacker to read arbitrary files
from the server, including the process environment. That environment
typically holds secret_key_base and often credentials for external
systems, which may in turn allow escalation to remote code execution
or lateral movement to those systems.

## Affected applications

An application is affected if it meets all of these requirements:

* Uses libvips for Active Storage image processing. This is
  config.active_storage.variant_processor = :vips, which
  load_defaults 7.0 set and no later default has changed.
* Allows image uploads from untrusted users.
  Generating variants is not a separate requirement.

## Workarounds

If libvips < 8.13 is being used, there are no workarounds available
other than removing the dependency on libvips from the application.
Some applications may have ruby-vips declared as a dependency only
for image analysis, and those applications may be able to simply
remove ruby-vips from the Gemfile to remove libvips from the
application. Applications that do not use Active Storage can remove
ruby-vips from the Gemfile to avoid the boot-time checks.

If libvips >= 8.13 is present on the system, applications can disable
the unfuzzed operations without upgrading Rails by setting the
VIPS_BLOCK_UNTRUSTED environment variable, which libvips reads while
initializing.

Applications also running ruby-vips >= 2.2.1 or later can instead call
Vips.block_untrusted(true) from an initializer.

## Credit

This issue was responsibly reported by 0xacb, s3np41k1r1t0 and castilho
from Ethiack, and RyotaK from GMO Flatt Security Inc..]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-wppq-8h64-w78r (alchemy_cms): Unauthenticated navigation-tree disclosure via GET /api/nodes (missing authorization)]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-wppq-8h64-w78r/"/>
    <id>https://rubysec.com/advisories/GHSA-wppq-8h64-w78r</id>
    <updated>2026-07-28T00:00:00+00:00</updated>
    <content type="html"><![CDATA[## Summary

Alchemy::Api::NodesController#index (GET /api/nodes) returns every
menu node of every site and every language with no authorization
check and no site/language scoping. It is the only API index action
with neither accessible_by nor authorize!. Because a menu node attached
to a page derives its name and url from that page (Node#name → page.name,
Node#url → page.url_path), an anonymous request also discloses names
and URL paths of pages that are restricted (members-only) or not
published (draft), plus any internal URLs editors placed in menus.

This is the same class the maintainer fixed in the sibling action
Api::PagesController#nested (advisory GHSA-mqq5-j7w8-2hgh) and in
PR #2145 ("Do not leak all records for guest users in API controllers").
nodes#index was not covered.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-r827-6rm4-59pg (alchemy_cms): Stored XSS via unsanitized SVG attachment replacement]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-r827-6rm4-59pg/"/>
    <id>https://rubysec.com/advisories/GHSA-r827-6rm4-59pg</id>
    <updated>2026-07-28T00:00:00+00:00</updated>
    <content type="html"><![CDATA[## Summary

AlchemyCMS registers its SVG sanitizer (SanitizeSvgJob, a Loofah-based
scrubber) only as an after_create_commit callback on Alchemy::Attachment /
Alchemy::Picture. This callback fires when a new attachment record is
created, but not when an existing attachment's file is replaced through
the admin "update" action. An authenticated user holding the editor
role (i.e. manage Alchemy::Attachment permission, a low-privilege,
non-admin role) can PATCH an existing attachment to replace its file
with a malicious SVG containing <script> / onload= payloads. Because
the sanitizer never runs on this path, and because AlchemyCMS explicitly
configures SVG as an inline-servable content type on Active Storage,
the public, unauthenticated /attachment/:id/show route streams the
attacker's raw SVG payload with Content-Disposition: inline. Any
visitor (including other admins) who opens the attachment URL executes
attacker-controlled JavaScript in the AlchemyCMS application origin.

This is a stored, privilege-crossing Cross-Site Scripting vulnerability,
confirmed both by static code review and by live dynamic reproduction
against an unmodified AlchemyCMS instance.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2026-54659 (pagy): Pagy I18n locale option is not validated before being used in a file path]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/CVE-2026-54659/"/>
    <id>https://rubysec.com/advisories/CVE-2026-54659</id>
    <updated>2026-07-28T00:00:00+00:00</updated>
    <content type="html"><![CDATA[### Summary

`Pagy::I18n.locale=` did not validate its argument before using it as a
path component to load the matching dictionary file (`<locale>.yml`). An
application that assigns untrusted input to the locale — e.g. the common
pattern `Pagy::I18n.locale = params[:locale]` — let that input influence
which file Pagy attempted to load.

### Impact

Information disclosure (CWE-22 / CWE-200): a file-existence / readability
oracle for `.yml` paths on the host, plus a server-side read of
attacker-chosen files into the process. The file contents are not
returned in the response.

Only applications that pass **unsanitized end-user input** into
`Pagy::I18n.locale=` are affected. Applications that set the locale from
trusted values are not affected.]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GHSA-m5f6-4589-m89f (blazer): Stored XSS vulnerability]]></title>
    <link rel="alternate" href="https://rubysec.com/advisories/GHSA-m5f6-4589-m89f/"/>
    <id>https://rubysec.com/advisories/GHSA-m5f6-4589-m89f</id>
    <updated>2026-07-27T00:00:00+00:00</updated>
    <content type="html"><![CDATA[An authenticated user can create a malicious query that executes arbitrary
JavaScript when another user tries to edit the query. This can be used to
perform actions as the other user for resources on the same origin.]]></content>
  </entry>
  
</feed>
