{"id":111,"date":"2026-05-26T19:47:55","date_gmt":"2026-05-26T19:47:55","guid":{"rendered":"https:\/\/nomadsec.io\/blog\/?p=111"},"modified":"2026-05-26T19:47:56","modified_gmt":"2026-05-26T19:47:56","slug":"megalodon-github-actions-supply-chain","status":"publish","type":"post","link":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/","title":{"rendered":"Megalodon and the CI\/CD trust problem"},"content":{"rendered":"<p>On May 18, 2026, between roughly 11:36 and 17:48 UTC, an automated campaign that SafeDep has named Megalodon pushed malicious GitHub Actions workflows into more than 5,500 repositories. The attackers did not exploit a vulnerability in GitHub. They did not need a zero-day in Node, Python, or any package manager. They used valid credentials (compromised PATs and deploy keys, per SafeDep) and a forged author identity that looked like a CI bot, and they pushed workflow files that read like routine pipeline maintenance.<\/p>\n<p>Six hours. 5,718 commits. 5,561 distinct repositories. The payload only does its work after the commit lands and a workflow runs inside a CI runner, which means the credential theft happens with the full trust envelope of your pipeline: cloud OIDC tokens, GITHUB_TOKEN, organization secrets, runner environment variables, and whatever else your build process touches.<\/p>\n<p>This is not a malware story. It is a change-management story wearing a malware costume.<\/p>\n<h2>What is confirmed vs what we recommend<\/h2>\n<p>Threat intel is more useful when the source layer is explicit. Here is what we are treating as load-bearing fact, and what we are flagging as defender judgment.<\/p>\n<p><strong>Confirmed (SafeDep research, reported by The Hacker News, May 22, 2026):<\/strong><\/p>\n<ul>\n<li>Campaign tracked as Megalodon by SafeDep.<\/li>\n<li>5,718 malicious commits across 5,561 distinct repositories.<\/li>\n<li>Activity window approximately 11:36 to 17:48 UTC on May 18, 2026.<\/li>\n<li>Mechanism: injected files under <code>.github\/workflows\/<\/code> containing base64-encoded bash payloads.<\/li>\n<li>Command and control endpoint reported as <code>216.126.225.129:8443<\/code>.<\/li>\n<li>Throwaway GitHub accounts with random 8-character usernames; forged git author identities including <code>build-bot<\/code>, <code>auto-ci<\/code>, <code>ci-bot<\/code>, and <code>pipeline-bot<\/code>.<\/li>\n<li>Commit messages mimicked routine CI maintenance, with seven message variants observed.<\/li>\n<li>Push vector assessed as compromised personal access tokens or deploy keys.<\/li>\n<li>Two payload variants: SysDiag (triggers on push and pull_request) and Optimize-Build (workflow_dispatch only; example observed in @tiledesk\/tiledesk-server).<\/li>\n<li>Harvest scope per SafeDep includes CI env vars, <code>\/proc<\/code> environ, AWS IMDSv2, GCP and Azure instance metadata, SSH keys, Docker and Kubernetes configs, Vault, Terraform state, shell history, GITHUB_TOKEN, GitHub Actions OIDC, GitLab and Bitbucket tokens, <code>.env<\/code>, <code>credentials.json<\/code>, <code>service-account.json<\/code>, and roughly 30 secret regex classes.<\/li>\n<\/ul>\n<p><strong>Reported context (treat as adjacent, not single-actor):<\/strong><\/p>\n<ul>\n<li>OX Security commentary in The Hacker News piece framing developer tooling as a rising target.<\/li>\n<li>npm credential resets and 2FA bypass remediation (reported by Socket) in the same window.<\/li>\n<li>TeamPCP activity, including the GitHub internal repository disclosure and VS Code extension exfiltration, in the same May 2026 timeframe.<\/li>\n<\/ul>\n<p>These three threads are not the same operator unless an IR vendor names them as such. They are the same era. Megalodon is SafeDep&#8217;s naming for the GitHub Actions campaign; TeamPCP is separate tracked activity. The shared pattern is the part defenders should internalize: developer trust surfaces (IDE extensions, package registries, CI pipelines) are being attacked as a class, not as isolated incidents.<\/p>\n<p><strong>Inference (our recommendations, not SafeDep claims):<\/strong> the organizational failures that let a workflow-file commit reach a default branch without a human looking at it. Change management, code review on pipeline paths, branch protection, and bot-identity skepticism. We will be explicit about which sections below are defender guidance.<\/p>\n<h2>What Megalodon actually did<\/h2>\n<p>The attack chain is uncomplicated, which is what makes it instructive.<\/p>\n<p>An attacker, using a credential they already had (PAT or deploy key), pushed a commit to a repository under a freshly minted GitHub account with a random username. The commit author was set to a name like <code>ci-bot<\/code> or <code>build-bot<\/code>. The commit message was something that would not raise an eyebrow in a notification email, the SafeDep reporting describes seven variants of pipeline-maintenance phrasing. The commit added or modified a file under <code>.github\/workflows\/<\/code>.<\/p>\n<p>That workflow contained a step that decoded a base64 blob and piped it to bash. The decoded bash then ran the harvest: walk environment variables, query cloud instance metadata services, read common credential files, scrape Terraform and Vault and Kubernetes config locations, request the OIDC token, exfiltrate to <code>216.126.225.129:8443<\/code>.<\/p>\n<p>The two variants differ in trigger:<\/p>\n<ul>\n<li><strong>SysDiag<\/strong> registers on <code>push<\/code> and <code>pull_request<\/code>, which gives the attacker mass reach. Any subsequent activity on the repo runs the payload.<\/li>\n<li><strong>Optimize-Build<\/strong> registers on <code>workflow_dispatch<\/code> only. This is quieter. The workflow sits dormant until someone (the attacker, with the same credential, or a maintainer who notices a new workflow and clicks Run to see what it does) triggers it manually. The @tiledesk\/tiledesk-server case in SafeDep&#8217;s reporting is this pattern.<\/li>\n<\/ul>\n<p>Note what the payload does not do: it does not run at <code>npm install<\/code>. It does not require a downstream consumer to fetch a poisoned package. It runs inside the CI runner of the repository that received the commit, against the secrets and tokens available to that runner. The blast radius is whatever the runner can reach. For most organizations, that is more than the application code.<\/p>\n<blockquote>\n<p>Dependency scanning is necessary and insufficient. Megalodon is a reminder that <code>.github\/workflows\/<\/code> is application code with production credentials attached, and most review processes treat it like configuration.<\/p>\n<\/blockquote>\n<h2>Why implicit trust in CI\/CD makes this work<\/h2>\n<p>A modern GitHub Actions runner is, in security terms, a Tier-0 asset. Think about what it routinely holds:<\/p>\n<ul>\n<li>A <code>GITHUB_TOKEN<\/code> scoped (by default, in many orgs) more broadly than the workflow strictly needs.<\/li>\n<li>An OIDC token that can assume IAM roles in AWS, GCP, or Azure without a long-lived secret in the repo.<\/li>\n<li>Repository and organization secrets injected as environment variables.<\/li>\n<li>Deploy keys, registry credentials (Docker Hub, GHCR, ECR), and signing keys.<\/li>\n<li>Whatever the build process pulls down (Terraform state, kubeconfig, Vault tokens).<\/li>\n<\/ul>\n<p>If a workflow file you did not write runs on that runner, all of the above is reachable. The attacker does not need persistence; one execution is enough to drain credentials and pivot.<\/p>\n<p>The mental model most teams operate under is that CI\/CD is plumbing. Pipelines are configured once, owned by platform engineering, and rarely reviewed line by line. New workflows get added during refactors, feature flags, release automation changes. Reviewers skim them. The same reviewer who would block a suspicious change to <code>auth.py<\/code> will approve a 40-line YAML file because it is, well, just CI.<\/p>\n<p>Megalodon is what that gap looks like at scale.<\/p>\n<h2>The change-management and source-approval gap<\/h2>\n<p>This section is defender judgment, not SafeDep&#8217;s claim. The campaign exploited credential compromise to get a commit pushed. The reason a commit was sufficient (rather than just a step on the path) is that nothing else caught it.<\/p>\n<p>The specific gaps that turn a push into a successful workflow execution:<\/p>\n<ul>\n<li><strong>No required review on workflow paths.<\/strong> Most branch protection rules require review on default branch, but do not require a different (or any) reviewer for <code>.github\/workflows\/**<\/code>.<\/li>\n<li><strong>Forged bot identities exploit pattern recognition.<\/strong> Reviewers see an author named <code>ci-bot<\/code> and assume the commit came from a known automation account. Git author fields are user-controlled metadata; they are not authentication.<\/li>\n<li><strong>Auto-merge configured on labeled PRs.<\/strong> A bot that can push and label can merge itself, in many orgs.<\/li>\n<li><strong>PAT and deploy key reuse across repositories.<\/strong> One stolen token grants write access to dozens of repos.<\/li>\n<li><strong>No separation between push rights and pipeline-modification rights.<\/strong> If you can push code, you can add an exfiltration workflow. CODEOWNERS for <code>.github\/workflows\/<\/code> is not on by default and most orgs do not turn it on.<\/li>\n<\/ul>\n<p>Walk that list against your own org. The honest answer for most teams is that at least three of those apply.<\/p>\n<h2>Detection engineering<\/h2>\n<p>For detection engineers and SOC managers, the IOCs from the SafeDep reporting give you a starting hunt. The behavioral indicators are more durable.<\/p>\n<p><strong>Indicators of compromise (from SafeDep, May 2026):<\/strong><\/p>\n<ul>\n<li>C2: <code>216.126.225.129:8443<\/code><\/li>\n<li>Forged author names: <code>build-bot<\/code>, <code>auto-ci<\/code>, <code>ci-bot<\/code>, <code>pipeline-bot<\/code><\/li>\n<li>New workflow files containing base64-decoded bash in run steps<\/li>\n<li>SysDiag and Optimize-Build workflow names (treat as soft indicators; trivially renamed)<\/li>\n<\/ul>\n<p><strong>Hunts that survive an IOC rotation:<\/strong><\/p>\n<ol>\n<li>New or modified files under <code>.github\/workflows\/<\/code> authored by accounts created in the last 30 days. GitHub&#8217;s audit log surface plus repo commit metadata is enough.<\/li>\n<li>Workflow run steps where the command contains <code>base64 -d<\/code>, <code>base64 --decode<\/code>, or piped decode into bash, sh, or python. This is rare in legitimate workflows.<\/li>\n<li>Egress from runners to IP addresses not on an allowlist of registries, package mirrors, and known internal hosts. If you do not constrain runner egress, this hunt is hard; that is itself a finding.<\/li>\n<li>Sudden additions of <code>workflow_dispatch<\/code> triggers, especially in repositories that historically only ran on push or PR.<\/li>\n<li>GitHub organization audit log: <code>org.add_member<\/code> events for accounts under 90 days old, particularly with random-looking usernames, followed within hours by pushes from those accounts.<\/li>\n<li>PAT and deploy key usage from IP geographies or ASNs inconsistent with your developer population.<\/li>\n<li>Commits where the GitHub account identity and the git author identity diverge significantly (account <code>x7k2qmpz<\/code>, author <code>ci-bot<\/code>).<\/li>\n<\/ol>\n<p>If you run a SIEM with GitHub audit log ingestion, the last three are queries you can write today. If you do not, the first project for next quarter is getting that log source in.<\/p>\n<h2>What we&#8217;d do this week<\/h2>\n<p>Defender recommendations, in priority order. None of these require new tooling for most orgs; they require configuration and a meeting.<\/p>\n<ol>\n<li><strong>Add CODEOWNERS for <code>.github\/workflows\/**<\/code><\/strong> and require review from a security or platform engineering reviewer for any change to that path. Make workflow modifications a different approval surface than application code.<\/li>\n<li><strong>Set <code>GITHUB_TOKEN<\/code> default permissions to <code>read<\/code><\/strong> at the organization level. Workflows that need write must opt in per-job. This is one toggle in org settings and it removes most of the post-merge blast radius.<\/li>\n<li><strong>Inventory and rotate PATs and deploy keys<\/strong> with any chance of exposure during the May 2026 window. Scope new tokens to specific repositories, not org-wide. Set expirations.<\/li>\n<li><strong>Narrow OIDC cloud trust policies.<\/strong> The IAM role your CI assumes should be scoped to specific repositories and specific branches via the <code>sub<\/code> claim. If your role trusts <code>repo:org\/*<\/code>, fix that this week.<\/li>\n<li><strong>Branch protection on default branch:<\/strong> required reviews, no direct push, no force-push, no bypass for admins unless logged and reviewed.<\/li>\n<li><strong>Alert on new external collaborators<\/strong> and on first-time pushes from accounts younger than 90 days. Both are cheap signals.<\/li>\n<li><strong>Tabletop the merge-approval failure.<\/strong> Walk through: what happens if a commit authored by <code>ci-bot<\/code> modifies a workflow file and an auto-merge bot approves it on green CI. Who catches it, when, and how. If the answer is nobody, that is the next thing to fix.<\/li>\n<\/ol>\n<p>This is general guidance, not legal or audit advice. Talk to your auditor about how workflow review maps to your SOC 2, ISO 27001, or PCI change-management controls; in most frameworks, pipeline files fall under change management whether your current process treats them that way or not.<\/p>\n<p>Megalodon is not the last campaign that will treat CI\/CD as the soft middle of the supply chain. The pipeline is application code. Review it that way.<\/p>\n<p>Primary sources: The Hacker News, <a href=\"https:\/\/thehackernews.com\/2026\/05\/megalodon-github-attack-targets-5561.html\">Megalodon GitHub Attack Targets 5,561 Repos with Malicious CI\/CD Workflows<\/a> (May 22, 2026), citing SafeDep research.<\/p>\n<p><a href=\"https:\/\/nomadsec.io\/threat-research\">Nomad Security<\/a> publishes practitioner threat analysis and helps teams assess developer-trust and pipeline risk through threat research and scoped security assessments.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>5,561 repos got malicious GitHub Actions workflows in six hours. No zero-day, just a merge. Detection and change-control guidance for defenders.<\/p>\n","protected":false},"author":1,"featured_media":112,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","footnotes":""},"categories":[57],"tags":[62,49,61,59,58],"class_list":["post-111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-threat-intel","tag-cicd","tag-detection-engineering","tag-github-actions","tag-supply-chain","tag-threatintel"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Megalodon and the CI\/CD trust problem - The Horizon Dispatch<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Megalodon and the CI\/CD trust problem - The Horizon Dispatch\" \/>\n<meta property=\"og:description\" content=\"5,561 repos got malicious GitHub Actions workflows in six hours. No zero-day, just a merge. Detection and change-control guidance for defenders.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/\" \/>\n<meta property=\"og:site_name\" content=\"The Horizon Dispatch\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-26T19:47:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-26T19:47:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1338\" \/>\n\t<meta property=\"og:image:height\" content=\"753\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"nomadsec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nomadsec_io\" \/>\n<meta name=\"twitter:site\" content=\"@nomadsec_io\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"nomadsec\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/\"},\"author\":{\"name\":\"nomadsec\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#\\\/schema\\\/person\\\/3de6ea5b8ec6b473ca61974c11db0bfd\"},\"headline\":\"Megalodon and the CI\\\/CD trust problem\",\"datePublished\":\"2026-05-26T19:47:55+00:00\",\"dateModified\":\"2026-05-26T19:47:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/\"},\"wordCount\":1770,\"publisher\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/megalodon-headline.png\",\"keywords\":[\"cicd\",\"detection-engineering\",\"github-actions\",\"supply chain\",\"threatintel\"],\"articleSection\":[\"Threat Intel\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/\",\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/\",\"name\":\"Megalodon and the CI\\\/CD trust problem - The Horizon Dispatch\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/megalodon-headline.png\",\"datePublished\":\"2026-05-26T19:47:55+00:00\",\"dateModified\":\"2026-05-26T19:47:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/megalodon-headline.png\",\"contentUrl\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/megalodon-headline.png\",\"width\":1338,\"height\":753},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/2026\\\/05\\\/26\\\/megalodon-github-actions-supply-chain\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Megalodon and the CI\\\/CD trust problem\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/\",\"name\":\"The Horizon Dispatch\",\"description\":\"Field reports from working operators.\",\"publisher\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#organization\"},\"alternateName\":\"Nomad Security\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#organization\",\"name\":\"The Horizon Dispatch\",\"alternateName\":\"Nomad Security\",\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/cropped-logo-trans.png\",\"contentUrl\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/cropped-logo-trans.png\",\"width\":190,\"height\":190,\"caption\":\"The Horizon Dispatch\"},\"image\":{\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/nomadsec_io\",\"https:\\\/\\\/bsky.app\\\/profile\\\/nomadsec.io\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nomadsec\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/#\\\/schema\\\/person\\\/3de6ea5b8ec6b473ca61974c11db0bfd\",\"name\":\"nomadsec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g\",\"caption\":\"nomadsec\"},\"sameAs\":[\"https:\\\/\\\/nomadsec.io\\\/blog\"],\"url\":\"https:\\\/\\\/nomadsec.io\\\/blog\\\/author\\\/nomadsec\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Megalodon and the CI\/CD trust problem - The Horizon Dispatch","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/","og_locale":"en_US","og_type":"article","og_title":"Megalodon and the CI\/CD trust problem - The Horizon Dispatch","og_description":"5,561 repos got malicious GitHub Actions workflows in six hours. No zero-day, just a merge. Detection and change-control guidance for defenders.","og_url":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/","og_site_name":"The Horizon Dispatch","article_published_time":"2026-05-26T19:47:55+00:00","article_modified_time":"2026-05-26T19:47:56+00:00","og_image":[{"width":1338,"height":753,"url":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png","type":"image\/png"}],"author":"nomadsec","twitter_card":"summary_large_image","twitter_creator":"@nomadsec_io","twitter_site":"@nomadsec_io","twitter_misc":{"Written by":"nomadsec","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#article","isPartOf":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/"},"author":{"name":"nomadsec","@id":"https:\/\/nomadsec.io\/blog\/#\/schema\/person\/3de6ea5b8ec6b473ca61974c11db0bfd"},"headline":"Megalodon and the CI\/CD trust problem","datePublished":"2026-05-26T19:47:55+00:00","dateModified":"2026-05-26T19:47:56+00:00","mainEntityOfPage":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/"},"wordCount":1770,"publisher":{"@id":"https:\/\/nomadsec.io\/blog\/#organization"},"image":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#primaryimage"},"thumbnailUrl":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png","keywords":["cicd","detection-engineering","github-actions","supply chain","threatintel"],"articleSection":["Threat Intel"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/","url":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/","name":"Megalodon and the CI\/CD trust problem - The Horizon Dispatch","isPartOf":{"@id":"https:\/\/nomadsec.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#primaryimage"},"image":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#primaryimage"},"thumbnailUrl":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png","datePublished":"2026-05-26T19:47:55+00:00","dateModified":"2026-05-26T19:47:56+00:00","breadcrumb":{"@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#primaryimage","url":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png","contentUrl":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/05\/megalodon-headline.png","width":1338,"height":753},{"@type":"BreadcrumbList","@id":"https:\/\/nomadsec.io\/blog\/2026\/05\/26\/megalodon-github-actions-supply-chain\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nomadsec.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Megalodon and the CI\/CD trust problem"}]},{"@type":"WebSite","@id":"https:\/\/nomadsec.io\/blog\/#website","url":"https:\/\/nomadsec.io\/blog\/","name":"The Horizon Dispatch","description":"Field reports from working operators.","publisher":{"@id":"https:\/\/nomadsec.io\/blog\/#organization"},"alternateName":"Nomad Security","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nomadsec.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nomadsec.io\/blog\/#organization","name":"The Horizon Dispatch","alternateName":"Nomad Security","url":"https:\/\/nomadsec.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nomadsec.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/01\/cropped-logo-trans.png","contentUrl":"https:\/\/nomadsec.io\/blog\/wp-content\/uploads\/2026\/01\/cropped-logo-trans.png","width":190,"height":190,"caption":"The Horizon Dispatch"},"image":{"@id":"https:\/\/nomadsec.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/nomadsec_io","https:\/\/bsky.app\/profile\/nomadsec.io","https:\/\/www.linkedin.com\/company\/nomadsec"]},{"@type":"Person","@id":"https:\/\/nomadsec.io\/blog\/#\/schema\/person\/3de6ea5b8ec6b473ca61974c11db0bfd","name":"nomadsec","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/088d58a10bd97ee28c988477af74b81f3c02dbd8cc6bee2782717b907a5b6ff6?s=96&d=mm&r=g","caption":"nomadsec"},"sameAs":["https:\/\/nomadsec.io\/blog"],"url":"https:\/\/nomadsec.io\/blog\/author\/nomadsec\/"}]}},"_links":{"self":[{"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/posts\/111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/comments?post=111"}],"version-history":[{"count":1,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/posts\/111\/revisions"}],"predecessor-version":[{"id":113,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/posts\/111\/revisions\/113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/media?parent=111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/categories?post=111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nomadsec.io\/blog\/wp-json\/wp\/v2\/tags?post=111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}