{"id":22331,"date":"2026-07-17T10:22:42","date_gmt":"2026-07-17T10:22:42","guid":{"rendered":"https:\/\/www.securitytoday.de\/2026\/07\/17\/cicd-published-asyncapi-botnet-loader\/"},"modified":"2026-09-29T08:38:53","modified_gmt":"2026-09-29T08:38:53","slug":"cicd-published-asyncapi-botnet-loader","status":"publish","type":"post","link":"https:\/\/www.securitytoday.de\/en\/2026\/07\/17\/cicd-published-asyncapi-botnet-loader\/","title":{"rendered":"CI\/CD Published AsyncAPI Botnet Loader"},"content":{"rendered":"<p style=\"color:#69d8ed;font-size:0.9em;margin:0 0 16px;padding:0;\">6 Min. Reading time<\/p>\n<p><strong>Four AsyncAPI npm packages ran on July 14, 2026 with valid OIDC provenance and still delivered a multi-stage botnet loader. The entry point was in the CI: a misconfigured pull_request_target workflow, followed by a push to the release branch via bot\u2011controlled credentials. npm Trusted Publishing remained technically sound and did not cover the upstream trust breach.<\/strong><\/p>\n<div style=\"background:#003340;color:#fff;padding:32px 36px;margin:32px 0;border-radius:8px;\">\n<p style=\"margin:0 0 18px 0;font-size:0.95em;font-weight:800;text-transform:uppercase;letter-spacing:0.2em;color:#69d8ed;border-bottom:2px solid rgba(105,216,237,0.25);padding-bottom:12px;\">Key Takeaways<\/p>\n<ul style=\"margin:0;padding-left:22px;color:rgba(255,255,255,0.92);line-height:1.6;\">\n<li style=\"margin-bottom:12px;\"><strong style=\"color:#69d8ed;\">The entry point was in the CI misconfig, long before the registry token.<\/strong> pull_request_target with checkout of the untrusted head, broad GITHUB_TOKEN and subsequent bot push: secret exfiltration and branch compromise go hand in hand.<\/li>\n<li style=\"margin-bottom:12px;\"><strong style=\"color:#69d8ed;\">Payload at require(), the active runtime was slimmer than the bundle.<\/strong> ShellExec, persistence and C2 ran. Harvesting, propagation and evasion were in the package, toggleable in this release.<\/li>\n<li><strong style=\"color:#69d8ed;\">Lockfiles from the 07:10-11:18 UTC window remain risky.<\/strong> npm unpublishes the versions; existing pins and CI caches not.<\/li>\n<\/ul>\n<\/div>\n<p style=\"font-size:0.88em;color:#666;margin:20px 0 32px 0;border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5;padding:10px 0;\"><span style=\"color:#004a59;font-weight:700;text-transform:uppercase;font-size:0.72em;letter-spacing:0.14em;margin-right:14px;\">Related:<\/span><a href=\"https:\/\/www.securitytoday.de\/en\/2026\/07\/11\/an-npm-package-that-stole-the-private-keys\/\" style=\"color:#333;text-decoration:underline;\">An npm package that stole private keys<\/a>&nbsp;&nbsp;<span style=\"color:#ccc;\">\/<\/span>&nbsp;&nbsp;<a href=\"https:\/\/www.securitytoday.de\/en\/2026\/06\/26\/mini-shai-hulud-npm-worm-devours-the-supply-chain\/\" style=\"color:#333;text-decoration:underline;\">Mini Shai-Hulud: npm Supply-Chain Worm and Defense<\/a><\/p>\n<h2 style=\"margin-top:48px;margin-bottom:18px;\">What exactly happened<\/h2>\n<p>On July 14, 2026 at 06:58 UTC, a commit landed in the asyncapi\/generator repository on the branch next under the placeholder identity \u201cYour Name\u201d \/ you@example.com. Twelve minutes later, the legitimate workflow release-with-changesets.yml published three packages with valid npm-OIDC provenance: @asyncapi\/generator@3.3.1, @asyncapi\/generator-helpers@1.1.1 and @asyncapi\/generator-components@0.7.1.<\/p>\n<p>According to the Microsoft Security Blog, the initial access previously occurred via PR #2155 against the workflow manual-netlify-preview.yml. The workflow used pull_request_target and checked out the untrusted head commit. The GITHUB_TOKEN was broadly privileged; checkout credentials remained in the local Git config until the post-job cleanup. Subsequently, it was pushed using the asyncapi-bot account. Microsoft cautiously suggests that exactly this credential may have been compromised. While the pwn-request entry point and the subsequent bot-push chain are documented and explain the move into the release branch, they do not definitively prove that this specific credential was stolen.<\/p>\n<p>Important for context: there was no stolen npm publish token. The publish path ran through OIDC trusted publishing. The trust breach occurred earlier, in the CI and push rights on the branch that triggers the release workflow.<\/p>\n<div data-element=\"key_number\" style=\"background:#003340;border:1px solid rgba(105,216,237,0.28);border-radius:10px;padding:28px 24px;margin:32px 0;text-align:center;\">\n<div style=\"font-size:2.6em;font-weight:800;color:#69d8ed;line-height:1.05;word-break:keep-all;\">~4 h<\/div>\n<p style=\"margin:10px 0 0;font-size:0.92em;color:#e6e3da;\">Exposure window until unpublishing of Generator packages<\/p>\n<p style=\"margin:6px 0 0;font-size:0.78em;color:#8fa3ab;\">Source: StepSecurity-Timeline, July 14, 2026 UTC<\/p>\n<\/div>\n<h2 style=\"margin-top:48px;margin-bottom:18px;\">Why &#8220;Valid Provenance&#8221; Falls Short Here<\/h2>\n<p>npm Trusted Publishing, using OIDC and SLSA attestations, answers a sharp question: Was this artifact generated by the authorized GitHub workflow of this repository? The attestation for the generator packages displayed precisely repo:asyncapi\/generator:ref:refs\/heads\/next, the workflow file, commit SHA and run URL.<\/p>\n<p>What they do not address: Was the commit that triggered the workflow legitimate and clean? Provenance does not guard against compromised push credentials nor against CI jobs that execute untrusted code with privileged tokens. Anyone who combines pull_request_target with checkout of the PR head, retains secrets in such jobs and keeps branch protection lax on release branches, opens precisely this chain.<\/p>\n<p>For CISOs and AppSec this is the central lever: Registry signatures and provenance flags alone deem the AsyncAPI case &#8220;green&#8221;, even though the CI had already shipped the dropper. Controls must verify the source\u2011of\u2011truth and workflow permissions.<\/p>\n<h2 style=\"margin-top:48px;margin-bottom:18px;\">Payload Mechanics Without Install Hook<\/h2>\n<p>In none of the affected package.json files was there a preinstall\/postinstall script. The dropper started as soon as the poisoned module code was loaded via require(), i.e., during the normal generator run or in CI jobs building AsyncAPI templates.<\/p>\n<p>Stage 1 spawns a dedicated Node process. Stage 2 fetches a sync.js from an IPFS gateway, stored under OS\u2011specific paths that appear as a benign NodeJS runtime (e.g., ~\/.local\/share\/NodeJS\/sync.js on Linux). Stage 3 decrypts a bundled Miasma\u2011v3 implant. In the delivered configuration, Remote\u2011Shell (ShellExec), Persistence and C2 Beaconing ran over multiple channels (HTTP, Nostr, IPFS, BitTorrent\u2011DHT, Ethereum\u2011Dead\u2011Drop).<\/p>\n<p>Static analyses by Aikido and Socket also reveal modules in the bundle that were disabled via toggle in this release: recon: false (Credential harvesting does not start), metamorphic: false (Mutation, evasion and AI\u2011tool poisoning disabled) as well as propagate for npm\/pypi\/ruby\/cargo consistently false (no lateral package propagation). The store was in the artifact. The runtime of this wave was a remote shell with persistence and C2. Host forensics remains mandatory because shell access and persistence were active.<\/p>\n<div style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;margin:16px 0 32px 0;\">\n<table style=\"width:100%;min-width:560px;border-collapse:collapse;font-size:0.95em;\">\n<thead>\n<tr style=\"background:#003340;color:#fff;\">\n<th style=\"padding:12px 16px;text-align:left;border:1px solid #003340;\">Package<\/th>\n<th style=\"padding:12px 16px;text-align:left;border:1px solid #003340;\">Malicious Version<\/th>\n<th style=\"padding:12px 16px;text-align:left;border:1px solid #003340;\">Safe Version<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\"><strong>@asyncapi\/generator<\/strong><\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\">3.3.1<\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;color:#003340;font-weight:600;\">3.3.0<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\"><strong>@asyncapi\/generator-helpers<\/strong><\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\">1.1.1<\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;color:#003340;font-weight:600;\">1.1.0<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\"><strong>@asyncapi\/generator-components<\/strong><\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\">0.7.1<\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;color:#003340;font-weight:600;\">0.7.0 \/ 1.0.0<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\"><strong>@asyncapi\/specs<\/strong><\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;\">6.11.2 \/ 6.11.2-alpha.1<\/td>\n<td style=\"padding:12px 16px;border:1px solid #ddd;color:#003340;font-weight:600;\">6.11.1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"font-size:0.8em;color:#888;margin:8px 0 0;\">Source: StepSecurity Affected-Packages-Table, as of 14.07.2026<\/p>\n<\/div>\n<h2 style=\"margin-top:48px;margin-bottom:18px;\">What Security Teams Should Check Now<\/h2>\n<p>First, perform a facts check in your own inventory: lockfiles and CI caches from the UTC window of 14. July. Whoever pulls @asyncapi\/specs only transitively via the parser often does not see the version in the direct dependency tree. Overrides and SBOM scans are mandatory here.<\/p>\n<p>Second, host forensics: drop paths under the misleading &#8216;NodeJS&#8217; name, detached Node processes, outbound connections to IPFS gateways and unusual HTTP C2 targets. Third, credential rotation on affected runners and laptops. ShellExec can reach environment secrets and local tokens, even if the bundled harvesting module is out of the box. Priority: GitHub PATs, npm tokens and cloud keys from build environments.<\/p>\n<div data-element=\"checklist\" style=\"background:#23261f;border:1px solid rgba(105,216,237,0.22);border-radius:10px;padding:22px 24px;margin:32px 0;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 2px 10px rgba(0,0,0,0.22);\">\n<p style=\"margin:0 0 12px;font-family:'IBM Plex Mono',ui-monospace,SFMono-Regular,monospace;font-size:0.72em;letter-spacing:0.12em;text-transform:uppercase;color:#69d8ed;\">Immediate Actions<\/p>\n<ul style=\"margin:0;padding-left:0;list-style:none;\">\n<li style=\"margin:0 0 10px;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>Regenerate lockfiles, enforce safe version pins<\/li>\n<li style=\"margin:0 0 10px;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>Check drop paths and detached Node processes on dev and CI hosts<\/li>\n<li style=\"margin:0 0 10px;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>Rotate secrets on affected machines<\/li>\n<li style=\"margin:0 0 10px;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>pull_request_target: no checkout of untrusted heads with secrets; least\u2011privilege tokens<\/li>\n<li style=\"margin:0 0 10px;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>Release branches: review required, signed commits, direct push disabled<\/li>\n<li style=\"margin:0;padding-left:26px;position:relative;color:#e6e3da;line-height:1.5;\"><span style=\"position:absolute;left:0;color:#69d8ed;\">&#10003;<\/span>CI egress: only expected registry destinations, block IPFS\/DHT by default<\/li>\n<\/ul>\n<\/div>\n<p>Structurally, a cooldown for freshly published npm versions and runtime egress controls in GitHub Actions pay off. Provenance remains useful as a layer above CI hardening, branch protection, dependency cooldown and behavior telemetry in the build.<\/p>\n<h2 style=\"margin-top:48px;margin-bottom:18px;\">Perspective for DACH Enterprises<\/h2>\n<p>AsyncAPI is embedded in API generators, documentation pipelines and DevOps toolchains. Those who adopt event\u2011driven architectures and automate OpenAPI\/AsyncAPI are often using the packages indirectly. The NIS2 directive and the Cyber Resilience Act tighten expectations around supply\u2011chain risk management. The claim \u201cwe verify provenance\u201d alone isn\u2019t sufficient when workflow permissions and branch governance remain open.<\/p>\n<p>This case highlights governance at the source\u2011of\u2011truth: the Git branch and the CI workflows that feed the pipeline. Registry attestations add to this layer but do not replace it as the sole proof of trust.<\/p>\n<h2 style=\"padding-top:64px;margin-bottom:20px;\">Frequently Asked Questions<\/h2>\n<p class=\"st-faq-hint\">Every question is locked. A tap unlocks the answer.<\/p>\n<details>\n<summary><strong>Did the npm provenance not serve as proof of trust?<\/strong><\/summary>\n<p style=\"margin:8px 0 4px 24px;color:#555;line-height:1.6;\">It proves the authorized workflow and the build context. The legitimacy of the triggering commit and the integrity of upstream CI credentials does not cover it. In the event of a branch compromise, the attestation can be technically correct but misleading for the risk question.<\/p>\n<\/details>\n<details>\n<summary><strong>Would a blocker for install scripts have prevented it?<\/strong><\/summary>\n<p style=\"margin:8px 0 4px 24px;color:#555;line-height:1.6;\">No. The dropper relied on the module load (require). npm lifecycle scripts were left out of the protection. Security requires behavioral and egress controls in the build.<\/p>\n<\/details>\n<details>\n<summary><strong>Are fresh installations still dangerous today?<\/strong><\/summary>\n<p style=\"margin:8px 0 4px 24px;color:#555;line-height:1.6;\">The malicious versions have been removed from the registry. Risky remain lock files and caches from the exposure window as well as hosts that have already executed the payload.<\/p>\n<\/details>\n<details>\n<summary><strong>Which credentials rotate first?<\/strong><\/summary>\n<p style=\"margin:8px 0 4px 24px;color:#555;line-height:1.6;\">On affected development and CI systems: GitHub and npm tokens, SSH keys and cloud credentials that were stored in the environment or in runner secrets. The justification is shell access plus persistence. The harvesting module was included in this release via this configuration.<\/p>\n<\/details>\n<details>\n<summary><strong>What is the priority governance measure?<\/strong><\/summary>\n<p style=\"margin:8px 0 4px 24px;color:#555;line-height:1.6;\">Audit pull_request_target and associated privileged workflows (no untrusted checkout with secrets, use least\u2011privilege tokens), lock down release branches (require reviews, enforce signed commits, block direct pushes) and limit CI egress. Provenance supplements this by providing proof of the build pipeline.<\/p>\n<\/details>\n<p><!--ST-LOWER-CARDS lang=en--><\/p>\n<h3 style=\"margin:48px 0 18px;padding-left:12px;font-size:1.05em;font-weight:800;color:#e6e3da;border-left:3px solid #69d8ed;line-height:1.2;\">Editor&#8217;s Picks<\/h3>\n<p><a href=\"https:\/\/www.securitytoday.de\/en\/2026\/07\/15\/cursor-launches-git-exe-from-repo-root-windows\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/07\/cursor-windows-git-exe-repo-root-code-execution-cover-hero-250x141.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#69d8ed;margin-bottom:5px;\">Editor&#8217;s Pick<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">Cursor Launches git.exe from Repository Root on Windows<\/span><\/span><\/a><a href=\"https:\/\/www.securitytoday.de\/en\/2026\/07\/15\/legacyhive-poc-latest-windows-patches\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/07\/legacyhive-windows-eop-poc-nach-patch-tuesday-cover-hero-250x141.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#69d8ed;margin-bottom:5px;\">Editor&#8217;s Pick<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">LegacyHive PoC Meets Latest Windows Patches<\/span><\/span><\/a><a href=\"https:\/\/www.securitytoday.de\/en\/2026\/07\/15\/two-joomla-upload-vulnerabilities-added-to-cisa-kev\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/07\/joomla-icagenda-balbooa-kev-upload-rce-cover-hero-250x141.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#69d8ed;margin-bottom:5px;\">Editor&#8217;s Pick<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">Two Joomla Upload Vulnerabilities Added to CISA KEV<\/span><\/span><\/a><\/p>\n<h3 style=\"margin:48px 0 18px;padding-left:12px;font-size:1.05em;font-weight:800;color:#e6e3da;border-left:3px solid #69d8ed;line-height:1.2;\">More from the MBF Media Network<\/h3>\n<p><a href=\"https:\/\/www.cloudmagazin.com\/en\/2026\/07\/16\/when-ai-agents-travel-data-residency-as-an-operating-problem\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/09\/net-when-ai-agents-travel-data-residency-as-46681309.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#0bb7fd;margin-bottom:5px;\">cloudmagazin<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">When AI Agents Travel: Data Residency as an Operating Problem<\/span><\/span><\/a><a href=\"https:\/\/mybusinessfuture.com\/en\/more-insolvencies-smaller-cases-what-counts\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/09\/net-more-insolvencies-smaller-cases-what-cou-22218328-250x143.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#aa8ac2;margin-bottom:5px;\">MyBusinessFuture<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">More insolvencies, smaller cases: What counts<\/span><\/span><\/a><a href=\"https:\/\/www.digital-chiefs.de\/en\/token-opex-inference-controls-not-the-seat-budget\/\" style=\"display:flex;align-items:center;gap:14px;padding:12px 14px;margin:0 0 10px;background:#23261f;border:1px solid rgba(105,216,237,0.18);border-radius:12px;box-shadow:inset 0 1px 0 rgba(230,227,218,0.06),0 6px 18px rgba(0,0,0,0.22);text-decoration:none;color:#e6e3da;box-sizing:border-box;width:100%;\"><span style=\"flex:0 0 116px;aspect-ratio:16\/9;overflow:hidden;border-radius:8px;background:#111210;border:1px solid rgba(230,227,218,0.08);display:block;\"><img decoding=\"async\" src=\"https:\/\/www.securitytoday.de\/wp-content\/uploads\/2026\/07\/net-token-opex-inference-steuert-nicht-das-s-43794747-250x141.jpg\" alt=\"\" loading=\"lazy\" width=\"116\" height=\"65\" style=\"width:100%;height:100%;object-fit:cover;display:block;\"><\/span><span style=\"display:block;min-width:0;\"><span style=\"display:block;font-size:0.68em;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:#e8828d;margin-bottom:5px;\">Digital Chiefs<\/span><span style=\"display:block;font-size:1.0em;font-weight:650;line-height:1.35;color:#e6e3da;overflow-wrap:anywhere;\">Token-OPEX: Inference Controls, Not the Seat Budget<\/span><\/span><\/a><!--\/ST-LOWER-CARDS--><\/p>\n","protected":false},"excerpt":{"rendered":"Four AsyncAPI packages with valid OIDC provenance delivered a botnet loader. The entry point was a misconfigured CI workflow.","protected":false},"author":10,"featured_media":22221,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_focuskw":"AsyncAPI npm packages","_yoast_wpseo_title":"CI\/CD Published AsyncAPI Botnet Loader","_yoast_wpseo_metadesc":"Four AsyncAPI npm packages with valid provenance still delivered a botnet loader. The attack started in the CI pipeline.","_yoast_wpseo_meta-robots-noindex":"","_yoast_wpseo_meta-robots-nofollow":"","_yoast_wpseo_meta-robots-adv":"","_yoast_wpseo_canonical":"","_yoast_wpseo_opengraph-title":"","_yoast_wpseo_opengraph-description":"","_yoast_wpseo_opengraph-image":"","_yoast_wpseo_opengraph-image-id":0,"_yoast_wpseo_twitter-title":"","_yoast_wpseo_twitter-description":"","_yoast_wpseo_twitter-image":"","_yoast_wpseo_twitter-image-id":0,"evm_kih_original":false,"_evm_slot_owner":"","evm_cvss":0,"evm_risk":0,"evm_casefile":"","evm_primary_cve":"","evm_pin_until":0,"evm_external_preview_token":"","evm_external_preview_expires":"","_evm_translation_lang":"en","featured_post":0,"featured_post_sortierung":0,"_wp_old_slug":[],"footnotes":""},"categories":[255],"tags":[],"class_list":["post-22331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-praxis-umsetzung-en"],"evm_reading_time_minutes":8,"wpml_language":"en","wpml_translation_of":22219,"_links":{"self":[{"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/posts\/22331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/comments?post=22331"}],"version-history":[{"count":2,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/posts\/22331\/revisions"}],"predecessor-version":[{"id":24272,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/posts\/22331\/revisions\/24272"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/media\/22221"}],"wp:attachment":[{"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/media?parent=22331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/categories?post=22331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.securitytoday.de\/en\/wp-json\/wp\/v2\/tags?post=22331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}