Like handing a loaded shell to a build step that Amazon already defused on their own servers
CVE-2026-85012 is an OS command injection (CWE-78) in the Amazon CodeCatalyst Blueprints SDK prior to version 0.3.156. The owner field of a [local] merge strategy entry in the .ownership-file is passed unsanitized to a shell command during the blueprint resynthesis process. An authenticated project contributor who can commit to the repository can embed shell metacharacters in that field. When resynthesis is triggered (requiring another user's action), the injected commands execute in the resynthesis environment with whatever privileges that process holds.
The vendor scored this HIGH at 8.0, but that rating dramatically overstates the real-world risk. The managed Amazon CodeCatalyst service is not vulnerable — AWS applies server-side validation that rejects [local] merge strategy commands outside a restricted allowlist, even for blueprint versions published before the fix. The only affected population is organizations running the open-source SDK in self-hosted environments, a group so small the core npm package sees roughly 919 weekly downloads. Even in that niche, resynthesis typically runs in an isolated per-project environment with scoped credentials, capping blast radius. The vendor HIGH is defensible as a theoretical maximum, but the real-world exposure population is vanishingly small.
4 steps from start to impact.
Obtain repository commit access
- Valid authenticated account on the CodeCatalyst project
- Write/commit access to the target repository
- Target must be using self-hosted Blueprints SDK, NOT the managed CodeCatalyst service
- Managed CodeCatalyst service users are immune — server-side allowlist blocks this vector entirely
- Self-hosted SDK install base is extremely small (~919 weekly npm downloads for the core package)
- Requires insider or compromised developer credentials
.ownership-file changes in PRs would catch injected metacharacters. No known scanner signatures exist for this specific vector.Craft malicious .ownership-file
.ownership-file in the repository, inserting shell metacharacters (e.g., $(cmd), ` cmd , ; cmd) into the owner field of a [local]` merge strategy entry. This file is committed to the repository and awaits the resynthesis trigger.- Knowledge of the
.ownership-fileformat and[local]merge strategy syntax - Ability to push commits (or merge a PR) containing the malicious file
- The file format is niche and not widely documented outside the SDK, reducing opportunistic exploitation
- PR review processes would catch suspicious metacharacters in ownership files
.ownership-file entries.Trigger resynthesis (requires user interaction)
.ownership-file. The attacker cannot trigger this unilaterally in most configurations.- A separate user or CI trigger must invoke blueprint resynthesis
- The resynthesis process must use the vulnerable SDK version (<0.3.156)
- UI:R requirement means passive waiting — attacker cannot force the trigger
- Automated CI pipelines may run resynthesis, but only if configured to do so with the self-hosted SDK
Command execution in resynthesis environment
- Resynthesis environment runs with useful privileges or credentials
- Environment is not sufficiently sandboxed
- Best-practice deployments run resynthesis in isolated containers with scoped credentials
- Scope:Unchanged (S:U) in the CVSS vector confirms the vendor does not expect cross-boundary impact
- Lateral movement from a sandboxed resynthesis container is a separate, non-trivial chain
The supporting signals.
| In-the-Wild Exploitation | No known exploitation. Not listed on CISA KEV. No campaigns or threat actor use reported as of 2026-09-04. |
|---|---|
| Proof-of-Concept | No public PoC identified. No exploit code found on GitHub, Exploit-DB, or security researcher disclosures. The attack is conceptually simple (shell metacharacter injection) but the target surface is extremely niche. |
| EPSS Score | Not yet scored (disclosed 2026-09-03, less than 48 hours old). Expected to be low percentile given the niche attack surface and authentication requirement. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-09-04. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H — 8.0 HIGH. Network-accessible but requires authentication (PR:L) and user interaction (UI:R). Scope is Unchanged, meaning impact stays within the vulnerable component boundary. |
| Affected Versions | Amazon CodeCatalyst Blueprints SDK < 0.3.156 (npm package @amazon-codecatalyst/blueprints.blueprint). The managed CodeCatalyst service is NOT affected due to server-side allowlist validation. |
| Fixed Version | 0.3.156 — removes shell interpretation of the owner field, runs commands directly, and rejects values outside an allowlisted form. |
| Install Base / Exposure | Core npm package receives ~919 weekly downloads per socket.dev. Classified as *not popular*. The managed CodeCatalyst service (the vast majority of users) is immune. |
| Disclosure Date | 2026-09-03 (yesterday). AWS security bulletin published concurrently. |
| Reporting Researcher | Not publicly attributed. Disclosed via AWS security bulletin process. |
noisgate verdict.
The single most decisive factor is that the managed CodeCatalyst service is immune — AWS applies server-side validation blocking exploitation even on unpatched SDK versions — leaving only self-hosted SDK users exposed, a population of roughly 919 weekly npm downloads. This near-zero real-world exposure population, combined with authentication and user-interaction requirements, collapses the practical risk well below the vendor's HIGH/8.0 rating.
Why this verdict
- Managed service immunity eliminates >95% of the user base: AWS confirmed that the CodeCatalyst managed service applies server-side allowlist validation on
[local]merge strategy commands, rendering this CVE unexploitable for the vast majority of users regardless of SDK version. - Microscopic self-hosted install base: The core Blueprints SDK npm package has ~919 weekly downloads. Even assuming private registry mirrors, the self-hosted population is negligibly small for enterprise fleet-scale risk.
- Authentication + user interaction compounding friction: The chain requires PR:L (authenticated project contributor) AND UI:R (a separate user must trigger resynthesis). This is not a spray-and-pray attack; it requires insider positioning or compromised developer credentials, then passive waiting.
- Scope:Unchanged caps blast radius: The CVSS vector specifies S:U, meaning even the vendor does not expect the attacker to break out of the resynthesis environment boundary. Best-practice deployments use isolated containers with scoped credentials.
- Role multiplier: CI/CD-adjacent component with caveats. The Blueprints SDK is CI/CD-adjacent (resynthesis generates project scaffolding), placing it in the high-value role catalog. However: (1) the managed service is immune, so the canonical CI/CD deployment is not affected; (2) self-hosted SDK users running resynthesis in production CI pipelines without sandboxing represent a tiny fraction of an already tiny install base; (3) even in the worst case, S:U and scoped credentials limit blast radius to the project, not the fleet. The CI/CD role multiplier would floor this at HIGH if the canonical deployment were affected — but it is not. The floor does not apply because <1% of the installed base occupies the vulnerable configuration.
Why not higher?
Upgrading to HIGH or CRITICAL would require either the managed service to be vulnerable (it is not), a meaningfully large self-hosted population (npm data shows ~919 weekly downloads), or evidence of active exploitation or public PoC availability (neither exists). The CI/CD role multiplier is neutralized because the canonical deployment path — the managed CodeCatalyst service — is explicitly immune per AWS's own bulletin.
Why not lower?
Despite the tiny exposure population, this remains a real OS command injection (CWE-78) with full C/I/A impact in the resynthesis environment. The attack is conceptually simple (shell metacharacters in a config field) and requires only low privileges. Some enterprises may run self-hosted Blueprints SDK in CI pipelines with overprivileged service accounts, and the fix is a simple npm upgrade. Dropping to LOW or IGNORE would understate the risk for the small population that IS affected.
What to do — in priority order.
- Upgrade to SDK version 0.3.156 immediately — This is a one-line
npm updatefor self-hosted users. The fix removes shell interpretation entirely and adds allowlist validation. Given the MEDIUM verdict, this falls under the noisgate 365-day remediation SLA, but the simplicity of the fix means there is no reason to delay. - Audit .ownership-file contents in all repositories using the Blueprints SDK — Search for shell metacharacters (
$, backticks,;,|,&) in theownerfield of[local]merge strategy entries. This is a one-time grep across your CodeCatalyst-connected repositories to confirm no exploitation has occurred. - Run resynthesis in isolated containers with scoped credentials — If you must remain on a pre-0.3.156 SDK version temporarily, ensure the resynthesis process runs in a sandboxed container (Docker, Firecracker) with minimal IAM permissions scoped to the single project. This limits blast radius even if injection occurs.
- Add pre-commit hooks to reject suspicious .ownership-file changes — A simple git pre-commit or CI check that flags
.ownership-filemodifications containing shell metacharacters will block the attack vector at the commit layer.
- WAF / network-layer controls — The injection vector is a committed file in a git repository, not an HTTP request parameter. No WAF rule will intercept this.
- Managed CodeCatalyst service users do not need any compensating control — AWS server-side validation already blocks this vector. Do not waste cycles patching what is already mitigated.
- SAST/DAST scanning of your application code — The vulnerability is in the SDK's resynthesis engine processing a config file, not in your application source code. Standard application security scanners will not detect this.
Crowdsourced verification payload.
Run this on any host where the CodeCatalyst Blueprints SDK is installed (typically a CI runner or developer workstation). Execute as the user who runs npm: bash check_cve_2026_85012.sh. No elevated privileges required.
#!/usr/bin/env bash
# check_cve_2026_85012.sh
# Checks whether the installed @amazon-codecatalyst/blueprints.blueprint
# npm package is vulnerable to CVE-2026-85012 (OS command injection
# in blueprint resynthesis via .ownership-file owner field).
# Fixed in version 0.3.156.
#
# Exit codes:
# 0 = PATCHED or package not installed
# 1 = VULNERABLE
# 2 = UNKNOWN (could not determine version)
set -euo pipefail
PKG="@amazon-codecatalyst/blueprints.blueprint"
FIXED_VERSION="0.3.156"
# Check if npm is available
if ! command -v npm &>/dev/null; then
echo "UNKNOWN - npm not found on this host. If the Blueprints SDK is not used here, this host is not affected."
exit 2
fi
# Get installed version (global and local)
INSTALLED=$(npm ls "$PKG" --json 2>/dev/null | grep '"version"' | head -1 | sed 's/.*"version": *"\([^"]*\)".*/\1/' || true)
if [ -z "$INSTALLED" ]; then
echo "PATCHED - Package $PKG is not installed on this host."
exit 0
fi
echo "Found $PKG version: $INSTALLED"
# Compare versions using sort -V
LOWER=$(printf '%s\n%s' "$INSTALLED" "$FIXED_VERSION" | sort -V | head -1)
if [ "$LOWER" = "$INSTALLED" ] && [ "$INSTALLED" != "$FIXED_VERSION" ]; then
echo "VULNERABLE - $PKG $INSTALLED is below fixed version $FIXED_VERSION (CVE-2026-85012)"
exit 1
else
echo "PATCHED - $PKG $INSTALLED is at or above fixed version $FIXED_VERSION"
exit 0
fiIf you remember one thing.
@amazon-codecatalyst/blueprints.blueprint), run npm update to pull version 0.3.156 and you are done. Under the noisgate reassessed MEDIUM verdict, there is no mitigation SLA — go straight to the 365-day noisgate remediation SLA window. That said, this is a one-command npm upgrade with zero breaking changes, so there is no reason to defer it. Audit your repositories for .ownership-file entries containing shell metacharacters to rule out prior exploitation, and move on to higher-priority items in your queue.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.