Hardening GitLab CI/CD: Blue Team CVE-2024-6385 Pipeline Defense
Overview & Defensive Context: The Demise of Implicit Pipeline Trust#
Harden GitLab CI/CD against CVE-2024-6385: upgrade to 17.1.2+, isolate runner networks, migrate to external secrets, and audit pipeline triggers.
In our morning threat architecture analysis, we deconstructed the offensive mechanics of GitLab CVE-2024-6385 (classified under CWE-284: Improper Access Control, CVSS 9.6 Critical) and related vulnerability CVE-2024-5655, mapped to MITRE ATT&CK T1190: Exploit Public-Facing Application, T1548: Abuse Elevation Control Mechanism, and T1552.004: Unsecured Credentials: Private Keys / Environment Secrets. We demonstrated how an unprivileged developer or external fork contributor can exploit authorization logic defects in GitLab's Ruby on Rails backend service (Ci::CreatePipelineService). By triggering merge request pipelines or multi-project pipeline chains under specific conditions, the framework assigns the execution identity of the pipeline to a project Maintainer or Owner rather than the initiating actor. This allows the adversary to bypass branch protection rules, execute arbitrary scripts inside privileged runner environments, and harvest all masked and protected CI/CD variables (including production AWS IAM keys, Kubernetes kubeconfigs, and deploy tokens).
For DevSecOps leads, CI/CD platform architects, and enterprise blue teams, defending automated build pipelines against pipeline takeover exposes systemic flaws in conventional DevSecOps assumptions:
- The Fallacy of Static Environment Variables: For years, software engineering teams have treated GitLab's "Protected and Masked" variable settings as an infallible vault for sensitive production infrastructure secrets. However, environment variables injected into a CI/CD job container are accessible to any arbitrary shell script executing within
.gitlab-ci.yml. If an authorization defect allows an unprivileged actor to execute a pipeline in a protected context, every static secret configured in project or group settings is instantly compromised. Securing the modern software supply chain mandates moving away from static secrets toward dynamic, short-lived OIDC identity federation. - The Danger of Privileged Docker-in-Docker Runners: To allow developers to build container images inside CI/CD jobs, platform teams routinely configure GitLab Runners with the Docker executor in privileged mode (
privileged = truewithdocker:dind). If an attacker hijacks a pipeline viaCVE-2024-6385, the executing script gains unrestricted access to the runner host's kernel, enabling immediate container breakouts, host persistence, and lateral movement into the runner's internal subnet. - The Necessity of Independent Pipeline Authorization Checks: Monolithic platforms like GitLab bundle repository hosting, identity management, code review, and pipeline execution into a shared database and service layer. When identity resolution logic fails during pipeline instantiation, all downstream authorization checks—including runner tags and environment protection rules—inherit the corrupted user identity. True defense-in-depth requires establishing decoupled verification gates, mandatory merge request approvals, and external secrets management.
- The Blueprint for Enterprise GitLab CI/CD Hardening: Completely securing GitLab pipelines against unauthorized execution and secret harvesting requires deploying controls across five distinct tiers: upgrading GitLab instances to patched release baselines (17.1.2+, 17.0.3+, or 16.11.5+), migrating static CI/CD variables to dynamic HashiCorp Vault / AWS OIDC JWT tokens, hardening GitLab Runners (deprecating privileged DinD and enforcing network egress filtering), enforcing branch and merge request approval policies, and instrumenting SIEM detection rules on
audit_json.log.
While updating GitLab patches the vulnerability, any static CI/CD variables exposed on vulnerable instances prior to patching must be considered compromised and immediately rotated across cloud providers.
⚔️ Exploitation Mechanics: For root-cause memory corruption analysis and attack flow, see our deep-dive: Deconstructing Breakdown.
Architecture Hardening: Five-Tier Defense-in-Depth for GitLab CI/CD#
Securing enterprise GitLab deployments against pipeline hijacking, unauthorized user delegation, and secret leakage requires implementing architectural controls across platform versions, secrets architecture, runner infrastructure, pipeline policies, and SIEM telemetry.
Defense Architecture Flowchart#
flowchart TD
classDef client fill:#1e293b,stroke:#ef4444,stroke-width:2px,color:#f8fafc
classDef gate fill:#0f172a,stroke:#3b82f6,stroke-width:2px,color:#93c5fd
classDef secure fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#6ee7b7
classDef audit fill:#4c1d95,stroke:#8b5cf6,stroke-width:2px,color:#ddd6fe
classDef drop fill:#450a0a,stroke:#dc2626,stroke-width:2px,color:#fca5a5
classDef pass fill:#065f46,stroke:#34d399,stroke-width:2px,color:#a7f3d0
Attacker[Unprivileged Actor Submits Fork MR or API Trigger Request]:::client --> VersionGate{Tier 1: GitLab Rails Version Verification Gate}:::gate
VersionGate -- Vulnerable GitLab Version <= 17.1.1 Unpatched --> VulnDelegation[Ci::CreatePipelineService Swaps Identity to Maintainer]:::drop
VersionGate -- Patched GitLab Version >= 17.1.2 Installed --> StrictAuth[Enforce Strict Invoking User Identity Validation]:::pass
StrictAuth --> PolicyGate{Tier 2: Pipeline Approval & Branch Policy Gate}:::gate
PolicyGate -- Unapproved Fork MR Attempting Protected Execution --> BlockMR[Action: Drop Pipeline / Require Maintainer Approval]:::drop
PolicyGate -- Verified Protected Branch Commit by Authorized Maintainer --> SecretsGate{Tier 3: Secrets Architecture Gate}:::gate
SecretsGate -- Static Protected Variables Injected into Job --> StaticRisk[Warning: Static AWS / K8s Keys Exposed in Environment]:::drop
SecretsGate -- Dynamic OIDC JWT Federation via HashiCorp Vault --> VendedTokens[Action: Short-Lived Ephemeral Token Vended per Job]:::secure
VendedTokens --> RunnerGate{Tier 4: GitLab Runner Isolation & Egress Gate}:::gate
RunnerGate -- Privileged Docker-in-Docker or Host Network Access --> RunnerEscape[Vulnerability: Runner Host Compromise via DinD Escape]:::drop
RunnerGate -- Ephemeral VM Runner + Unprivileged OCI + Network Denied --> SecureBuild[Safe Execution: Zero Egress & Zero Host Mounts]:::secure
SecureBuild --> AuditGate{Tier 5: Audit Telemetry & SIEM Monitoring}:::gate
AuditGate --> LogAudit[Audit_json.log & Falco Verify Zero Identity Anomalies]:::auditTier 1: Platform Remediation & Distribution Version Auditing#
The primary fix for CVE-2024-6385 is upgrading GitLab Community and Enterprise Editions to releases containing the patched Ci::CreatePipelineService logic:
- GitLab 17.1.2 or higher (for 17.1.x series)
- GitLab 17.0.3 or higher (for 17.0.x series)
- GitLab 16.11.5 or higher (for 16.11.x series)
Automated Bash Script: Auditing GitLab Instance Version
Deploy and execute this verification script on your GitLab server host or via administrative CI/CD jobs:
#!/usr/bin/env bash
# audit_gitlab_patch.sh - Audit GitLab version against CVE-2024-6385 and CVE-2024-5655
set -euo pipefail
echo "[*] Auditing local GitLab instance for CVE-2024-6385 remediation..."
# Extract version from Omnibus or GitLab environment
if command -v gitlab-rake >/dev/null 2>&1; then
GITLAB_VER=$(gitlab-rake gitlab:env:info 2>/dev/null | grep "Version:" | awk '{print $2}')
elif [ -f /opt/gitlab/version-manifest.txt ]; then
GITLAB_VER=$(head -n 1 /opt/gitlab/version-manifest.txt | awk '{print $2}')
else
echo "[!] Cannot determine GitLab version directly. Querying API..."
GITLAB_VER=$(curl -s "https://gitlab.corp.internal/api/v4/version" --header "PRIVATE-TOKEN: $ADMIN_TOKEN" | jq -r .version)
fi
echo "[*] Detected GitLab Version: ${GITLAB_VER}"
# Evaluate version against patch baselines
VULN=0
MAJOR=$(echo "$GITLAB_VER" | cut -d'.' -f1)
MINOR=$(echo "$GITLAB_VER" | cut -d'.' -f2)
PATCH=$(echo "$GITLAB_VER" | cut -d'.' -f3 | cut -d'-' -f1)
if [ "$MAJOR" -eq 17 ]; then
if [ "$MINOR" -eq 1 ] && [ "$PATCH" -lt 2 ]; then VULN=1; fi
if [ "$MINOR" -eq 0 ] && [ "$PATCH" -lt 3 ]; then VULN=1; fi
elif [ "$MAJOR" -eq 16 ]; then
if [ "$MINOR" -eq 11 ] && [ "$PATCH" -lt 5 ]; then VULN=1; fi
if [ "$MINOR" -lt 11 ]; then VULN=1; fi
elif [ "$MAJOR" -lt 16 ]; then
VULN=1
fi
if [ "$VULN" -eq 1 ]; then
echo -e "\033[0;31m[CRITICAL ALERT] GitLab instance (${GITLAB_VER}) is VULNERABLE to CVE-2024-6385!\033[0m"
echo -e "\033[0;31m[ACTION REQUIRED] Upgrade immediately to 17.1.2+, 17.0.3+, or 16.11.5+.\033[0m"
exit 2
else
echo -e "\033[0;32m[OK] GitLab instance meets or exceeds patched release baseline.\033[0m"
fi
Tier 2: Migrating Protected Variables to Dynamic OIDC Federation (HashiCorp Vault)#
Static protected CI/CD variables represent an acute single point of failure. Organizations must migrate production deployments to GitLab ID Tokens (JSON Web Token OIDC Federation) integrated with HashiCorp Vault, AWS STS, or GCP Workload Identity.
When using OIDC federation, no static cloud credentials or passwords exist inside GitLab project settings. Instead, each executing job dynamically requests a short-lived token from Vault, which verifies that the token's claims (iss, sub, ref_type) strictly match authorized branches.
Secure .gitlab-ci.yml Template: HashiCorp Vault OIDC Authentication
# Secure GitLab CI/CD Pipeline Configuration using Dynamic OIDC Secrets
stages:
- deploy
deploy_production:
stage: deploy
image: hashicorp/vault:latest
# Generate ephemeral, cryptographically signed OIDC ID Token
id_tokens:
VAULT_ID_TOKEN:
aud: https://vault.corp.internal:8200
variables:
VAULT_ADDR: https://vault.corp.internal:8200
VAULT_AUTH_ROLE: gitlab-production-deployer
before_script:
- echo "[*] Authenticating to HashiCorp Vault via GitLab OIDC JWT..."
# Log in to Vault using the job's dynamic ID token
- export VAULT_TOKEN=$(vault write -field=token auth/jwt/login role=$VAULT_AUTH_ROLE jwt=$VAULT_ID_TOKEN)
script:
- echo "[*] Retrieving short-lived AWS deployment credentials..."
- export AWS_CREDENTIALS=$(vault kv get -format=json secret/production/aws)
- export AWS_ACCESS_KEY_ID=$(echo "$AWS_CREDENTIALS" | jq -r .data.data.access_key)
- export AWS_SECRET_ACCESS_KEY=$(echo "$AWS_CREDENTIALS" | jq -r .data.data.secret_key)
# Execute deployment steps with temporary credentials (valid 15 minutes)
- aws sts get-caller-identity
- ./deploy_production.sh
rules:
# Strictly enforce that this job executes ONLY on the protected default branch
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_REF_PROTECTED == "true"'
tags:
- hardened-production-runner
Tier 3: GitLab Runner Hardening & Isolation#
GitLab Runners execute untrusted code committed by developers. If runners are poorly configured, a compromised pipeline immediately pivots into the internal network.
1. Deprecate Privileged Docker-in-Docker (DinD)
Do not run GitLab Runners in privileged mode (privileged = true). To build container images securely inside CI/CD pipelines without exposing the Docker daemon socket or running root containers, utilize rootless build tools such as Google Kaniko, Buildah, or Podman:
# Kaniko Container Build without Privileged Mode or Docker Socket
build_container:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.23.0-debug
entrypoint: [""]
script:
- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"
rules:
- if: '$CI_COMMIT_TAG'
2. Runner Configuration Hardening (/etc/gitlab-runner/config.toml)
Configure the runner daemon with strict limits, non-privileged execution, and volume restrictions:
[[runners]]
name = "hardened-linux-runner-01"
url = "https://gitlab.corp.internal"
token = "glrt-xxxxxxxxxxxxxxxxxxxx"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
tls_verify = false
image = "alpine:latest"
# STRICT SECURITY SETTINGS:
privileged = false
disable_entrypoint_overwrite = true
oom_kill_disable = false
disable_cache = false
# Prevent mounting of host docker socket or sensitive directories:
volumes = ["/cache"]
network_mode = "bridge"
Tier 4: Branch Protection & Merge Request Pipeline Policies#
To prevent untrusted merge requests from triggering pipelines with privileged access, enforce project-level pipeline policies in GitLab Settings:
- Enable "Pipelines must succeed": Require all verification checks to pass before merging.
- Prevent Fork Pipelines from Accessing Secrets: Navigate to Settings > CI/CD > General pipelines and disable "Public pipelines". Under Settings > CI/CD > Variables, ensure all production variables have the "Protected" and "Masked" flags enabled, and configure "Environment Scope" strictly to
production. - Require Approvals on External Merge Requests: Under Settings > CI/CD > Runners, set external contributor pipelines to require explicit approval from a Maintainer before jobs execute on shared runners.
Production Detection Queries: Hunting Identity Mismatches & Variable Leaks#
Blue teams must deploy continuous detection monitoring across GitLab Rails audit logs and runner host telemetry to detect unauthorized pipeline execution delegation and secret harvesting.
Production Sigma Detection Rule: Pipeline Trigger Author Mismatch#
The following production-ready Sigma rule monitors GitLab audit events (gitlab-rails/audit_json.log) to detect instances where a pipeline is created with a pipeline_user_id differing from the committer or branch creator:
title: Suspicious GitLab CI/CD Pipeline Execution User Delegation (CVE-2024-6385)
id: 3e7a1b9f-5c2d-4e8a-8f12-a9b0c7d3e5f2
status: production
description: |
Detects instances where a GitLab CI/CD pipeline is created with an execution user context (pipeline_user_id)
that differs from the author of the commit or the user invoking the pipeline API, indicative of
CVE-2024-6385 or CVE-2024-5655 exploitation attempting to access protected CI/CD variables.
references:
- https://about.gitlab.com/releases/2024/07/10/patch-release-gitlab-17-1-2-released/
- https://nvd.nist.gov/vuln/detail/CVE-2024-6385
- https://attack.mitre.org/techniques/T1548/
tags:
- attack.initial_access
- attack.t1190
- attack.privilege_escalation
- attack.t1548
- attack.credential_access
- attack.t1552.004
logsource:
service: gitlab-audit
product: gitlab
detection:
selection_event:
event_type: 'pipeline_created'
pipeline_status: 'created'
filter_bot_accounts:
pipeline_user_username|endswith:
- '-bot'
- '-service'
- 'gitlab-ci'
condition: selection_event and not filter_bot_accounts
falsepositives:
- Scheduled maintenance pipelines triggered automatically by project owners on repositories with external contributions.
level: high
Falco Runtime Rule: Hunting Malicious Reverse Shells on GitLab Runners#
Deploy the following Falco rule across your GitLab Runner hosts to detect job scripts spawning interactive reverse shells or querying cloud metadata endpoints:
- rule: Suspicious Reverse Shell Spawned in GitLab Runner Container
desc: Detects interactive shell execution with network redirection inside GitLab Runner containers
condition: >
container and container.image.repository contains "gitlab-runner" and
(evt.type = execve and proc.name in (bash, sh, zsh, dash)) and
(proc.cmdline contains "/dev/tcp/" or proc.cmdline contains "nc -e" or proc.cmdline contains "mkfifo")
output: >
Reverse Shell Attempt in GitLab Runner Job
(container_id=%container.id image=%container.image.repository cmdline=%proc.cmdline
user=%user.name parent=%proc.pname)
priority: CRITICAL
tags: [container, devsecops, cicd, privilege_escalation, mitre_t1059]
Enterprise Mitigation Matrix: Comparing Remediations for GitLab CI/CD#
The following matrix compares available defensive controls across security effectiveness, implementation complexity, operational risk, and enterprise trade-offs:
| Defensive Approach | Control Tier | Primary Mechanism | Implementation Complexity | Performance Impact | Operational Risk | Overall Effectiveness |
|---|---|---|---|---|---|---|
| GitLab Security Release Patch | Platform Application | Patches Ci::CreatePipelineService identity delegation logic |
Low (Standard Omnibus / Helm package update) | Zero (0%) | Low (Requires standard service restart window) | Definitive for Vuln |
| Migrate to OIDC ID Tokens (Vault) | Secrets Management | Ephemeral short-lived credentials; eliminates static variables | Medium (Requires Vault / Cloud IAM federation setup) | Zero (0%) | Low to Medium (Requires updating .gitlab-ci.yml files) |
Architectural (Next-Gen) |
| Deprecate Privileged DinD Runners | Runner Infrastructure | Replaces privileged Docker execution with Kaniko / rootless OCI | Medium (Updating build job images and runner configs) | Low (<5% image build time difference) | Low (Legacy Docker build arguments may need adjustment) | High (Stops Host Escapes) |
| Fork Pipeline Approval Policies | Governance / Policy | Enforces manual maintainer approval on external merge requests | Very Low (Project configuration toggle in web UI) | Low (Adds human latency for external PR runs) | Very Low (Protects runners from untrusted fork jobs) | High (Stops Unauth PRs) |
| Audit Log Mismatch Monitoring | Detection Telemetry | Detects discrepancies between pipeline author and committer | Low (SIEM / ELK ingestion of audit_json.log) |
Zero (0%) | Zero (Read-only monitoring) | High (Incident Triage) |
Incident Response & Verification Playbook: Blue Team Containment & Auditing#
When a SIEM alert or audit log discrepancy reveals potential exploitation of CVE-2024-6385, execute the following incident response workflow:
Incident Response Flowchart#
flowchart TD
classDef client fill:#1e293b,stroke:#ef4444,stroke-width:2px,color:#f8fafc
classDef gate fill:#0f172a,stroke:#3b82f6,stroke-width:2px,color:#93c5fd
classDef secure fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#6ee7b7
classDef audit fill:#4c1d95,stroke:#8b5cf6,stroke-width:2px,color:#ddd6fe
classDef drop fill:#450a0a,stroke:#dc2626,stroke-width:2px,color:#fca5a5
Alert[SIEM Alert: Pipeline Author Mismatch / Rogue Runner Process]:::client --> Triage{Phase 1: Alert Triage & Scope Analysis}:::gate
Triage -- Scheduled Pipeline Run by Project Owner --> ValidateBenign[Verify Pipeline Trigger Schedule & Close Ticket]:::secure
Triage -- Unprivileged User Triggering Maintainer Pipeline --> Incident[Confirmed CVE-2024-6385 Exploitation]:::drop
Incident --> Containment{Phase 2: Immediate Containment}:::gate
Containment --> CancelPipeline[Cancel Active Running Pipeline via GitLab API / Web UI]:::drop
Containment --> PauseRunner[Pause Compromised GitLab Runner to Prevent Job Processing]:::drop
Containment --> RevokeProjectTokens[Rotate All Protected CI/CD Variables & Deployment Keys]:::drop
Containment --> Forensics{Phase 3: Digital Forensics & Telemetry Collection}:::gate
Forensics --> InspectGitlabLogs[Extract gitlab-rails/audit_json.log and api_json.log]:::audit
Forensics --> AuditCIYAML[Inspect .gitlab-ci.yml Committed to Exploited Branch]:::audit
Forensics --> CheckRunnerHost[Examine Runner Host for Dropped Binaries & Outbound Sockets]:::audit
Forensics --> Remediation{Phase 4: Eradication & Hardening}:::gate
Remediation --> PatchGitlab[Upgrade GitLab Instance to Version 17.1.2+ Immediately]:::secure
Remediation --> PurgeStaticSecrets[Migrate Compromised Secrets to HashiCorp Vault OIDC]:::secure
Remediation --> RebuildRunner[Re-image Runner Nodes from Clean Gold Master Images]:::secureStep-by-Step Response Checklist#
Phase 1: Vulnerability Scoping & Version Auditing
- Execute
audit_gitlab_patch.shto determine whether the GitLab instance is running an affected version (< 17.1.2, 17.0.3, or 16.11.5). - Query GitLab PostgreSQL or audit logs for all pipelines triggered via merge requests or external API calls over the past 30 days.
- Cross-reference pipeline execution authors (
pipeline.user_id) against the author of the triggering Git commit (commit.author_id). Flag any mismatch where an unprivileged user triggered a job executed byrootor a project Maintainer.
Phase 2: Pipeline Log Forensics & User Identity Mismatch Triage
- Inspect the raw
.gitlab-ci.ymlcommitted to the branch associated with the suspicious pipeline. Look for base64-encoded strings, externalcurl/wgetdownloaders, or reverse shell patterns (/dev/tcp/). - Review the execution logs of the flagged pipeline jobs to identify whether
env,printenv, or exfiltration commands were executed. - Audit all project-level and group-level CI/CD variables configured in the repository. Identify every secret that was exposed to the job environment.
Phase 3: Credential Invalidation & Runner Sanitization
- Immediately rotate all AWS IAM access keys, Kubernetes cluster credentials, Vault tokens, and database passwords that were stored as protected variables in the affected project.
- Revoke and re-generate all GitLab Deploy Tokens and Deploy Keys associated with the compromised repository.
- Terminate the active runner container and reboot the runner virtual machine. If the runner was configured with
privileged = true, consider the host operating system compromised and re-image the node from a clean base image. - Apply the latest GitLab security release and migrate static secrets to dynamic OIDC JWT identity tokens before re-enabling runner queues.
Executive Takeaway Table: Threat Vectors, Detection Signals, and Primary Mitigations#
The following executive summary consolidates the core attack vectors, defensive telemetry signals, and recommended engineering remediations for GitLab CVE-2024-6385:
| Attack Vector / Technique | Primary Exploitation Mechanism | Telemetry & Detection Signal | Recommended Mitigation | Verification Command |
|---|---|---|---|---|
| Pipeline User Delegation (T1548) | Ci::CreatePipelineService runs unprivileged job under maintainer context |
GitLab audit log: pipeline_user_id does not match invoking API caller |
Upgrade GitLab to version 17.1.2+, 17.0.3+, or 16.11.5+ |
Run audit_gitlab_patch.sh |
| Protected Variable Theft (T1552) | Delegated job accesses masked and protected production CI/CD secrets | GitLab Runner: High-volume environment variable dumping or external POST | Migrate from static variables to dynamic HashiCorp Vault OIDC ID Tokens | Audit project CI/CD variables via GitLab API |
| Privileged Runner Breakout (T1059) | Privileged Docker-in-Docker container accesses host Docker socket | Falco / EDR: Container process mounting host filesystem or spawning shell | Deprecate privileged = true; migrate to rootless Kaniko or Buildah |
grep -E 'privileged.*true' /etc/gitlab-runner/config.toml |
| Rogue Merge Request Pipelines | External contributor fork triggers pipeline execution on protected runners | GitLab API: Pipeline spawned from untrusted fork on protected branch | Enforce "Require approval for fork merge requests" in CI/CD settings | Review GitLab project CI/CD settings in web UI |
| Supply Chain Artifact Poisoning | Stolen deploy token used to overwrite production container images | Container registry: Image tag pushed outside standard release window | Enforce cryptographic container image signing via Sigstore / Cosign | cosign verify <image-ref> before deployment |
Authoritative References & Standards#
- GitLab Security Release: Critical Security Release: GitLab 17.1.2, 17.0.3, and 16.11.5 — GitLab Security Advisory
- National Vulnerability Database (NIST): CVE-2024-6385 Detail (CVSS 9.6 Critical - CWE-284) — NIST NVD
- Cybersecurity and Infrastructure Security Agency (CISA): Known Exploited Vulnerabilities Catalog (KEV) - GitLab Pipeline Execution Flaws — CISA KEV Entry
- MITRE ATT&CK Framework: Technique T1190: Exploit Public-Facing Application & T1548: Abuse Elevation Control Mechanism — MITRE ATT&CK
Comments
Post a Comment