Announcing Beacon: Self-improving memory for coding agents
← All skills
Skill

securing-container-registry-images

skill:mukul975/anthropic-cybersecurity-skills#securing-container-registry-images

Secures container registry images (ECR, ACR, GCR, Docker Hub) by scanning with Trivy and Grype, signing with Cosign and Sigstore, configuring registry access controls, and building CI/CD pipelines that block unscanned or unsigned images. Use when establishing registry security controls or enforcing scan/signature checks before image promotion.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 27, 2026, 22:59 UTC at 54a7988

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

4
findings
critical
highest severity
2
threat classes
4,532
files scanned
81/81
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding skill:skills/securing-container-registry-images:skills/securing-container-registry-images/SKILL.md:216:SUPPLY
  • suspicious: finding skill:skills/securing-container-registry-images:skills/securing-container-registry-images/SKILL.md:51:EXEC
  • suspicious: finding skill:skills/securing-container-registry-images:skills/securing-container-registry-images/SKILL.md:51:SUPPLY
  • suspicious: finding skill:skills/securing-container-registry-images:skills/securing-container-registry-images/SKILL.md:53:EXEC
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:4a5201f1c27f9eae)
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:52b50800fe56dea6)
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:9f01fb049ea74dc1)
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:a631109436b7b759)
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:a67e3128532e6800)
  • suspicious: floor fact PY-FETCH-EXEC-INSTRUCTED (DET:bc01a76c8144a0b5)

Security findings 4

Code execution

criticalContextual riskmedium confidence

The Prerequisites section instructs the agent to install Grype and Syft by piping install scripts fetched from unpinned main-branch raw.githubusercontent.com URLs directly into a shell, so executed code lives outside the pinned commit and can change without notice (Cosign is likewise installed via @latest).

curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh
conceal:remotevector:instruction
Counter-argument considered

The curl|sh lines are Anchore's vendor-documented installers openly listed in the Prerequisites install section and declared verbatim as network capabilities D1 and D3, so the vendor-installer/declared-core-capability carve-out defeats the harm and the conceal:remote premise is factually wrong.

Code execution

criticalContextual riskmedium confidence

The skill's prerequisites instruct the agent to install Syft by piping a shell script fetched from the unpinned main branch of raw.githubusercontent.com directly into sh, executing remote unpinned code on the host.

curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh
conceal:remotevector:instruction
Counter-argument considered

The Syft line is Anchore's vendor-documented installer transparently listed in the Prerequisites install section and declared verbatim as capability D3, so the vendor-installer/declared-capability carve-out applies and the conceal:remote premise fails.

Supply chain

highContextual risklow confidence

The CI/CD pipeline example pins the third-party aquasecurity/trivy-action GitHub Action to the mutable @master ref, so pipelines built from this instruction execute remote action code that can change without a pin.

uses: aquasecurity/trivy-action@master
conceal:remotevector:instruction
Counter-argument considered

The example concretely instructs agents to build CI workflows that execute aquasecurity/trivy-action@master at workflow run time, alongside COSIGN_PRIVATE_KEY; the mutable third-party action ref is covered by no declared claim (D1-D4 and the description cover tool installs and pipeline-building, not action pinning) and matches no carve-out since it is unpinned and is not a vendor installer command, so the finding stands.

Supply chain

highContextual risklow confidence

The skill instructs the agent to install Grype and Syft by piping mutable raw.githubusercontent.com main-branch install scripts directly into sh and Cosign at @latest, executing remote code whose content is not pinned by this artifact (disclosed in prerequisites and repeated in agent.py's error message, so adjudicated contextual rather than concealed).

curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh
conceal:remotevector:codevector:instruction
Counter-argument considered

The referenced scripts are Anchore's vendor installers transparently documented in the Prerequisites install section and declared verbatim as capabilities D1 and D3, so the carve-out applies; the residual concern is disclosed vendor install behavior, not concealed or undeclared code.

Open questions 1

What the analysis could not settle from the code alone.

The current content of the unpinned raw.githubusercontent.com main-branch install scripts and the @latest go module referenced by this skill lives outside the pinned commit and cannot be verified from the shown evidence.
Code execution
Refuted findings 2

Candidates the review stage examined and rejected, kept for transparency.

Code execution

criticalRefutedlow confidence

The SBOM generator's missing-tool handler prints an instruction telling the agent or user to execute a remote install script from Syft's unpinned main branch via curl piped into sh, which if followed runs remote code with user privileges.

Install: curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh
Why it was refuted

agent.py never fetches or executes the remote script; on a missing Syft binary it only prints the same vendor-official installer command that declared capability D3 states verbatim, so the behavior falls under the vendor-installer/declared-core-capability carve-out and the instruction is declared, not concealed.

Supply chain

criticalRefutedlow confidence

The prerequisites instruct installing Cosign via go install at the unpinned @latest version, so the binary that will later be built and executed is not fixed to any reviewable commit.

go install github.com/sigstore/cosign/v2/cmd/cosign@latest
Why it was refuted

go install of cosign at @latest is Sigstore's own documented install command, openly listed in the Prerequisites install section and declared verbatim as capability D2, so the vendor-installer/declared-capability carve-out applies and nothing is concealed or undeclared.