[{"data":1,"prerenderedAt":1298},["ShallowReactive",2],{"/blog/deepseek-reasonix-vulnerability-discovered":3,"navigation-en-us":534,"banner-en-us":961,"footer-en-us":971,"blog-post-authors-en-us-Abisheik Magesh|Daniel Abeles":1232,"blog-related-posts-en-us-deepseek-reasonix-vulnerability-discovered":1258,"blog-share-wrapper-en-us":1278,"next-steps-en-us":1288},{"id":4,"title":5,"authors":6,"body":9,"category":515,"date":516,"description":517,"extension":518,"externalUrl":519,"faq":519,"featured":520,"heroImage":521,"meta":522,"navigation":520,"path":523,"seo":524,"slug":527,"stem":528,"tags":529,"template":532,"updatedDate":519,"__hash__":533},"blogPosts/en-us/blog/deepseek-reasonix-vulnerability-discovered.md","DeepSeek-Reasonix: How a poisoned config can hijack an AI coding agent",[7,8],"Abisheik Magesh","Daniel Abeles",{"type":10,"value":11,"toc":497},"minimark",[12,34,45,52,92,97,115,122,126,151,158,168,171,176,179,230,237,241,257,263,267,270,300,304,308,314,318,321,385,389,392,396,452,455,459,467,473,476,480,487],[13,14,15,16,22,23,28,29,33],"p",{},"GitLab's Threat Research Group discovered a command execution vulnerability (",[17,18,21],"a",{"href":19,"rel":20},"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6",[],"GHSA-grg2-7gc6-36m6",", ",[17,24,27],{"href":25,"rel":26},"https://gitlab.com/gitlab-org/cves/-/blob/master/2026/CVE-2026-102437.json",[],"CVE-2026-102437",") in DeepSeek-Reasonix Studio, a desktop git client designed for developers pairing with AI coding assistants. The flaw, called ConfigPoisoning, could allow attacker-supplied code to execute when a developer views a file's diff. To address this vulnerability, you should update to DeepSeek-Reasonix Studio 2.21.0 or ",[30,31,32],"code",{},"DeepSeek Reasonix"," npm 1.39.3.",[13,35,36,37,40,41,44],{},"This is not an isolated DeepSeek-Reasonix bug. GitLab's Threat Research Group found that multiple widely used coding agents are susceptible to the same class of vulnerabilities, which allow attacker-controlled commands to run from a repository's own ",[30,38,39],{},".git/config"," and ",[30,42,43],{},".gitattributes"," files. DeepSeek-Reasonix is the first case we're disclosing in full.",[13,46,47,51],{},[48,49,50],"strong",{},"Note",": Git repositories hosted on GitLab are not affected by this vulnerability, as cloning a repository over HTTPS or SSH does not transfer local configuration files.",[53,54,55,60],"blockquote",{},[13,56,57],{},[48,58,59],{},"TL;DR",[61,62,63,70,83],"ul",{},[64,65,66,69],"li",{},[48,67,68],{},"Critical vulnerability."," GitLab's Threat Research Group found a critical command execution vulnerability in DeepSeek-Reasonix Studio, a desktop git client for AI-assisted development, that could run attacker-controlled code when a developer views a file's diff under specific repository configuration conditions.",[64,71,72,75,76,79,80,82],{},[48,73,74],{},"The root cause."," DeepSeek-Reasonix's own git wrapper hardens several git config keys against command injection, but its own code comment names one gap it hadn't closed: ",[30,77,78],{},"filter.\u003Cdriver>.clean",", which git selects per file through ",[30,81,43],{}," rather than through a fixed config key.",[64,84,85,88,89,91],{},[48,86,87],{},"Immediate recommendations."," Update to DeepSeek-Reasonix Studio 2.21.0 or ",[30,90,32],{}," npm 1.39.3. If you build tools that shell out to git, don't just patch the one vulnerable key. Override every relevant key on every call, or avoid invoking git's filter and textconv machinery, which are the hooks git uses to transform file content before committing or diffing, altogether.",[93,94,96],"h2",{"id":95},"why-coding-agents-are-a-different-kind-of-attack-surface","Why coding agents are a different kind of attack surface",[13,98,99,100,40,102,104,105,22,108,111,112,114],{},"Coding agents run git against any directory a developer opens. They inherit ",[30,101,39],{},[30,103,43],{}," from whoever wrote the repo, not from the developer who opens it. Several git configuration keys, among them ",[30,106,107],{},"core.fsmonitor, core.hooksPath",[30,109,110],{},"diff.external",", and ",[30,113,78],{},", run a named command as part of ordinary git operations. Plain git clients already carry advisories for this.",[13,116,117,118,121],{},"Because every coding agent wraps git its own way, each one tends to close only the primitive that caused its own last incident. DeepSeek-Reasonix's ",[30,119,120],{},"internal/gitcmd"," closed four of these primitives on every invocation. Its own code comment named the one it hadn't closed.",[93,123,125],{"id":124},"how-the-vulnerability-works","How the vulnerability works",[13,127,128,130,131,40,134,137,138,40,141,144,145,147,148,150],{},[30,129,120],{}," neutralizes ",[30,132,133],{},"core.fsmonitor",[30,135,136],{},"maintenance.auto"," on every call, and adds ",[30,139,140],{},"--no-ext-diff",[30,142,143],{},"--no-textconv"," on diffs. It never touches ",[30,146,78],{},". That key isn't picked from a fixed list. ",[30,149,43],{}," selects it per file, so no deny-list can close it the way the others were closed.",[13,152,153,154,157],{},"Here's the real call, from ",[30,155,156],{},"desktop/workspace_changes.go",":",[159,160,166],"pre",{"className":161,"code":163,"language":164,"meta":165},[162],"language-text","args := []string{\"-C\", base, \"diff\", \"--no-ext-diff\", \"--no-textconv\", \"--relative\", \"HEAD\", \"--\", filepath.FromSlash(rel)}\n","text","",[30,167,163],{"__ignoreMap":165},[13,169,170],{},"The clean filter still runs here. It produces the comparison blob the diff needs, and that step never passes through the flags above.",[172,173,175],"h3",{"id":174},"full-call-chain","Full call chain",[13,177,178],{},"Here's the full chain, step by step:",[180,181,182,202,208,220],"ol",{},[64,183,184,187,188,191,192,194,195,198,199,201],{},[48,185,186],{},"The setup."," ",[30,189,190],{},"secret.bin"," carries a ",[30,193,43],{}," entry assigning it to a filter driver named ",[30,196,197],{},"pwn",", and the repository's ",[30,200,39],{}," defines that driver's clean command as a script of the attacker's choosing.",[64,203,204,207],{},[48,205,206],{},"The diff view opens."," A developer opens the file's diff in DeepSeek-Reasonix's desktop app, an ordinary action for any file with an uncommitted change.",[64,209,210,187,213,215,216,219],{},[48,211,212],{},"DeepSeek-Reasonix runs its hardened command.",[30,214,156],{}," issues ",[30,217,218],{},"git -c core.fsmonitor=false -c maintenance.auto=false -C \u003Crepo> diff --no-ext-diff --no-textconv -- secret.bin",", with every existing hardening flag in place.",[64,221,222,225,226,229],{},[48,223,224],{},"The clean filter runs anyway."," Git invokes ",[30,227,228],{},"filter.pwn.clean"," to build the comparison blob, a step none of those flags touch. The attacker's command executes, once for each side of the diff.",[13,231,232,233,236],{},"Replaying the hardened command ran the payload twice: diff builds a clean-filtered blob for each side of the comparison, so the filter fires once per side. ",[30,234,235],{},"git status"," only checks which files changed, so it never builds that blob and leaves the filter untouched. That isolates the bug to diff rendering, matching DeepSeek-Reasonix's actual code path.",[172,238,240],{"id":239},"scope","Scope",[13,242,243,245,246,248,249,252,253,256],{},[30,244,43],{}," survives a clone. ",[30,247,39],{}," doesn't. Delivery needs an archive, a synced folder, a CI cache, or a devcontainer build. We confirmed this at commit ",[30,250,251],{},"ea28602"," and the tagged pre-release ",[30,254,255],{},"studio-v2.9.0",". It affects both the desktop app and the npm package.",[13,258,259,260,262],{},"But there's a more direct vector specific to agentic tooling. A rogue, compromised, or prompt-injected coding agent already running on the developer's machine has the developer's own filesystem access. It can write the poisoned ",[30,261,39],{}," straight into a repository that was cloned completely normally. No archive, synced folder, or CI cache is required.",[93,264,266],{"id":265},"why-new-tools-inherit-old-bugs","Why new tools inherit old bugs",[13,268,269],{},"None of this is unique to DeepSeek-Reasonix.",[61,271,272,284],{},[64,273,274,277,278,280,281,283],{},[48,275,276],{},"Repository configuration gets treated as part of the tool."," Coding agents read ",[30,279,39],{}," or ",[30,282,43],{}," as if they were the tool’s own settings, when it’s the repository’s author who controls them. That distinction is easy to miss, since the files sit right next to the code and look like they belong to it.",[64,285,286,289,290,295,296,299],{},[48,287,288],{},"We've seen this trust failure before, in a different file."," Earlier this year, GitLab's Threat Research Group ",[17,291,294],{"href":292,"rel":293},"https://about.gitlab.com/blog/critical-rce-in-serena/",[],"found the same pattern in Serena",", another AI coding tool. It ran attacker code from a project's own configuration file, ",[30,297,298],{},".serena/project.yml",", when a developer opened the repository. In both cases, the tool trusted a file the repository author controlled, and we expect to find the same mistake in other agentic tools.",[93,301,303],{"id":302},"how-this-impacts-you","How this impacts you",[172,305,307],{"id":306},"if-you-use-deepseek-reasonix","If you use DeepSeek-Reasonix",[13,309,310,311,313],{},"Update to Studio 2.21.0 or ",[30,312,32],{}," npm 1.39.3. On older versions, avoid diffing any repo you didn't obtain through a direct clone yourself.",[172,315,317],{"id":316},"if-you-build-git-wrapping-tools","If you build git-wrapping tools",[13,319,320],{},"These recommendations apply to any tool that shells out to git against a directory it doesn't control.",[61,322,323,336,367,379,382],{},[64,324,325,326,280,329,111,332,335],{},"Read blobs with ",[30,327,328],{},"git cat-file",[30,330,331],{},"git show",[30,333,334],{},"diff in-process",", when you only need byte-level content.",[64,337,338,339,22,341,22,344,22,347,22,350,22,352,111,355,280,357,360,361,22,363,366],{},"If you must shell out, override every relevant key on every call. That means ",[30,340,133],{},[30,342,343],{},"core.pager",[30,345,346],{},"core.editor",[30,348,349],{},"core.hooksPath",[30,351,110],{},[30,353,354],{},"core.sshCommand",[30,356,78],{},[30,358,359],{},"smudge"," for every driver name across ",[30,362,43],{},[30,364,365],{},".git/info/attributes",", and global or system files.",[64,368,369,370,372,373,375,376,378],{},"One flag doesn't cover another. ",[30,371,140],{}," affects ",[30,374,110],{},". It does nothing for ",[30,377,354],{},".",[64,380,381],{},"Don't assume the poisoned config has to arrive with the repository. Another agent, extension, or process running with the developer's own permissions can write it straight into an already-cloned repo.",[64,383,384],{},"Test against a deliberately hostile config pair before you ship.",[172,386,388],{"id":387},"if-you-lead-a-security-team","If you lead a security team",[13,390,391],{},"A tool that shells out to git on a developer's machine runs with that developer's full access. Ask vendors how they neutralize repository-local configuration, not just how they handle an untrusted remote.",[93,393,395],{"id":394},"disclosure-timeline","Disclosure timeline",[397,398,399,413],"table",{},[400,401,402],"thead",{},[403,404,405,410],"tr",{},[406,407,409],"th",{"align":408},"left","Date",[406,411,412],{"align":408},"Event",[414,415,416,425,433,445],"tbody",{},[403,417,418,422],{},[419,420,421],"td",{"align":408},"2026-08-27",[419,423,424],{"align":408},"Advisory opened with esengine",[403,426,427,430],{},[419,428,429],{"align":408},"2026-09-29",[419,431,432],{"align":408},"esengine opens a temporary private fork and accepts the report",[403,434,435,438],{},[419,436,437],{"align":408},"2026-09-30",[419,439,440,441,444],{"align":408},"Fix shipped (Studio 2.21.0 / npm 1.39.3); advisory published (",[17,442,21],{"href":19,"rel":443},[],")",[403,446,447,449],{},[419,448,437],{"align":408},[419,450,451],{"align":408},"CVE-2026-102437 assigned",[13,453,454],{},"Thanks to the DeepSeek-Reasonix maintainers for accepting the report and shipping a fix.",[93,456,458],{"id":457},"how-gitlab-can-help","How GitLab can help",[13,460,461,466],{},[17,462,465],{"href":463,"rel":464},"https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/",[],"GitLab Duo Agent Platform Security Analyst Agent"," can help you check your codebase for this same pattern. Begin your investigation by asking the agent:",[159,468,471],{"className":469,"code":470,"language":164,"meta":165},[162],"\"Does this code shell out to git against a directory it doesn't control, and does it neutralize `core.hooksPath, filter.*.clean`, and `diff.external` before running?\"\n",[30,472,470],{"__ignoreMap":165},[13,474,475],{},"The agent then will evaluate the potential impact on your environment.",[93,477,479],{"id":478},"looking-ahead","Looking ahead",[13,481,482,483,486],{},"DeepSeek-Reasonix's history is a good reminder that even a well-documented, honest gap in security can still ship, simply because ",[48,484,485],{},"knowing about a risk and closing it aren't always the same thing",". The same pattern is present in several other widely used agent tools, currently under coordinated disclosure. We'll publish details on each once a fix is available.",[53,488,489],{},[13,490,491,496],{},[17,492,495],{"href":493,"rel":494},"https://about.gitlab.com/blog/categories/security-labs/",[],"Explore more security research"," from the GitLab Threat Research Group.",{"title":165,"searchDepth":498,"depth":498,"links":499},2,[500,501,506,507,512,513,514],{"id":95,"depth":498,"text":96},{"id":124,"depth":498,"text":125,"children":502},[503,505],{"id":174,"depth":504,"text":175},3,{"id":239,"depth":504,"text":240},{"id":265,"depth":498,"text":266},{"id":302,"depth":498,"text":303,"children":508},[509,510,511],{"id":306,"depth":504,"text":307},{"id":316,"depth":504,"text":317},{"id":387,"depth":504,"text":388},{"id":394,"depth":498,"text":395},{"id":457,"depth":498,"text":458},{"id":478,"depth":498,"text":479},"security-labs","2026-10-02","GitLab's Threat Research Group found a flaw, ConfigPoisoning, that runs attacker code when a developer views a file's diff in DeepSeek-Reasonix.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782237704/cj50chkvprjthczevmog.png",{},"/en-us/blog/deepseek-reasonix-vulnerability-discovered",{"config":525,"title":5,"description":517},{"noIndex":526},false,"deepseek-reasonix-vulnerability-discovered","en-us/blog/deepseek-reasonix-vulnerability-discovered",[530,531],"security","security research","BlogPost","XOCpW-ECMwSYRAwR0_hsEyTOnuG7o6WAODGK1g5y7Es",{"logo":535,"freeTrial":540,"sales":545,"login":550,"items":555,"search":881,"minimal":912,"duo":931,"switchNav":940,"pricingDeployment":951},{"config":536},{"href":537,"dataGaName":538,"dataGaLocation":539},"/","gitlab logo","header",{"text":541,"config":542},"Get free trial",{"href":543,"dataGaName":544,"dataGaLocation":539},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":546,"config":547},"Request a demo",{"href":548,"dataGaName":549,"dataGaLocation":539},"/sales/?contact-topic=request-demo","sales",{"text":551,"config":552},"Sign in",{"href":553,"dataGaName":554,"dataGaLocation":539},"https://gitlab.com/users/sign_in/","sign in",[556,637,725,730,805,859],{"text":557,"left":520,"config":558,"menu":560},"Platform",{"dataNavLevelOne":559},"platform",{"type":561,"link":562,"columns":566,"feature":626},"lists",{"text":563,"config":564},"Explore the Platform",{"href":565,"dataGaName":559,"dataGaLocation":539},"/platform/",[567,585,608],{"title":568,"items":569},"Execution & Workflows",[570,575,580],{"text":571,"config":572},"CI/CD",{"href":573,"dataGaLocation":539,"dataGaName":574},"/solutions/continuous-integration/","ci/cd",{"text":576,"config":577},"Source Code Management",{"href":578,"dataGaLocation":539,"dataGaName":579},"/solutions/source-code-management/","source code management",{"text":581,"config":582},"Agile Delivery",{"href":583,"dataGaLocation":539,"dataGaName":584},"/solutions/agile-delivery/","agile delivery",{"title":586,"items":587},"Security & Governance",[588,593,598,603],{"text":589,"config":590},"Application Security Testing",{"href":591,"dataGaLocation":539,"dataGaName":592},"/solutions/application-security-testing/","application security testing",{"text":594,"config":595},"Governance & Compliance",{"href":596,"dataGaLocation":539,"dataGaName":597},"/solutions/software-compliance/","governance and compliance",{"text":599,"config":600},"Secrets Management",{"href":601,"dataGaLocation":539,"dataGaName":602},"/gitlab-secrets-manager/","secrets management",{"text":604,"config":605},"Supply Chain Security",{"href":606,"dataGaLocation":539,"dataGaName":607},"/solutions/supply-chain/","supply chain security",{"title":609,"items":610},"Context & AI",[611,616,621],{"text":612,"config":613},"Agentic Orchestration",{"href":614,"dataGaLocation":539,"dataGaName":615},"/gitlab-duo-agent-platform/","agentic orchestration",{"text":617,"config":618},"Context Graph",{"href":619,"dataGaLocation":539,"dataGaName":620},"/gitlab-orbit/","context graph",{"text":622,"config":623},"Visibility & Measurement",{"href":624,"dataGaLocation":539,"dataGaName":625},"/solutions/visibility-measurement/","visibility and measurement",{"config":627,"title":630,"text":631,"link":632},{"background":628,"textColor":629},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Why GitLab","One platform for speed with control across your software lifecycle.",{"text":633,"config":634},"Learn more",{"href":635,"dataGaName":636,"dataGaLocation":539},"/why-gitlab/","why gitlab",{"text":638,"left":520,"config":639,"menu":641},"Solutions",{"dataNavLevelOne":640},"solutions",{"type":561,"link":642,"columns":646,"feature":716},{"text":643,"config":644},"View all Solutions",{"href":645,"dataGaName":640,"dataGaLocation":539},"/solutions/",[647,665,683],{"title":648,"items":649},"Outcomes",[650,655,660],{"text":651,"config":652},"DevOps Modernization",{"href":653,"dataGaLocation":539,"dataGaName":654},"/assessments/devops-modernization-assessment/","devops modernization",{"text":656,"config":657},"Security Modernization",{"href":658,"dataGaLocation":539,"dataGaName":659},"/assessments/security-modernization-assessment/","security modernization",{"text":661,"config":662},"AI Modernization",{"href":663,"dataGaLocation":539,"dataGaName":664},"/assessments/ai-modernization-assessment/","ai modernization",{"title":666,"items":667},"By size",[668,673,678],{"text":669,"config":670},"Enterprise",{"href":671,"dataGaLocation":539,"dataGaName":672},"/enterprise/","enterprise",{"text":674,"config":675},"Small Business",{"href":676,"dataGaLocation":539,"dataGaName":677},"/small-business/","small business",{"text":679,"config":680},"Startups",{"href":681,"dataGaLocation":539,"dataGaName":682},"/solutions/startups/","startups",{"title":684,"items":685},"Industries",[686,691,696,701,706,711],{"text":687,"config":688},"Financial Services",{"href":689,"dataGaLocation":539,"dataGaName":690},"/solutions/finance/","financial services",{"text":692,"config":693},"Public Sector",{"href":694,"dataGaLocation":539,"dataGaName":695},"/solutions/public-sector/","public sector",{"text":697,"config":698},"Telecommunications",{"href":699,"dataGaLocation":539,"dataGaName":700},"/solutions/telecommunications/","telecommunications",{"text":702,"config":703},"Automotive",{"href":704,"dataGaLocation":539,"dataGaName":705},"/solutions/automotive/","automotive",{"text":707,"config":708},"Education",{"href":709,"dataGaLocation":539,"dataGaName":710},"/solutions/education/","education",{"text":712,"config":713},"Aerospace",{"href":714,"dataGaLocation":539,"dataGaName":715},"/solutions/aerospace/","aerospace",{"config":717,"title":718,"text":719,"link":720},{"background":628,"textColor":629},"GitLab Transcend","Catch our latest innovations announced at the last Transcend.",{"text":721,"config":722},"Read the blog",{"href":723,"dataGaName":724,"dataGaLocation":539},"/blog/gitlab-transcend-announcements/","gitlab transcend",{"text":726,"config":727},"Pricing",{"href":728,"dataGaName":729,"dataGaLocation":539,"dataNavLevelOne":729},"/pricing/","pricing",{"text":731,"config":732,"menu":734},"Resources",{"dataNavLevelOne":733},"resources",{"type":561,"link":735,"columns":739,"feature":796},{"text":736,"config":737},"View all resources",{"href":738,"dataGaName":733,"dataGaLocation":539},"/resources/",[740,768],{"title":741,"items":742},"Discover",[743,748,753,758,763],{"text":744,"config":745},"Docs",{"href":746,"dataGaName":747,"dataGaLocation":539},"https://docs.gitlab.com/","docs",{"text":749,"config":750},"University",{"href":751,"dataGaName":752,"dataGaLocation":539},"https://university.gitlab.com/","university",{"text":754,"config":755},"Demo Series",{"href":756,"dataGaName":757,"dataGaLocation":539},"/gitlab-technical-demo-series/","demo series",{"text":759,"config":760},"Demo Hub",{"href":761,"dataGaName":762,"dataGaLocation":539},"/demo-hub/","demo hub",{"text":764,"config":765},"Services",{"href":766,"dataGaName":767,"dataGaLocation":539},"/services/","services",{"title":769,"items":770},"Connect",[771,776,781,786,791],{"text":772,"config":773},"Blog",{"href":774,"dataGaName":775,"dataGaLocation":539},"/blog/","blog",{"text":777,"config":778},"Community",{"href":779,"dataGaName":780,"dataGaLocation":539},"/community/","community",{"text":782,"config":783},"Customers",{"href":784,"dataGaName":785,"dataGaLocation":539},"/customers/","customers",{"text":787,"config":788},"Partners",{"href":789,"dataGaName":790,"dataGaLocation":539},"/partners/","partners",{"text":792,"config":793},"Events",{"href":794,"dataGaName":795,"dataGaLocation":539},"/events/","events",{"config":797,"title":798,"text":799,"link":800},{"background":628,"textColor":629},"What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":801,"config":802},"Read the latest",{"href":803,"dataGaName":804,"dataGaLocation":539},"/whats-new/","whats new",{"text":806,"config":807,"menu":809},"Company",{"dataNavLevelOne":808},"company",{"type":561,"columns":810},[811],{"items":812},[813,818,824,829,834,839,844,849,854],{"text":814,"config":815},"About",{"href":816,"dataGaName":817,"dataGaLocation":539},"/company/","about",{"text":819,"config":820,"footerGa":823},"Jobs",{"href":821,"dataGaName":822,"dataGaLocation":539},"/jobs/","jobs",{"dataGaName":822},{"text":825,"config":826},"Press",{"href":827,"dataGaName":828,"dataGaLocation":539},"/press/","press",{"text":830,"config":831},"Handbook",{"href":832,"dataGaName":833,"dataGaLocation":539},"https://handbook.gitlab.com/","handbook",{"text":835,"config":836},"Leadership",{"href":837,"dataGaName":838,"dataGaLocation":539},"/company/team/e-group/","leadership",{"text":840,"config":841},"Investor relations",{"href":842,"dataGaName":843,"dataGaLocation":539},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":845,"config":846},"Trust Center",{"href":847,"dataGaName":848,"dataGaLocation":539},"/security/","trust center",{"text":850,"config":851},"AI Transparency Center",{"href":852,"dataGaName":853,"dataGaLocation":539},"/ai-transparency-center/","ai transparency center",{"text":855,"config":856},"Newsletter",{"href":857,"dataGaName":858,"dataGaLocation":539},"/company/contact/#contact-forms","newsletter",{"text":860,"config":861,"menu":862},"Contact us",{"dataNavLevelOne":808},{"type":561,"columns":863},[864],{"items":865},[866,871,876],{"text":867,"config":868},"Talk to sales",{"href":869,"dataGaName":870,"dataGaLocation":539},"/sales/","talk to sales",{"text":872,"config":873},"Support portal",{"href":874,"dataGaName":875,"dataGaLocation":539},"https://support.gitlab.com/hc/en-us","support portal",{"text":877,"config":878},"Customer portal",{"href":879,"dataGaName":880,"dataGaLocation":539},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":882,"login":883,"suggestions":890},"Close",{"text":884,"link":885},"To search repositories and projects, login to",{"text":886,"config":887},"gitlab.com",{"href":553,"dataGaName":888,"dataGaLocation":889},"search login","search",{"text":891,"default":892},"Suggestions",[893,896,899,901,905,909],{"text":894,"config":895},"GitLab Duo Agent Platform",{"href":614,"dataGaName":894,"dataGaLocation":889},{"text":897,"config":898},"Code Suggestions (AI)",{"href":614,"dataGaName":897,"dataGaLocation":889},{"text":571,"config":900},{"href":573,"dataGaName":571,"dataGaLocation":889},{"text":902,"config":903},"GitLab on AWS",{"href":904,"dataGaName":902,"dataGaLocation":889},"/partners/technology-partners/aws/",{"text":906,"config":907},"GitLab on Google Cloud",{"href":908,"dataGaName":906,"dataGaLocation":889},"/partners/technology-partners/google-cloud-platform/",{"text":910,"config":911},"Why GitLab?",{"href":635,"dataGaName":910,"dataGaLocation":889},{"freeTrial":913,"mobileIcon":918,"desktopIcon":923,"secondaryButton":926},{"text":914,"config":915},"Start free trial",{"href":916,"dataGaName":544,"dataGaLocation":917},"https://gitlab.com/-/trials/new/","nav",{"altText":919,"config":920},"Gitlab Icon",{"src":921,"dataGaName":922,"dataGaLocation":917},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":919,"config":924},{"src":925,"dataGaName":922,"dataGaLocation":917},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":927,"config":928},"Get Started",{"href":929,"dataGaName":930,"dataGaLocation":917},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":932,"mobileIcon":936,"desktopIcon":938},{"text":933,"config":934},"Learn more about GitLab Duo",{"href":614,"dataGaName":935,"dataGaLocation":917},"gitlab duo",{"altText":919,"config":937},{"src":921,"dataGaName":922,"dataGaLocation":917},{"altText":919,"config":939},{"src":925,"dataGaName":922,"dataGaLocation":917},{"button":941,"mobileIcon":946,"desktopIcon":948},{"text":942,"config":943},"/switch",{"href":944,"dataGaName":945,"dataGaLocation":917},"#contact","switch",{"altText":919,"config":947},{"src":921,"dataGaName":922,"dataGaLocation":917},{"altText":919,"config":949},{"src":950,"dataGaName":922,"dataGaLocation":917},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":952,"mobileIcon":957,"desktopIcon":959},{"text":953,"config":954},"Back to pricing",{"href":728,"dataGaName":955,"dataGaLocation":917,"icon":956},"back to pricing","GoBack",{"altText":919,"config":958},{"src":921,"dataGaName":922,"dataGaLocation":917},{"altText":919,"config":960},{"src":925,"dataGaName":922,"dataGaLocation":917},{"title":962,"button":963,"config":969},"Ship at agent speed. Prove every step. Transcend returns on October 6.",{"text":964,"config":965},"Register now",{"href":966,"dataGaName":967,"dataGaLocation":968},"/events/transcend/virtual/#register","transcend-october-2026-banner","global-banner",{"layout":970,"disabled":526},"release",{"data":972},{"text":973,"source":974,"edit":980,"contribute":985,"config":990,"items":995,"minimal":1221},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":975,"config":976},"View page source",{"href":977,"dataGaName":978,"dataGaLocation":979},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":981,"config":982},"Edit this page",{"href":983,"dataGaName":984,"dataGaLocation":979},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":986,"config":987},"Please contribute",{"href":988,"dataGaName":989,"dataGaLocation":979},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":991,"facebook":992,"youtube":993,"linkedin":994},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[996,1043,1101,1148,1189],{"title":726,"links":997,"subMenu":1012},[998,1002,1007],{"text":999,"config":1000},"View plans",{"href":728,"dataGaName":1001,"dataGaLocation":979},"view plans",{"text":1003,"config":1004},"Why Premium?",{"href":1005,"dataGaName":1006,"dataGaLocation":979},"/pricing/premium/","why premium",{"text":1008,"config":1009},"Why Ultimate?",{"href":1010,"dataGaName":1011,"dataGaLocation":979},"/pricing/ultimate/","why ultimate",[1013],{"title":1014,"links":1015},"Contact Us",[1016,1019,1021,1023,1028,1033,1038],{"text":1017,"config":1018},"Contact sales",{"href":869,"dataGaName":549,"dataGaLocation":979},{"text":872,"config":1020},{"href":874,"dataGaName":875,"dataGaLocation":979},{"text":877,"config":1022},{"href":879,"dataGaName":880,"dataGaLocation":979},{"text":1024,"config":1025},"Status",{"href":1026,"dataGaName":1027,"dataGaLocation":979},"https://status.gitlab.com/","status",{"text":1029,"config":1030},"Terms of use",{"href":1031,"dataGaName":1032,"dataGaLocation":979},"/terms/","terms of use",{"text":1034,"config":1035},"Privacy statement",{"href":1036,"dataGaName":1037,"dataGaLocation":979},"/privacy/","privacy statement",{"text":1039,"config":1040},"Cookie preferences",{"dataGaName":1041,"dataGaLocation":979,"id":1042,"isOneTrustButton":520},"cookie preferences","ot-sdk-btn",{"title":557,"links":1044,"subMenu":1058},[1045,1048,1050,1052,1054,1056],{"text":1046,"config":1047},"Explore the platform",{"href":565,"dataGaName":559,"dataGaLocation":979},{"text":612,"config":1049},{"href":614,"dataGaName":615,"dataGaLocation":979},{"text":571,"config":1051},{"href":573,"dataGaName":574,"dataGaLocation":979},{"text":617,"config":1053},{"href":619,"dataGaName":620,"dataGaLocation":979},{"text":599,"config":1055},{"href":601,"dataGaName":602,"dataGaLocation":979},{"text":630,"config":1057},{"href":635,"dataGaName":636,"dataGaLocation":979},[1059],{"title":1060,"links":1061},"Topics",[1062,1066,1071,1076,1081,1086,1091,1096],{"text":571,"config":1063},{"href":1064,"dataGaName":1065,"dataGaLocation":979},"/topics/ci-cd/","cicd",{"text":1067,"config":1068},"GitOps",{"href":1069,"dataGaName":1070,"dataGaLocation":979},"/topics/gitops/","gitops",{"text":1072,"config":1073},"DevOps",{"href":1074,"dataGaName":1075,"dataGaLocation":979},"/topics/devops/","devops",{"text":1077,"config":1078},"Version Control",{"href":1079,"dataGaName":1080,"dataGaLocation":979},"/topics/version-control/","version control",{"text":1082,"config":1083},"DevSecOps",{"href":1084,"dataGaName":1085,"dataGaLocation":979},"/topics/devsecops/","devsecops",{"text":1087,"config":1088},"Cloud Native",{"href":1089,"dataGaName":1090,"dataGaLocation":979},"/topics/cloud-native/","cloud native",{"text":1092,"config":1093},"AI for Coding",{"href":1094,"dataGaName":1095,"dataGaLocation":979},"/topics/devops/ai-for-coding/","ai for coding",{"text":1097,"config":1098},"Agentic AI",{"href":1099,"dataGaName":1100,"dataGaLocation":979},"/topics/agentic-ai/","agentic ai",{"title":638,"links":1102},[1103,1106,1109,1112,1115,1118,1120,1122,1124,1126,1128,1131,1133,1136,1140,1144],{"text":1104,"config":1105},"DevOps modernization",{"href":653,"dataGaName":654,"dataGaLocation":979},{"text":1107,"config":1108},"Security modernization",{"href":658,"dataGaName":659,"dataGaLocation":979},{"text":1110,"config":1111},"AI modernization",{"href":663,"dataGaName":664,"dataGaLocation":979},{"text":1113,"config":1114},"Financial services",{"href":689,"dataGaName":690,"dataGaLocation":979},{"text":1116,"config":1117},"Public sector",{"href":694,"dataGaName":695,"dataGaLocation":979},{"text":697,"config":1119},{"href":699,"dataGaName":700,"dataGaLocation":979},{"text":702,"config":1121},{"href":704,"dataGaName":705,"dataGaLocation":979},{"text":707,"config":1123},{"href":709,"dataGaName":710,"dataGaLocation":979},{"text":712,"config":1125},{"href":714,"dataGaName":715,"dataGaLocation":979},{"text":669,"config":1127},{"href":671,"dataGaName":672,"dataGaLocation":979},{"text":1129,"config":1130},"Small business",{"href":676,"dataGaName":677,"dataGaLocation":979},{"text":679,"config":1132},{"href":681,"dataGaName":682,"dataGaLocation":979},{"text":1067,"config":1134},{"href":1135,"dataGaName":1070,"dataGaLocation":979},"/solutions/gitops/",{"text":1137,"config":1138},"Software composition analysis",{"href":606,"dataGaName":1139,"dataGaLocation":979},"software composition analysis",{"text":1141,"config":1142},"Value stream management",{"href":624,"dataGaName":1143,"dataGaLocation":979},"value stream management",{"text":1145,"config":1146},"All solutions",{"href":645,"dataGaName":1147,"dataGaLocation":979},"all solutions",{"title":731,"links":1149},[1150,1155,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1185],{"text":1151,"config":1152},"Install",{"href":1153,"dataGaName":1154,"dataGaLocation":979},"/install/","install",{"text":1156,"config":1157},"Quick start guides",{"href":1158,"dataGaName":1159,"dataGaLocation":979},"/get-started/","quick setup checklists",{"text":744,"config":1161},{"href":746,"dataGaName":747,"dataGaLocation":979},{"text":749,"config":1163},{"href":751,"dataGaName":752,"dataGaLocation":979},{"text":754,"config":1165},{"href":756,"dataGaName":757,"dataGaLocation":979},{"text":759,"config":1167},{"href":761,"dataGaName":762,"dataGaLocation":979},{"text":764,"config":1169},{"href":766,"dataGaName":767,"dataGaLocation":979},{"text":772,"config":1171},{"href":774,"dataGaName":775,"dataGaLocation":979},{"text":777,"config":1173},{"href":779,"dataGaName":780,"dataGaLocation":979},{"text":782,"config":1175},{"href":784,"dataGaName":785,"dataGaLocation":979},{"text":787,"config":1177},{"href":789,"dataGaName":790,"dataGaLocation":979},{"text":792,"config":1179},{"href":794,"dataGaName":795,"dataGaLocation":979},{"text":855,"config":1181},{"href":857,"dataGaName":858,"dataGaLocation":979},{"text":1183,"config":1184},"What's new",{"href":803,"dataGaName":804,"dataGaLocation":979},{"text":1186,"config":1187},"All resources",{"href":738,"dataGaName":1188,"dataGaLocation":979},"all resources",{"title":806,"links":1190},[1191,1193,1195,1197,1199,1201,1203,1205,1207,1211,1216],{"text":814,"config":1192},{"href":816,"dataGaName":808,"dataGaLocation":979},{"text":819,"config":1194},{"href":821,"dataGaName":822,"dataGaLocation":979},{"text":825,"config":1196},{"href":827,"dataGaName":828,"dataGaLocation":979},{"text":830,"config":1198},{"href":832,"dataGaName":833,"dataGaLocation":979},{"text":835,"config":1200},{"href":837,"dataGaName":838,"dataGaLocation":979},{"text":840,"config":1202},{"href":842,"dataGaName":843,"dataGaLocation":979},{"text":845,"config":1204},{"href":847,"dataGaName":848,"dataGaLocation":979},{"text":850,"config":1206},{"href":852,"dataGaName":853,"dataGaLocation":979},{"text":1208,"config":1209},"Sustainability",{"href":1210,"dataGaName":1208,"dataGaLocation":979},"/sustainability/",{"text":1212,"config":1213},"Diversity, inclusion and belonging (DIB)",{"href":1214,"dataGaName":1215,"dataGaLocation":979},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1217,"config":1218},"Modern Slavery Transparency Statement",{"href":1219,"dataGaName":1220,"dataGaLocation":979},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1222},[1223,1226,1229],{"text":1224,"config":1225},"Terms",{"href":1031,"dataGaName":1032,"dataGaLocation":979},{"text":1227,"config":1228},"Cookies",{"dataGaName":1041,"dataGaLocation":979,"id":1042,"isOneTrustButton":520},{"text":1230,"config":1231},"Privacy",{"href":1036,"dataGaName":1037,"dataGaLocation":979},[1233,1246],{"id":1234,"title":7,"body":519,"config":1235,"content":1237,"description":519,"extension":1240,"meta":1241,"navigation":520,"path":1242,"seo":1243,"stem":1244,"__hash__":1245},"blogAuthors/en-us/blog/authors/abisheik-magesh.yml",{"template":1236},"BlogAuthor",{"name":7,"config":1238},{"headshot":1239},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1787000354/gmgyvfesrvwdlvt52gdw.png","yml",{},"/en-us/blog/authors/abisheik-magesh",{},"en-us/blog/authors/abisheik-magesh","kPev_Acm8MB5tgKMnU_Rkfq1sl42e8DixU6iNMXXfxI",{"id":1247,"title":8,"body":519,"config":1248,"content":1250,"description":519,"extension":1240,"meta":1253,"navigation":520,"path":1254,"seo":1255,"stem":1256,"__hash__":1257},"blogAuthors/en-us/blog/authors/daniel-abeles.yml",{"template":1236,"gitlabHandle":1249},"dabeles",{"name":8,"config":1251},{"headshot":1252},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1786473980/kjzctsiwvfc6afimsdtc.jpg",{},"/en-us/blog/authors/daniel-abeles",{},"en-us/blog/authors/daniel-abeles","9j7gS6WI8857OrOR0VcnHZiFLXpZpnKFA3tgPdDU5hw",[1259,1265,1271],{"title":1260,"description":1261,"heroImage":521,"category":515,"date":1262,"authors":1263,"slug":1264,"externalUrl":519},"Critical remote code execution in vm2, a widely used Node.js sandbox library","GitLab's Threat Research Group found a critical sandbox escape in vm2 that runs attacker code using the library's own documented configuration.","2026-09-02",[7,8],"critical-remote-code-execution-in-vm2",{"title":1266,"description":1267,"heroImage":521,"category":515,"date":1268,"authors":1269,"slug":1270,"externalUrl":519},"Critical remote code execution in Serena, a popular MCP coding agent","GitLab's Threat Research Group found a critical template injection in Serena that runs attacker code the moment a developer opens a repository.","2026-08-17",[8,7],"critical-rce-in-serena",{"title":1272,"description":1273,"heroImage":1274,"category":515,"date":1275,"authors":1276,"slug":1277,"externalUrl":519},"A sandbox is only as closed as what an AI agent can reach","Stuck in an evaluation with no way out, an AI agent escaped in an hour through the one service on its allowlist. Here's the gap that opened.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786468880/uxouffutvvwsbxzikhyc.png","2026-08-12",[8],"ai-agent-sandbox",{"header":1279,"text":1280,"button":1284,"disclaimer":1287},"Start your free\n\n30-day GitLab trial\n",[1281,1282,1283],"GitLab Duo Agent Platform access","Try our most advanced features","Automate complex tasks with AI",{"text":541,"config":1285},{"href":1286,"dataGaName":544,"dataGaLocation":775},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/blog/","No credit card required.",{"header":1289,"blurb":1290,"button":1291,"secondaryButton":1296},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1292,"config":1293},"Get your free trial",{"href":1294,"dataGaName":544,"dataGaLocation":1295},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1017,"config":1297},{"href":869,"dataGaName":549,"dataGaLocation":1295},1790987632751]