Repository navigation
Merged
Conversation
… check mcp env and plugin proxy userinfo A baseUrl such as https:/v1 or https:v1 parsed with v1 as its host (finding 1259): the URL parser treats a special scheme's slashes as optional. Refuse any http(s) baseUrl that does not write exactly two slashes (or backslashes) after the scheme, including where a Preset variable or an environment reference would have to supply them. Also refuse URL userinfo in an MCP server's proxy environment variables (mcp and nodeHost.mcp), Codex's network proxy URLs and speech provider proxies, as for env.vars since #2350.
…ronment reference Checking the whole URL around a reference refused shapes the userinfo rule names more precisely. Only the two slashes after a literal http(s) scheme are now checked there; the rest is the runtime's. Move the variable-before-slashes userinfo case to request.proxy.url, which has no slash rule, and add the breaking-change sentence.
Contributor
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review blockedAutomated review did not run, so no review verdict was produced. Reason: The input-safety check rejected material in this revision. No detected value, path, or scanner output is reproduced here. Automatic review is on hold, including after source changes. Request a fresh re-review after resolving the failure; maintainers can also release the hold through an intentional scanner-policy update. Next step: If this is a genuine credential, remove and rotate it. If it is an intentional test fixture, a maintainer must review and qualify it. |
freeqaz
had a problem deploying
to
integration-qa-pr
October 13, 2026 17:43 — with
GitHub Actions
Error
freeqaz
had a problem deploying
to
integration-qa-pr
October 13, 2026 17:43 — with
GitHub Actions
Error
…env and env fallbacks
Review of the first cut: per-agent TTS lives under agents.entries at the
pinned runtime, Discord voice and Talk providers also hand a proxy to
the Microsoft speech provider, and the acpx plugin's MCP servers take an
env map. A baseUrl fallback (${URL:-https:/v1}) is now rendered for the
slash check, as the userinfo check already did.
freeqaz
temporarily deployed
to
integration-qa-pr
October 13, 2026 18:03 — with
GitHub Actions
Inactive
freeqaz
temporarily deployed
to
integration-qa-pr
October 13, 2026 18:03 — with
GitHub Actions
Inactive
This was referenced Oct 13, 2026
This was referenced Oct 14, 2026
This branch was previously deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Finding 1259, left by #2350:
baseUrlofhttps:/v1,https:v1orhttps:/api.example.com/v1passedisRuntimeUrland parsed with the first segment as its host. A Presethttps:{{ vars.h }}/v1saved, and so didhttps:${HOST}/v1. A${...}reference skipped the baseUrl check entirely.envandenv.varsproxy variables, but not in the other fields that hold proxy URLs. On main these had no check at all:mcp.servers.*.envandnodeHost.mcp.servers.*.env: only the serverurlwas checked.plugins.entries.codex.config.appServer.networkProxy.proxyUrlandsocksUrl.plugins.entries.acpx.config.mcpServers.*.env.proxy, which the Microsoft speech plugin reads, in any TTS block:tts,agents.entries.*.tts,channels.discord.voice.ttsand its accounts' blocks, voice-call'stts, and voice-call'snumbers.*.tts, including each block'spersonas.*.providers. The same applies totalk.providersandtalk.realtime.providers.Change
isRuntimeUrlnow requires exactly two slashes after anhttp:orhttps:scheme. It ignores case, leading C0 controls and spaces, and tab or newline characters. A backslash counts as a slash, sohttps:\\hoststill saves, as before. A Preset variable cannot supply the slashes:https:{{ vars.h }}andHTTPS:/{{ vars.h }}/v1are refused at save.${VAR}reference, the newwritesSchemeSlasheschecks only the slashes after a literal http(s) scheme. It checks each fallback rendering, as the userinfo rule does, so${URL:-https:/h/v1}andhttps://${H:-}/v1are refused. The runtime still owns the rest of the URL.validateModelCredentialReferencesapplies the*_PROXYuserinfo rule to every MCP server'senvmap, including acpx's and a name that waits on a variable. It also refuses userinfo in the Codex network proxy URLs and in speech and Talk providerproxysettings.baseUrl. That URL is now refused by the slash rule first, so the case moved torequest.proxy.url, which has no slash rule. It still covers the userinfo check.countMarkdownWords.Verification
tests/integration/configuration-controller.test.mjshas new refused and accepted cases in the 1255 userinfo test and the 1256 baseUrl test:HTTPS://…,https:\\…,http://localhost:${MODEL_PORT}/v1,https://${MODEL_HOST}/v1,${MODEL_BASE_URL}/v1, a plain MCPenvproxy, a CodexproxyUrl, and a${SPEECH_PROXY}referencehttps:/v1is refusedtaskset -c 0,1.configuration-controller.test.mjs,kubernetes-configuration.test.mjsandocc-api.test.mjs: 111 of 111 pass.tsc --build, eslint and prettier are clean on the touched files.agents.entries(not the retiredagents.list), the Discord voice and Talk speech proxies, acpx MCP env, and fallback rendering for the slash rule.Risks
Breaking: these saves are now refused:
baseUrlwritten with zero, one or three or more slashes, or with a variable or reference in place of the slashesStored Configurations still read and deploy as before. Only a save or Preset launch that keeps the value is refused.
Refusing slash-less spellings that WHATWG accepts is a provisional maintainer decision, made by precedent (pre-alpha, fail-early at save). A human may revisit it. It is limited to model
baseUrl. Proxy and MCP URLs keep the parser's reading.For a
baseUrlwith a${VAR}reference, only the slashes are checked. The text after them stays the runtime's to validate.Other child-process env maps (
skills.entries.*.env, sandbox Dockerenv, a provider'slocalService.env, hook and secrets exec provider env) are still not checked for proxy userinfo. They are tracked as a follow-up finding.