GitLab AI Gateway flaw crosses from a custom flow into server commands
CVE-2026-90970 lets a user with Duo Agent Platform access, under certain conditions, escape a prompt-template sandbox on a self-hosted AI Gateway. The patch decision depends on which gateway a GitLab instance actually uses.
By Parminder Kumar Sharma · · 10 min read
The affected component is a separate service
GitLab has released AI Gateway 19.2.4, 19.3.2 and 19.4.1 to fix CVE-2026-90970, a critical flaw rated 9.9. In GitLab's account, a person already authenticated and able to use the Duo Agent Platform could, under certain conditions, submit a specially crafted custom-flow configuration that escapes a prompt-template sandbox and causes arbitrary commands to run on the AI Gateway. That is server-side command execution, not merely an AI assistant producing an unsafe answer.
The crucial scoping question is where the AI Gateway runs. A GitLab Self-Managed installation can use its own gateway, GitLab's hosted gateway, or a hybrid arrangement in which different features take different routes. GitLab says it already fixed its hosted gateways; GitLab.com, GitLab Dedicated and self-managed customers whose affected features use GitLab's hosted gateway need no action for this advisory. Operators with a self-hosted gateway do need to check the gateway image itself. Upgrading only the main GitLab application would not demonstrate that this separate service is patched.
Why a flow configuration is a sensitive input
A custom flow is not a chat message. It is a configured, multi-step workflow managed in a GitLab project and enabled for other projects under defined visibility and access rules. GitLab's documentation describes a YAML configuration for the flow, a managing project, triggers and agents that can perform work. A person creating a flow in the product UI normally needs a Maintainer or Owner role in its managing project. The security notice, however, only states that the potential attacker is authenticated and has Duo Agent Platform access. It does not establish that the UI creation role is the minimum role for the vulnerable path.
That distinction matters because the input is treated as configuration for a server-side service, not as ordinary untrusted text to be summarised. Prompt templates should be rendered only within the intended sandbox. GitLab says a specially crafted flow configuration could escape it and reach commands on the AI Gateway. A prompt that persuades a model to answer badly and a configuration that makes the gateway process execute code are different failure modes. The latter crosses from data into the host application's execution context. The advisory does not explain the exact template syntax or parsing defect, so no responsible reconstruction can go further than that confirmed boundary.
The three trust decisions in a custom flow deployment.
- Boundary
- Project to flow
- Expected behaviour
- An authorised user supplies workflow configuration
- Why it matters here
- The actor is authenticated; the exact minimum permission for this flaw is not public
- Boundary
- Flow to template
- Expected behaviour
- Configuration is interpreted within a template sandbox
- Why it matters here
- GitLab identifies this sandbox as the escaped boundary
- Boundary
- Template to gateway host
- Expected behaviour
- Template content must not become operating-system commands
- Why it matters here
- The stated impact is arbitrary command execution on the AI Gateway
| Boundary | Expected behaviour | Why it matters here |
|---|---|---|
| Project to flow | An authorised user supplies workflow configuration | The actor is authenticated; the exact minimum permission for this flaw is not public |
| Flow to template | Configuration is interpreted within a template sandbox | GitLab identifies this sandbox as the escaped boundary |
| Template to gateway host | Template content must not become operating-system commands | The stated impact is arbitrary command execution on the AI Gateway |
The disclosed TTP: configuration becomes execution
A custom flow is meant to let an authorised user configure an AI workflow. GitLab's customisation guidance describes project-level flow definitions; its security notice identifies a specially crafted flow configuration as the trigger here. The trusted operation is to interpret a prompt template inside its sandbox. The failure is that attacker-controlled configuration can break out of that boundary and reach command execution in the gateway process.
The public advisory does not provide the payload, an endpoint, an observed persistence method, or evidence that a model response alone triggers the flaw. Those missing details matter. A defender should not write an invented detection rule around a guessed string or claim a complete attack chain from the release note. The defensible TTP is limited to the actor's access, the manipulated configuration surface, the sandbox crossing and the execution result GitLab states.
Disclosed attack conditions, separated from unanswered incident questions.
- Stage
- Entry
- What GitLab establishes
- Authenticated user with Duo Agent Platform access
- What remains unpublished
- Minimum role and exact permission combination
- Stage
- Input
- What GitLab establishes
- Specially crafted custom-flow configuration
- What remains unpublished
- Payload, endpoint and template syntax
- Stage
- Boundary
- What GitLab establishes
- Escape from the prompt-template sandbox
- What remains unpublished
- Precise implementation defect
- Stage
- Impact
- What GitLab establishes
- Arbitrary command execution on AI Gateway
- What remains unpublished
- Victim count, observed follow-on activity
| Stage | What GitLab establishes | What remains unpublished |
|---|---|---|
| Entry | Authenticated user with Duo Agent Platform access | Minimum role and exact permission combination |
| Input | Specially crafted custom-flow configuration | Payload, endpoint and template syntax |
| Boundary | Escape from the prompt-template sandbox | Precise implementation defect |
| Impact | Arbitrary command execution on AI Gateway | Victim count, observed follow-on activity |
Why 9.9 is a severity score, not an outbreak report
GitLab publishes a CVSS v3.1 score of 9.9, with fields AV:N · AC:L · PR:L · UI:N · S:C · C:H · I:H · A:H. They describe an attack reachable over a network, with low attack complexity and low privileges after authentication, no separate victim interaction, a changed security scope and high possible effects on confidentiality, integrity and availability. The score expresses the potential consequence under the scoring assumptions. It does not tell us whether anyone exploited the bug, how often custom flows were reachable, or what an attacker actually did in a customer's environment.
The changed-scope and high-impact fields help explain why this is more serious than an incorrect AI answer: the hypothetical compromise moves beyond the trust boundary of the original configuration into the gateway's execution environment. But the public notice does not identify the process account, container privileges, reachable secrets, outbound routes or exploit reliability. None of those should be silently filled in from the score. The practical priority comes from the vendor's immediate-upgrade guidance for affected self-hosted gateways, followed by an exposure assessment for the period in which the vulnerable version ran.
The version and hosting matrix
Affected ranges and first fixed AI Gateway releases in GitLab’s 2 October notice.
- AI Gateway line
- 18.1.6 through 19.2
- Affected
- From 18.1.6, before 19.2.4
- First fixed release
- 19.2.4
- AI Gateway line
- 19.3
- Affected
- Before 19.3.2
- First fixed release
- 19.3.2
- AI Gateway line
- 19.4
- Affected
- Before 19.4.1
- First fixed release
- 19.4.1
| AI Gateway line | Affected | First fixed release |
|---|---|---|
| 18.1.6 through 19.2 | From 18.1.6, before 19.2.4 | 19.2.4 |
| 19.3 | Before 19.3.2 | 19.3.2 |
| 19.4 | Before 19.4.1 | 19.4.1 |
The product distinction is easy to miss because a GitLab instance and its AI Gateway have separate versions. GitLab's architecture guide describes a fully self-hosted route, a GitLab-hosted route and a hybrid setup. In a hybrid setup, the answer may differ by feature. Check the gateway URL and deployed container or Helm image, then map which Duo features actually use it. Do not infer the gateway version from the GitLab web interface's version.
GitLab says a fix was already deployed for its hosted gateways. Its notice directs every affected self-hosted gateway to one of the patched releases immediately. This is a configuration and deployment inventory task before it is a generic 'update GitLab' ticket.
Patch decision by gateway route, according to GitLab.
- Deployment route
- Self-hosted AI Gateway
- Action for this advisory
- Check exact gateway image; upgrade an affected line
- Deployment route
- GitLab-hosted AI Gateway
- Action for this advisory
- No customer gateway update required; GitLab says it fixed the service
- Deployment route
- Hybrid
- Action for this advisory
- Check each relevant feature route; patch any affected self-hosted gateway
| Deployment route | Action for this advisory |
|---|---|
| Self-hosted AI Gateway | Check exact gateway image; upgrade an affected line |
| GitLab-hosted AI Gateway | No customer gateway update required; GitLab says it fixed the service |
| Hybrid | Check each relevant feature route; patch any affected self-hosted gateway |
Find the running gateway, not just the GitLab version
The AI Gateway is a separately deployed service. GitLab's installation guide describes a container image with an AI Gateway service and a Duo Agent Platform service, and separate HTTP and gRPC paths. It also documents versioned self-hosted-vX.Y.Z-ee image tags. A change to the GitLab application does not prove that the gateway image running behind those paths changed. Check the actual container or Kubernetes workload and its image digest or tag, then compare that deployed version with the three fixed lines in the notice. Record the pre-change and post-change values so the fix can be audited.
Next trace feature routing. GitLab's self-hosted model guide says a hybrid deployment can send a feature using a GitLab-managed model to GitLab's hosted AI Gateway while another feature uses the customer's gateway. The label 'self-managed GitLab' is therefore not enough to decide exposure; the relevant feature and its gateway destination are the unit of analysis. Conversely, owning a self-hosted gateway does not mean every AI request reaches it. Where several gateways or environments exist, inventory each one, including staging systems and standby workloads that could be promoted later.
Take this with you
Keep four pieces of evidence for each environment
- The gateway endpoint actually configured for the relevant Duo feature, including hybrid routes.
- The running image tag or digest and the workload or host on which it runs.
- The patched image tag or digest after rollout, plus service health and a representative feature test.
- The period the affected image was running and who could edit or submit custom-flow configuration then.
An operator sequence that tests the actual boundary
Take this with you
Verify and act
- Inventory AI Gateway deployments, image tags and feature routing, including hybrid configurations.
- Compare each self-hosted gateway with the affected ranges and move to 19.2.4, 19.3.2 or 19.4.1 as appropriate.
- Confirm the new container or Helm workload is running and the GitLab instance still reaches the intended gateway.
- Review who could create or change custom flows during the exposure period; preserve relevant change and gateway logs before drawing incident conclusions.
GitLab's installation guide shows why the image tag matters: the AI Gateway is deployed as its own service and generally tracks the GitLab version. Verification should inspect the running service, not just a desired configuration file or a completed change request. Restricting custom-flow permissions may reduce exposure while an update is arranged, but GitLab presents upgrading the affected gateway as the fix.
There is no published claim here that customer data was stolen or that an exploit is circulating. For a potentially exposed gateway, reviewing who had flow access and whether configurations changed is a prudent investigation step, not evidence that those events occurred. The decisive control remains the patched gateway version.
What an investigation can check without inventing an exploit signature
If a vulnerable self-hosted gateway was reachable, begin with a narrow evidence question: who could submit or modify flow configuration, and which flows changed while that image ran? Preserve the relevant project audit history, flow definitions, gateway application logs, container or host process telemetry and outbound network records where those sources exist. Compare unexpected flow changes with the responsible user's activity and change tickets. If gateway telemetry shows an unusual child process or outbound connection, investigate it as a lead, not as a vendor-confirmed indicator of this CVE.
GitLab has not supplied a payload, detection pattern or exploit endpoint in the public release. That means a search for one guessed string would create false reassurance. The same restraint applies to a lack of findings: missing or short-retention logs cannot prove that exploitation did not occur. Document what was observable, what was not retained and whether the relevant custom-flow function was enabled. Preserve evidence before rotating or deleting the old gateway workload, and follow your normal incident process if independent suspicious activity is found. These are investigative choices inferred from the disclosed entry surface and impact; they are not a claim that GitLab observed such activity.
Evidence questions tied to the disclosed route.
- Question
- Could a flow be changed?
- Useful record
- Flow configuration and project audit history
- Interpretation limit
- Permission or change alone is not exploitation
- Question
- Did the gateway behave unexpectedly?
- Useful record
- Gateway, container and process telemetry
- Interpretation limit
- No public exploit signature exists for a definitive match
- Question
- Could execution reach elsewhere?
- Useful record
- Network egress and host access records
- Interpretation limit
- Potential reach is not proof that data left
| Question | Useful record | Interpretation limit |
|---|---|---|
| Could a flow be changed? | Flow configuration and project audit history | Permission or change alone is not exploitation |
| Did the gateway behave unexpectedly? | Gateway, container and process telemetry | No public exploit signature exists for a definitive match |
| Could execution reach elsewhere? | Network egress and host access records | Potential reach is not proof that data left |
The decision in one sentence
For this advisory, the decisive question is whether any Duo feature used an affected self-hosted AI Gateway image. If yes, update that image to the fixed release for its line and verify the running service. If no, retain the route evidence that supports that conclusion. The public record supports the boundary and the remedy; it does not support a fabricated exploit walkthrough or a breach claim.
Sources
- PrimaryAI Gateway critical patch releaseGitLabaccessed 2026-10-02
- PrimarySelf-hosted models and gateway choicesGitLabaccessed 2026-10-02
- PrimaryCustomise Duo Agent PlatformGitLabaccessed 2026-10-02
- PrimaryInstall the GitLab AI GatewayGitLabaccessed 2026-10-02
- PrimaryCustom flows and project permissionsGitLabaccessed 2026-10-02
