The vulnerability, identified as GHSA-3g33-6vg6-27m8, is an improper access control issue in the Fission router. The root cause was that the router exposed an internal API endpoint, /fission-function/<namespace>/<function-name>, on its public listener (port 8888). This endpoint was intended for internal components (like Timers, Message Queues) to invoke functions directly.
However, by exposing it on the public listener, it allowed any external party to bypass the intended HTTPTrigger mechanism. HTTPTrigger objects are used to define specific, access-controlled routes (e.g., host, path, method) for functions. By using the internal endpoint, an attacker could invoke any function in the cluster, including those not meant to be public, and bypass any restrictions set in HTTPTriggers.
The exploitation occurs when a request is made to the vulnerable endpoint. The router would identify a handler for this route and execute it. This handler would then call the router.HttpTriggerSet.serve function, which in turn uses router.HttpTriggerSet.proxy to forward the request to the target function pod. Therefore, serve and proxy are the primary functions that would appear in a runtime profile during exploitation.
The fix, implemented in commit 814d232c, was to split the router into two separate listeners running on different ports:
- A public listener (port 8888) that only serves user-defined
HTTPTrigger routes.
- A new internal listener (port 8889) that exclusively serves the
/fission-function/... routes.
Access to this new internal listener is further restricted by Kubernetes NetworkPolicy objects (added in commit 0aa24788) and an HMAC-based authentication mechanism, ensuring only legitimate internal Fission components can invoke functions through this path.