The clerkFrontendApiProxy function in @clerk/backend is vulnerable to Server-Side Request Forgery (SSRF). An unauthenticated attacker can craft a request path that causes the proxy to send the application's Clerk-Secret-Key to an attacker-controlled server.
Only applications that have opted into the frontendApiProxy feature are affected. This feature is not enabled by default. Users of @clerk/nextjs are not affected due to how the framework handles repeated / in request paths.
| Package | Affected versions | Fixed version |
|---|---|---|
@clerk/backend |
>= 3.0.0, <= 3.2.2 |
3.2.3 |
@clerk/express |
>= 2.0.0, <= 2.0.6 |
2.0.7 |
@clerk/hono |
>= 0.1.0, <= 0.1.4 |
0.1.5 |
@clerk/fastify |
>= 3.1.0, <= 3.1.4 |
3.1.5 |
Search your codebase for the frontendApiProxy option. If none of the patterns below appear in your code, you are not affected.
@clerk/express
app.use(clerkMiddleware({ frontendApiProxy: { enabled: true } }));
@clerk/hono
app.use('*', clerkMiddleware({ frontendApiProxy: { enabled: true } }));
@clerk/fastify
fastify.register(clerkPlugin, { frontendApiProxy: { enabled: true } });
@clerk/backend
import { clerkFrontendApiProxy } from '@clerk/backend/proxy';
A quick way to check across your entire project:
grep -r "frontendApiProxy\|clerkFrontendApiProxy" .
If there are no matches, you are not using this feature.
Clerk's internal logs show no evidence of users utilizing the built-in proxy with the impacted versions. Despite that, if you are on an impacted version and use the built-in proxy we recommend upgrading and rotating your Clerk Secret Key immediately.
@clerk/backend (and @clerk/express, @clerk/hono, etc.)/__clerk/ by default) containing double slashes in the path.Discovered during an internal code audit.
{
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-03-27T19:58:19Z",
"nvd_published_at": "2026-04-01T18:16:29Z",
"severity": "HIGH"
}