can1357/oh-my-pi · error · HTTPException

git remote helper transports are disabled

Error message

git remote helper transports are disabled

What it means

The proxy disables git remote-helper transports. Any URL matching _REMOTE_HELPER_RE (r"^[A-Za-z][A-Za-z0-9+.-]*::", e.g. 'ext::sh -c ...') is refused with HTTP 400, because remote helpers can execute arbitrary commands and are a known git attack vector.

Source

Thrown at python/robomp/src/proxy/server.py:348

        raise HTTPException(400, "remote url must not contain params, query, or fragment")
    path = parsed.path.strip("/")
    if path.endswith(".git"):
        path = path[:-4]
    if path.lower() != expected_repo.lower():
        raise HTTPException(400, f"remote url does not match repo {expected_repo!r}")
    return _github_url_for_repo(expected_repo)


def _remote_auth_for_url(url: str, expected_repo: str, token: str) -> _RemoteAuth:
    raw = url.strip()
    if not raw or raw != url:
        raise HTTPException(400, "remote url must not be empty or padded")
    if _FORBIDDEN_URL_BYTES_RE.search(raw):
        raise HTTPException(400, "remote url contains forbidden control bytes")
    if raw.startswith("-"):
        raise HTTPException(400, "remote url must not start with '-'")
    if _REMOTE_HELPER_RE.match(raw):
        raise HTTPException(400, "git remote helper transports are disabled")
    scheme = (urlparse(raw).scheme or "").lower()
    if scheme in ("http", "https"):
        normalized = _normalized_github_https_url(raw, expected_repo)
        return _RemoteAuth(url=normalized, token=token, auth_url=normalized)
    return _RemoteAuth(url=raw, token=None, auth_url=None)


def _clone_remote_auth(clone_url: str, expected_repo: str, token: str) -> _RemoteAuth:
    try:
        return _remote_auth_for_url(clone_url, expected_repo, token)
    except HTTPException:
        log.warning(
            "gh-proxy: refusing clone — clone_url is not permitted",
            extra={"expected_repo": expected_repo},
        )
        raise

View on GitHub (pinned to 9690622007)

Solutions

  1. Use a normal transport (https:// or ssh) URL instead of a '<helper>::' URL
  2. Remove the helper prefix and clone the underlying real remote directly
  3. If you genuinely need a helper transport, do it locally with plain git outside the proxy

Example fix

// before
clone({ repo: "ext::sh -c git clone src dst" })
// after
clone({ repo: "https://github.com/org/repo.git" })
Defensive patterns

Strategy: validation

Validate before calling

if (/^[A-Za-z][A-Za-z0-9+.-]*::/.test(url)) throw new Error("remote helper transports are not allowed");

Type guard

function isPlainTransportUrl(u: unknown): u is string {
  return typeof u === "string" && /^(https?|ssh|git):\/\//.test(u) && !/^[A-Za-z][A-Za-z0-9+.-]*::/.test(u);
}

Prevention

When it happens

Trigger: Supplying a URL with a '<transport>::' prefix (e.g. 'ext::', 'git-remote-ext::') to an endpoint that resolves to _clone_remote_auth or _origin_remote_auth.

Common situations: Security research or exploit attempts using ext:: remote helpers; accidentally copying a documented helper URL into a repo field; tooling that emits transport-prefixed URLs.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/f77a88d5979a2540. Report an issue: GitHub.