---
id: "CVE-2026-111445"
kind: "vulnerability"
aliases: ["CVE-2026-111445"]
title: "Wheels: findByKey and exists ignore scopes, exposing other tenants' records"
severity: "high"
cvss: 8.1
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["cfml", "multi-tenant", "package", "self-hosted", "wheels"]
not_affected_if: ["no-scope-authorization", "version-4.2.0-or-later"]
published_at: "2026-10-16T04:18:30+00:00"
first_seen_at: "2026-10-23T21:57:12+00:00"
updated_at: "2026-10-25T03:07:54+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-111445", "first_seen_at": "2026-10-23T21:57:12+00:00"}]
---

# Wheels: findByKey and exists ignore scopes, exposing other tenants' records

Wheels (a CFML framework) 4.0.0 through 4.1.2 replaces incoming scope conditions with a primary-key lookup in findByKey() and exists(key=). An application that scopes records for ownership or tenancy and takes the key from a request can let one user load, modify or delete another user's record.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check the Wheels version in the application's dependencies (`box.json` or the installed Wheels folder) for `4.0.0` through `4.1.2`
- Search application code for `findByKey(` and `exists(key=` where the key comes from request parameters and the model relies on scopes for authorization

## Fix

- Upgrade Wheels to `4.2.0` or later
- Until upgraded, do not rely on scopes alone for ownership checks in findByKey() or exists(key=); add explicit where conditions for the owner or tenant

## Timeline

- 2026-10-23T21:57:12+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-111445

## From the sources

Wheels 4.0.0 through 4.1.2 before 4.2.0 replaces incoming scope conditions with a primary-key condition in findByKey() and exists(key=). For exists(key=), production with error information disabled returns true for an out-of-scope key instead of throwing. Applications relying on scopes for ownership or tenant authorization can therefore load and subsequently modify or delete another user's or tenant's record when the key comes from a request. The 4.2.0 fix combines key conditions with incoming scope, query-builder or where conditions in findByKey(), exists(key=), updateByKey() and deleteByKey(). Other scope-aware finders, aggregates, updateAll() and deleteAll() are not affected.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
