CVE-2023-50710: Hono's named path parameters can be overridden in TrieRouter
Impact
The clients may override named path parameter values from previous requests if the application is using TrieRouter. So, there is a risk that a privileged user may use unintended parameters when deleting REST API resources.
TrieRouter is used either explicitly or when the application matches a pattern that is not supported by the default RegExpRouter.
The code to reproduce it. The server side application:
ts import { Hono } from 'hono' import { TrieRouter } from 'hono/router/trie-router'
const wait = async (ms: number) => { return new Promise((resolve) => { setTimeout(resolve, ms) }) }
const app = new Hono({ router: new TrieRouter() })
app.use('', async (c, next) => { await wait(Math.random() 200) return next() })
app.get('/modules/:id/versions/:version', async (c) => { const id = c.req.param('id') const version = c.req.param('version')
console.log('path', c.req.path) console.log('version', version)
return c.json({ id, version, }) })
export default app
The client code which makes requests to the server application:
ts const examples = [ 'http://localhost:8787/modules/first/versions/first', 'http://localhost:8787/modules/second/versions/second', 'http://localhost:8787/modules/third/versions/third', ]
const test = () => { for (const example of examples) { fetch(example) .then((response) => response.json()) .then((data) => { const splitted = example.split('/') const expected = splitted[splitted.length - 1]
if (expected !== data.version) { console.error(Error: exprected ${expected} but got ${data.version} - url was ${example}) } }) } }
test()
The results:
txt Error: exprected second but got third - url was http://localhost:8787/modules/second/versions/second Error: exprected first but got third - url was http://localhost:8787/modules/first/versions/first
Patches
"v3.11.7" includes the change to fix this issue.
Workarounds
Don't use TrieRouter directly.
ts // DON'T USE TrieRouter import { TrieRouter } from 'hono/router/trie-router' const app = new Hono({ router: new TrieRouter() })
References
Router options on the Hono website: https://hono.dev/api/hono#router-option
Other sources
Hono is a web framework written in TypeScript. Prior to version 3.11.7, clients may override named path parameter values from previous requests if the application is using TrieRouter. So, there is a risk that a privileged user may use unintended parameters when deleting REST API resources. TrieRouter is used either explicitly or when the application matches a pattern that is not supported by the default RegExpRouter. Version 3.11.7 includes the change to fix this issue. As a workaround, avoid using TrieRouter directly.
Affected Software
Remediation
Event History
Frequently Asked Questions
What is the severity of CVE-2023-50710?
CVE-2023-50710 is considered a high severity vulnerability due to the potential for unauthorized access to delete REST API resources.
How do I fix CVE-2023-50710?
To fix CVE-2023-50710, upgrade to version 3.11.8 or later of the Hono framework.
What causes CVE-2023-50710?
CVE-2023-50710 is caused by the TrieRouter allowing clients to override named path parameter values.
Which versions of Hono are affected by CVE-2023-50710?
CVE-2023-50710 affects Hono versions prior to 3.11.8.
What should I do if I cannot upgrade Hono to mitigate CVE-2023-50710?
If upgrading is not possible, consider implementing additional access controls or parameter validation to mitigate the risk of CVE-2023-50710.