v4.1.9 Changelog
See what's new in Kener v4.1.9, a security fix for the v4 API key check
Release date: October 24, 2026
Important
This release fixes a security issue in v4.0.0 to v4.1.8. A request could reach every /api/v4 route without an API key. Upgrade now, then follow What to do.
Security
Requests reached the v4 API without an API key
| Field | Value |
|---|---|
| Affected versions | v4.0.0 to v4.1.8 |
| Fixed in | v4.1.9 |
| Severity | Critical, CVSS 3.1 score 9.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) |
| Weakness | CWE-288 (Authentication Bypass Using an Alternate Path), CWE-172 (Encoding Error) |
Every /api/v4 route needs an API key. The check tested the raw request path for the /api/ prefix, but SvelteKit decodes the path before it matches a route. A request for /%61pi/v4/monitors (%61 is the letter a) matched the monitors route and skipped the check. So anyone who could reach your Kener instance could use the whole v4 API with no key: read and change monitors, incidents, maintenances, pages, and site data, and upload images.
Kener now decides from the route that SvelteKit matched, so a percent-encoded path gets the same 401 as a plain one. API clients that send a key see no change.
What to do:
- Upgrade to v4.1.9.
- Search your access logs for requests to the v4 API whose first path segment is not the plain text
api, for example/%61pi/v4/monitorsor/a%70i/v4/monitors. A hit means someone used the API without a key. - If your instance was reachable from a network you do not trust, review your monitors, incidents, maintenances, pages, and site data for changes you did not make.
GET /api/v4/monitorsreturned each monitor's URL, headers, body, and heartbeat secret. Treat a literal token stored there as exposed and rotate it. A$SECRETreference exposes only the variable name, not its value. Make a new heartbeat secret for each heartbeat monitor.- If you ran v4.1.3 to v4.1.6,
GET /api/v4/sitealso returned the OIDC client secret and the captcha secret key in plain text. Rotate both as v4.1.7 describes.
API keys were not readable. Kener stores only their hash, and no v4 route returns them.
Bug fixes
- A malformed id gets a
404.GET /api/v4/incidents/abcand/api/v4/incidents/0returned500, and/api/v4/incidents/12abcacted on incident 12. An incident or maintenance id must now be digits only, at most2147483647, or the route returns theNOT_FOUNDJSON before it queries the database. The same applies to/api/v4/maintenances/{maintenance_id}.