security lab How it works
Drive-by · client-side · no phone-home

See what a hostile web page can learn about your internal GitLab

Open this page and point it at a GitLab you can reach. Through nothing but the browser, it fingerprints the version, then shows which CVEs that version is exposed to and which of those a malicious website might reach with no login. On recent Chrome, reaching an internal address also needs the visitor to accept a local-network permission prompt.

What this is, and why it matters

Many organisations run GitLab as the internal, free alternative to GitHub and assume a VPN or an IP allowlist keeps it safe. That assumption is the gap.

The drive-by CORS route, precisely

By default GitLab answers cross-origin requests to /api/* and /api/graphql from any origin, with Access-Control-Allow-Origin: *. So a page on evil.com can read anonymous JSON from git.internal.example through the browser of anyone who merely visits evil.com. No login, and no click beyond the visit (on recent Chrome, an internal target also needs the visitor to accept a local-network permission prompt; see below). The visitor's browser is the bridge from the attacker's public page to the internal host.

1. Visitor on the inside opens evil.com.
2. That page fetches https://git.internal/api/*; the browser sends it from the visitor's allowlisted network.
3. GitLab replies with Access-Control-Allow-Origin: *, so the attacker's page can read the response.
  • A GitLab on a public IP protected only by an IP allowlist is reachable this way: the request comes from the visitor's allowlisted browser, not the attacker. The attacker sees what an anonymous user inside the allowlist would see, which is enough to fingerprint the version.
  • The wildcard is set without credentials, so even if a browser attached the visitor's session cookie, the attacker's page could not read the response. What it can read is anonymous data only, and this tool never counts a CVE as reachable when the real trigger needs a login.
  • Chrome 142 and later put a public page reaching a private or loopback address behind a Local Network Access permission prompt. Firefox, Safari, older Chrome, Chrome where an administrator has turned the control off, and any GitLab on a public IP are not gated by it. Nor is a hostile page that is itself served from the internal network (a compromised wiki or SharePoint page, for example).
What the page does, step by step
  • Proves the channel. It runs harmless cross-origin probes and shows the public REST API answering (readable), the version endpoint answering but needing a token, and the GraphQL schema reading cross-origin.
  • Fingerprints the build. GitLab ships Webpack chunks whose filenames embed a content hash. The page requests a bundled set of these as preload resources and watches load versus 404; nothing is executed. A random-hash control probe first checks the server does not answer every path. A full match identifies a specific frontend build. The anonymous GraphQL Query-schema SHA is shown for reference; it is not yet used in matching.
  • Lists exposure. Only once a version is identified does it reveal the CVEs that version is exposed to, each marked vulnerable or indeterminate.
  • Flags the drive-by subset. It then flags which CVEs have a likely or conditional anonymous browser path, from a review of the public advisories and reproductions. None of these paths has been tested from a browser.
What it can and cannot resolve (honest limits)

Some patch releases ship a byte-identical frontend because the patch was backend only. Unauthenticated client-side fingerprinting therefore resolves to a build class (the set of patches that share one frontend), not always a single patch. Every collected build is told apart from every other, but a patch released after the corpus was collected can serve the same assets as the newest collected patch of its minor line, so for the three minor lines GitLab still patches, that later patch is kept as a candidate rather than ruled out. CVE ranges come from NVD, corrected where they contradict GitLab's own advisory. The exact patch is available from the authenticated /api/v4/version endpoint, so the page accepts an optional admin-approved read-only token and uses it when present. This is a defensive demonstration for authorised testing of your own infrastructure: it fingerprints and prioritises, it does not weaponise, and it contacts no third party at runtime.

  1. 1 Point at a GitLab
  2. 2 Prove the CORS channel
  3. 3 Fingerprint the version
  4. 4 See the exposure

1. Point it at a GitLab

Enter an origin you are authorised to assess, then press Enter (or leave the field) to run the anonymous probes. Nothing is contacted while you type. If you add a token, only Enter or Run starts a probe: confirm the host it may go to first. This page is served from , so every probe below is a genuine cross-origin request, exactly as a hostile site would make.

Want help closing this down?

If any of this is relevant to your estate, or you would like advice on the mitigations that shut the drive-by path and harden the browser-facing attack surface around your GitLab, ControlPlane would be glad to help.

Disclaimer and liability

This tool fingerprints a GitLab build and lists the CVEs recorded against that version. It is a prioritisation aid, not a verdict. We have not live-tested every known exploit against every version, so reality may vary: an instance may have other mitigation controls in place that this tool cannot see from the outside, and there may be exploits that are unknown to us. The real exposure could therefore be better, or worse, than what is shown here. Always confirm any individual finding with your own configuration, edition, authentication and feature-prerequisite review.

Pull requests are welcome: if you can improve the corpus, the CVE mapping or the browser-reachability assessments, please contribute. The tool is provided as-is, with no warranty of any kind. ControlPlane accepts no liability for any use of this tool, or for any decision taken on the basis of its output. Use it only against GitLab instances you are authorised to assess.