{"id":7038,"date":"2026-07-25T10:52:18","date_gmt":"2026-07-25T10:52:18","guid":{"rendered":"https:\/\/lockitsoft.com\/?p=7038"},"modified":"2026-07-25T10:52:18","modified_gmt":"2026-07-25T10:52:18","slug":"gitlab-rce-vulnerability-exploited-weeks-after-patch-due-to-undisclosed-security-fix","status":"publish","type":"post","link":"https:\/\/lockitsoft.com\/?p=7038","title":{"rendered":"GitLab RCE Vulnerability Exploited Weeks After Patch Due to Undisclosed Security Fix"},"content":{"rendered":"<p>Security researchers at depthfirst have successfully developed and published working exploit code for a critical vulnerability in GitLab, a popular platform for software development and collaboration. This exploit targets a flaw that GitLab had already patched six weeks prior, on June 10, 2026. The vulnerability, which allows any authenticated user with push access to a project to execute commands with the privileges of the <code>git<\/code> user on self-managed GitLab instances running version <code>18.11.3<\/code> that have not yet applied the update, highlights a concerning oversight in GitLab&#8217;s security patching process.<\/p>\n<p>The exploit chain is particularly insidious because it leverages two memory corruption bugs within the Oj gem, a Ruby JSON parser heavily reliant on native C code. These bugs were autonomously flagged by depthfirst&#8217;s systems and subsequently chained together by researchers. The attack vector begins with an attacker committing a specially crafted Jupyter notebook to a project. By examining the commit diff of this notebook, an attacker can extract a heap pointer. Accumulating sufficient pointers allows for the automated probing and locating of essential libraries within the server&#8217;s memory. Following this, two additional notebooks are used to trigger the payload, enabling remote code execution (RCE). Crucially, this exploit bypasses the need for administrator privileges, access to CI\/CD runners, victim interaction, or even access to other users&#8217; projects.<\/p>\n<p>A significant point of concern is that GitLab did not initially classify the fix for this vulnerability as a security update. An investigation by The Hacker News revealed that the update for Oj, specifically version <code>3.17.3<\/code>, was listed under general bug fixes in the June 10 patch release notes, rather than in the dedicated security fix section. This omission meant that system administrators triaging the release against security bulletins would have had no reason to prioritize it as an urgent security patch, potentially leaving many systems vulnerable for an extended period. Consequently, there is no publicly assigned CVE identifier and no CVSS score associated with this specific exploit chain, further obscuring its severity from many security-conscious operators.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/lockitsoft.com\/?p=7038\/#The_Technical_Underpinnings_of_the_Exploit\" >The Technical Underpinnings of the Exploit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/lockitsoft.com\/?p=7038\/#A_Deeper_Dive_into_Affected_Versions_and_the_Chronology_of_Discovery\" >A Deeper Dive into Affected Versions and the Chronology of Discovery<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/lockitsoft.com\/?p=7038\/#The_Implications_of_Undisclosed_Security_Fixes\" >The Implications of Undisclosed Security Fixes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/lockitsoft.com\/?p=7038\/#Broader_Impact_and_Recommendations_for_Mitigation\" >Broader Impact and Recommendations for Mitigation<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"The_Technical_Underpinnings_of_the_Exploit\"><\/span>The Technical Underpinnings of the Exploit<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The effectiveness of this exploit hinges on two distinct memory corruption vulnerabilities within the Oj gem. The first bug allows an attacker to write beyond a fixed 1,024-byte nesting stack. This overwrite can ultimately gain control of the parser&#8217;s <code>start<\/code> callback function. The second vulnerability involves the truncation of a 65,565-byte object key to a mere 29 characters within a signed 16-bit field. This process, critically, returns a live heap pointer. GitLab&#8217;s notebook renderer, specifically a component called <code>ipynbdiff<\/code> integrated within the application, processes repository-controlled <code>.ipynb<\/code> JSON files. It passes this data to <code>Oj::Parser.usual.parse<\/code> within a long-lived Puma worker. This mechanism allows attacker-controlled bytes to directly interact with Oj&#8217;s manually managed C memory within the application process.<\/p>\n<figure class=\"article-inline-figure\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgRIN1sheAdScq7AX9pLc07esRzQ18-0vBJ7hz9DlVhggVAImXrhYM_zxN0N6hJ2inDkBCnzRCXHR3Kv3I0QwyiVWkAMu7p949JSjgK611r48deMbrSN8iDD78aJdfxEeO_Jy6JFwOfPL_8M0RKEBl1RFO7ufvop1XG9-tdms7VRyvONXoteuCYp9Rg-FM\/s1700-e365\/gitlab.gif\" alt=\"Researcher Publishes GitLab RCE PoC Letting Authenticated Users Run Commands as Git\" class=\"article-inline-img\" loading=\"lazy\" \/><\/figure>\n<p>The leaked heap pointer, once obtained, is utilized to locate critical libraries such as libc in memory. The control gained over the <code>start<\/code> callback, through the stack overflow, is then manipulated to point to the <code>system()<\/code> function, a standard C library function that executes commands. This combination effectively transforms the vulnerability into a remote code execution channel, allowing arbitrary commands to be run on the vulnerable server.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"A_Deeper_Dive_into_Affected_Versions_and_the_Chronology_of_Discovery\"><\/span>A Deeper Dive into Affected Versions and the Chronology of Discovery<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The vulnerability impacts a broad spectrum of GitLab installations. Across all tiers, including GitLab Community Edition (CE) and Enterprise Edition (EE), from free to ultimate licenses, versions <code>15.2.0<\/code> through <code>18.10.7<\/code> are affected, with a fix available in <code>18.10.8<\/code>. Further versions <code>18.11.0<\/code> through <code>18.11.4<\/code> are also vulnerable, patched in <code>18.11.5<\/code>. For the latest release branches, versions <code>19.0.0<\/code> through <code>19.0.1<\/code> are impacted, with a fix in <code>19.0.2<\/code>. The underlying Oj gem itself was vulnerable in versions <code>3.13.0<\/code> to <code>3.17.1<\/code>, with the fix provided in <code>3.17.3<\/code>. It is important to note that Ruby itself is not directly affected by these vulnerabilities. While Oj version <code>3.17.2<\/code> did contain other fixes stemming from the same security review, it did not address these specific memory corruption bugs.<\/p>\n<p>The timeline of discovery and patching reveals a potentially critical gap between the identification of underlying issues and their secure remediation:<\/p>\n<ul>\n<li><strong>May 21, 2026:<\/strong> depthfirst reports the two critical Oj memory corruption bugs to the Oj maintainer.<\/li>\n<li><strong>May 27, 2026:<\/strong> The Oj maintainer merges the necessary fixes.<\/li>\n<li><strong>June 4, 2026:<\/strong> Oj version <code>3.17.3<\/code>, containing the critical fixes, is released.<\/li>\n<li><strong>June 5, 2026:<\/strong> depthfirst submits their findings on the GitLab exploit chain to GitLab.<\/li>\n<li><strong>June 8, 2026:<\/strong> GitLab confirms the RCE exploit independently.<\/li>\n<li><strong>June 10, 2026:<\/strong> GitLab releases patch release <code>19.0.2<\/code>, which includes the fix for the Oj gem but is not explicitly flagged as a security update.<\/li>\n<li><strong>July 24, 2026:<\/strong> depthfirst publishes their working exploit code, making the vulnerability widely accessible.<\/li>\n<\/ul>\n<p>This timeline highlights that while the core components were fixed relatively quickly, the lack of immediate public disclosure as a security issue allowed for a significant window of opportunity for exploitation.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"The_Implications_of_Undisclosed_Security_Fixes\"><\/span>The Implications of Undisclosed Security Fixes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The decision by GitLab to categorize the fix for this critical RCE vulnerability under general bug fixes has significant implications for the cybersecurity posture of organizations relying on their platform. Without a CVE designation or explicit mention in security advisories, system administrators who diligently review patch notes for security-related updates may have overlooked this critical fix. This is particularly problematic for organizations that adhere to strict security protocols, where updates are often prioritized based on their security classification.<\/p>\n<figure class=\"article-inline-figure\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjQl2axNwsfhbXOFynrg_uAZsvHi3OvNGSA8KJO-BKR8Xm3x7yjKV3EvfY4v5mwXx6LF0uWFb9h9d9iAV_Pi-YYhqimX9wx4OaLdDJEdR215Xrxq_PAtXkaLfQso4pTSjbj6fvh_ZTliLpzWZSZfcoZgyXtKwhN-SSDDlmbtUqGLshc0KqYQGWYHMN52Sl1\/s728-e100\/zz-d.jpg\" alt=\"Researcher Publishes GitLab RCE PoC Letting Authenticated Users Run Commands as Git\" class=\"article-inline-img\" loading=\"lazy\" \/><\/figure>\n<p>The commands executed through this exploit run with the privileges of the <code>git<\/code> user, which is the account under which Puma, GitLab&#8217;s web server, operates. The extent of potential damage depends heavily on the isolation and configuration of the GitLab instance. However, in a typical setup, an attacker could gain access to sensitive information including source code, Rails application secrets, service credentials, detailed CI\/CD pipeline data, and potentially interact with other internal services accessible from the GitLab server.<\/p>\n<p>The public exploit code is specifically engineered for GitLab version <code>18.11.3<\/code> running on x86-64 architecture. This means that while the underlying Oj bugs are general, adapting the exploit to different environments, such as varying architectures or GitLab versions outside the immediate scope, would require substantial effort. Factors like gadget offsets, register states, and jemalloc behavior are specific to the target image, and the leak of the library base is only stable until the Puma master process restarts.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Broader_Impact_and_Recommendations_for_Mitigation\"><\/span>Broader Impact and Recommendations for Mitigation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The vulnerability underscores the interconnectedness of the software supply chain. A vulnerability in a third-party library like Oj, when integrated into a widely used platform like GitLab, can have far-reaching consequences. depthfirst&#8217;s research into the Oj gem has reportedly yielded nine additional CVE advisories, indicating a broader set of potential security weaknesses within the library that may require further attention from its users.<\/p>\n<p>For organizations utilizing GitLab, the primary recommendation is to <strong>upgrade immediately<\/strong> to one of the patched versions: <code>18.10.8<\/code>, <code>18.11.5<\/code>, or <code>19.0.2<\/code>. There is currently no known workaround for users who cannot upgrade.<\/p>\n<p>A crucial point of attention for administrators managing GitLab deployments, particularly those using Helm charts or Kubernetes Operators, is to verify the <strong>GitLab version within the Webservice image<\/strong> running Puma, rather than solely relying on the chart or Operator version. This is because older versions of GitLab (e.g., <code>15.2<\/code> through <code>18.9<\/code>) that fall outside GitLab&#8217;s officially supported security maintenance patch trains will not receive backported fixes. For these instances, a migration to a currently supported release is the only secure path forward.<\/p>\n<figure class=\"article-inline-figure\"><img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiiKTyaaLkhwstQr3NKKNz65EvIXQgyvfFLQ-FJU7bXyQu8z40Wjm_CNFPnYSNqUOqYXgT0ClkMj-FG-E1KYhlD5y0NOUUTo8Z3s7YECp1045Gm3MqxsXVckEbtGCAw_94koZXNPhNmlz6aQ5VTTTxfpNMIai4APKbZNYUQrsQpXdLvdoosjhWRauoy1GQ\/s1700-e365\/git-exploited.png\" alt=\"Researcher Publishes GitLab RCE PoC Letting Authenticated Users Run Commands as Git\" class=\"article-inline-img\" loading=\"lazy\" \/><\/figure>\n<p>depthfirst has indicated that they are not aware of any instances of this vulnerability being exploited in the wild prior to their public disclosure. However, the availability of a working exploit significantly increases the risk of targeted attacks. The company is awaiting responses from GitLab regarding the classification of the fix and the potential assignment of a CVE, as well as from depthfirst regarding the portability of their exploit.<\/p>\n<p>The incident serves as a stark reminder of the importance of transparency in security vulnerability disclosure and the critical need for organizations to maintain up-to-date software inventories and diligently apply all patches, regardless of their initial classification. A proactive approach to security, including continuous monitoring and rapid patching, is essential to defend against the ever-evolving threat landscape.<\/p>\n<!-- RatingBintangAjaib -->","protected":false},"excerpt":{"rendered":"<p>Security researchers at depthfirst have successfully developed and published working exploit code for a critical vulnerability in GitLab, a popular platform for software development and collaboration. This exploit targets a flaw that GitLab had already patched six weeks prior, on June 10, 2026. The vulnerability, which allows any authenticated user with push access to a &hellip;<\/p>\n","protected":false},"author":12,"featured_media":7037,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[108],"tags":[109,361,3523,127,111,110,3525,995,3524],"class_list":["post-7038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cybersecurity-protection","tag-cybersecurity","tag-exploited","tag-gitlab","tag-patch","tag-privacy","tag-security","tag-undisclosed","tag-vulnerability","tag-weeks"],"_links":{"self":[{"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/posts\/7038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7038"}],"version-history":[{"count":0,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/posts\/7038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=\/wp\/v2\/media\/7037"}],"wp:attachment":[{"href":"https:\/\/lockitsoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lockitsoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}