# GitLab RCE PoC Published: Any Authenticated User Can Execute Commands as Git via Jupyter Notebook Diff


## The Threat


A working proof-of-concept exploit for a remote code execution vulnerability in GitLab is now public. Security researcher Yuhang Wu of depthfirst has demonstrated that any authenticated user on an unpatched self-managed GitLab instance can execute arbitrary commands as the git operating system user — no administrator privileges, no CI runner access, no victim interaction required. The attack surface is a feature most security teams wouldn't think twice about: requesting a diff between two Jupyter notebook files.


The root cause lives two layers below GitLab itself. GitLab's notebook renderer passes repository-controlled .ipynb JSON directly to Oj::Parser.usual.parse inside a long-lived Puma worker process. Oj is a high-performance Ruby JSON parser with substantial native C code, and two bugs in its parser state handling create a chain: one corrupts a callback pointer via a fixed-size stack overflow, the other leaks a heap address that defeats ASLR. Together, they let the attacker reach system() through a build-specific gadget sequence. GitLab never sanitizes or isolates the Puma worker between parses, so both stages of the exploit ride inside the same process on a single diff request.


The public exploit targets GitLab 18.11.3 on x86-64 specifically, but the underlying Oj bugs span a much wider version range. depthfirst projects exploitation time of five to ten minutes against a two-worker installation, scaling to one to two hours against instances with more mature workers and wider ASLR search space. GitLab.com was patched on June 10. Self-managed installations that haven't upgraded are exposed right now, with a working exploit in the open.


## Severity and Impact


| Field | Detail |

|---|---|

| CVE | Not yet assigned (pending as of July 24, 2026) |

| CVSS Score | Not yet published |

| CVSS Vector | Not yet published |

| CWE | CWE-121 (Stack-Based Buffer Overflow), CWE-200 (Information Exposure) |

| Attack Vector | Network |

| Attack Complexity | High (ASLR brute-force required, build-specific gadget chain) |

| Authentication Required | Yes — any valid GitLab account |

| Privileges Required | None beyond authenticated access |

| User Interaction | None |

| Execution Context | As OS-level git user |

| Potential Reach | Source code, Rails secrets, service credentials, CI/CD pipeline data, internal services reachable from the application process |


*GitLab and depthfirst have not published CVE identifiers or CVSS scores for the two chain bugs. Nine additional CVEs covering separate Oj flaws from the same depthfirst review are listed separately.*


## Affected Products


GitLab Community Edition (CE) and Enterprise Edition (EE) — all tiers (Free, Premium, Ultimate):


  • 15.2.0 through 18.10.7
  • 18.11.0 through 18.11.4
  • 19.0.0 through 19.0.1

  • Oj Ruby gem (root cause):


  • 3.13.0 through 3.17.1

  • Not affected:


  • GitLab.com (patched June 10, 2026)
  • GitLab Dedicated customers (no action required)
  • Ruby itself is not affected

  • ## Mitigations


    Upgrade immediately. No temporary workaround exists. Both depthfirst and GitLab direct self-managed operators to upgrade to a fixed release:


  • 18.10.8 — fixed release for the 18.10.x branch
  • 18.11.5 — fixed release for the 18.11.x branch
  • 19.0.2 — fixed release for the 19.0.x branch

  • Oj gem fix: Version 3.17.3 is the first release containing both upstream parser fixes.


    Helm and Operator deployments require special attention: Check the GitLab version inside the Webservice container image — not the chart version or Operator version. These can diverge, and a current chart can still ship a vulnerable application image.


    Additional hardening measures for environments that cannot immediately patch:


  • Restrict network egress from the GitLab application server to limit the blast radius if git process access is obtained
  • Review access controls to limit which users can create repositories and request diffs in your instance
  • Enable audit logging and monitor for anomalous diff requests involving .ipynb files
  • Consider disabling Jupyter notebook rendering in GitLab settings if the feature is not in active use (verify your version's configuration options)

  • depthfirst was unaware of active exploitation as of July 24, but public PoC availability changes that calculus rapidly.


    ## References


  • [depthfirst technical analysis and PoC disclosure](https://depthfirst.io)
  • [GitLab June 10 release notes (18.10.8, 18.11.5, 19.0.2)](https://about.gitlab.com/releases/)
  • [Oj gem changelog — version 3.17.3](https://rubygems.org/gems/oj)
  • [The Hacker News — original reporting](https://thehackernews.com)

  • ---


    ## HackWire Analysis


    The most important detail buried in this disclosure isn't the exploit technique — it's the absence of CVEs and CVSS scores six weeks after GitLab.com was patched. GitLab shipped the fix on June 10. The public PoC dropped July 24. That's 44 days during which self-managed operators had no formal severity signal to anchor a patching decision against. No CVE means the vulnerability doesn't surface in standard scanner feeds, SBOM tooling, or the dashboards most security teams actually use to triage. Organizations that run GitLab self-managed and rely on CVE-based alerting may have completely missed the window.


    This is a pattern worth naming: vendors increasingly ship fixes before CVE assignment, ostensibly to reduce exposure time for customers, but the practical effect is that the loudest signal — a high CVSS score — never arrives until after a PoC is already public. The gap between patch availability and formal CVE publication is becoming an operational blind spot.


    On the technical side, the exploit chain is instructive for defenders thinking about memory-unsafe parser libraries in interpreted language runtimes. GitLab is a Rails application, but the critical execution path runs through native C code in a third-party gem that GitLab's own security process doesn't own. The Puma worker reuse that enables both exploit stages in a single request is an architectural detail that almost no one auditing GitLab's Ruby surface area would have flagged. The lesson for teams running large Ruby applications: your attack surface includes every native extension in your Gemfile.lock, and process isolation between parser invocations is not a default you can assume.


    For defenders right now: if you run GitLab self-managed, the patch decision is not optional. With a working PoC public and no authentication requirement beyond a valid account, the exploit becomes commodity within days.


    — HackWire Editorial


    ## Related Coverage


  • Read more in our [Vulnerabilities](https://www.hackwire.news/category/vulnerabilities) coverage
  • Cross-reference with [Breaches](https://www.hackwire.news/category/breaches) and [Malware](https://www.hackwire.news/category/malware)
  • Stay current via the [HackWire homepage](https://www.hackwire.news/)