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

review-github-pr

skill:nvidia/openshell#review-github-pr

Review a GitHub pull request by summarizing its diff and key design decisions. Use when the user wants to review a PR, understand changes in a branch, or get a code review summary. Trigger keywords - review PR, review pull request, summarize PR, summarize diff, code review, review branch, PR summary, diff summary.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 27, 2026, 21:50 UTC at fa2d381

Dispute security verdict

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

5
findings
medium
highest severity
3
threat classes
2,140
files scanned
73/73
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding skill:.agents/skills/review-github-pr:.agents/skills/review-github-pr/SKILL.md:155:HIJACK
  • suspicious: finding skill:.agents/skills/review-github-pr:.agents/skills/review-github-pr/SKILL.md:156:SUPPLY
  • suspicious: finding skill:.agents/skills/review-github-pr:.agents/skills/review-github-pr/SKILL.md:157:SUPPLY
  • suspicious: finding skill:.agents/skills/review-github-pr:.agents/skills/review-github-pr/SKILL.md:5:MANIP
  • suspicious: finding skill:.agents/skills/review-github-pr:crates/openshell-crypto/README.md:162:SUPPLY

Security findings 5

Agent hijacking

mediumContextual riskmedium confidence

The review skill instructs the agent to apply the sync-agent-infra maintenance map and its full consistency checklist, content that no agent consumes, so at runtime the agent follows instructions from a file outside the reviewed agent-content surface.

use the `sync-agent-infra` maintenance map to check that related skills were updated
vector:instruction
Counter-argument considered

The strongest counter is that consulting a maintenance map is ordinary review workflow, but the skill body verbatim instructs the agent to apply the `sync-agent-infra` maintenance map and a full consistency checklist whose content is neither shipped nor declared anywhere in the shown evidence, and per the pass rules an instruction to apply content the artifact does not ship is not neutralized by the file being absent or benign-looking, so no gate refutes the finding.

Supply chain

mediumContextual risklow confidence

The skill directs the agent to load and apply review criteria from a file outside the skill artifact (../../../crates/openshell-crypto/CRYPTO.md), so the agent consumes whatever content sits at that path at runtime and its effect is unverifiable from this artifact.

against the repository's [crypto architecture](../../../crates/openshell-crypto/CRYPTO.md); protocol/parsing types alone are not bypasses
vector:instruction
Counter-argument considered

The skill body contains the cited reference directing the agent to check review criteria against CRYPTO.md at runtime; no shown evidence ships or declares that file's content, and the possibility that the file is missing or ordinary documentation never neutralizes the read-and-apply instruction, so the finding stands.

Supply chain

mediumContextual risklow confidence

The skill instructs the agent to use the `sync-agent-infra` maintenance map, content defined in another component not shipped by this artifact, so the agent applies unverifiable instructions from whatever is at that location at runtime.

use the `sync-agent-infra` maintenance map to check that related skills were updated
vector:instruction
Counter-argument considered

The instruction to use the `sync-agent-infra` maintenance map is present verbatim in the skill body; the map's defining content is not shipped or declared in the shown evidence, and an absent or benign target would not make the apply instruction harmless or chain-free, so no evidence refutes the finding.

Manipulation

mediumContextual risklow confidence

The skill's frontmatter carries an unverifiable 'internal: true' status marker which, per the pass's reviewer-targeted-claim rule, cannot lower scrutiny and is reported so the verdict does not credit it.

internal: true
evasion:scannervector:metadata
Counter-argument considered

The frontmatter plainly carries the unverifiable `internal: true` status marker, a trust claim of exactly the kind the pass rules assign zero weight and treat as a warning sign, and no carve-out or substantiating declaration covers it; the only weakness is the absence of any shown consumer or instruction built on the field, which is an absence that cannot refute, so the finding stands as reported.

Supply chain

mediumContextual risklow confidence

The openshell-crypto README confirms the repository ships a build-time Z3 archive downloader, meaning a Rust build script fetches a remote archive during compilation, which would enable supply-chain code execution if the source is mutable or the download is not pinned by version and checksum.

The build-time Z3 archive downloader retains the narrowly allowed Rustls/Ring
vector:code
Counter-argument considered

The served CRYPTO.md is plain architecture documentation with no agent-directed content, and no build-script evidence was served (crates/openshell-crypto/build.rs resolved only to other crates' build.rs files), so no evidence establishes the pinned-official-install carve-out or any mitigation, and open documentation of the downloader does not neutralize it; the README confirms a build-time Z3 archive fetch in the build graph and instructs running crate tests that trigger build-time tooling, so the low-confidence contextual supply-chain finding stands.

Open questions 10

What the analysis could not settle from the code alone.

All 17 PY-CLAIM-CONTRADICTION detector leads cite a claim (Disabling this crate's feature alone does not remove dependency-owned crypto...) that appears in none of the provided units; their flagged file_write excerpts (--json, ...origin/, ], `, **, ., ,, :, -review.md) map to benign gh/git commands, a summary template, and a user-requested review output path, so no contradiction or persistence chain could be confirmed from the evidence shown.
Persistence
[file request crates/openshell-core/build.rs] Does this build script fetch any archive or tool (e.g., a Z3 archive downloader) at build time, and if so is the download pinned by version and checksum to a trusted source rather than fetched from a mutable URL?
Supply chain
[file request crates/openshell-driver-vm/build.rs] Does this build script fetch any archive or tool (e.g., a Z3 archive downloader) at build time, and if so is the download pinned by version and checksum to a trusted source rather than fetched from a mutable URL?
Supply chain
[file request crates/openshell-server/build.rs] Does this build script fetch any archive or tool (e.g., a Z3 archive downloader) at build time, and if so is the download pinned by version and checksum to a trusted source rather than fetched from a mutable URL?
Supply chain
[file request examples/isolation-backend-v8/build.rs] Does this build script fetch any archive or tool (e.g., a Z3 archive downloader) at build time, and if so is the download pinned by version and checksum to a trusted source rather than fetched from a mutable URL?
Supply chain
[file request crates/openshell-crypto/build.rs] Does this build script implement the disclosed build-time Z3 archive downloader, and is the archive pinned by version and checksum to a trusted source rather than fetched from a mutable URL?
Supply chain
[file request .agents/skills/sync-agent-infra/SKILL.md] The review skill instructs the agent to 'use the sync-agent-infra maintenance map' during PR reviews; does that referenced content contain only consistency-checking guidance, or does it add writes, network access, or agent-steering directives beyond the declared review task?
Agent hijacking
[file request .agents/skills/sync-agent-infra/SKILL.md] SKILL.md lines 155-158 instruct the agent to use the 'sync-agent-infra' maintenance map and its full consistency checklist. Does that referenced content stay within repository consistency checks, or does it write outside the repository, contact the network, or target hidden or glob-matched files?
Persistence
[file request crates/openshell-crypto/build.rs] README lines 161-164 mention a 'build-time Z3 archive downloader' allowed in deny.toml. Does this build script implement that downloader, and is the fetched archive pinned by version and hash to a trusted source rather than a mutable URL?
Supply chain
[file request .agents/skills/sync-agent-infra/SKILL.md] Does the sync-agent-infra skill / maintenance map referenced by the review guidelines contain instructions that alter agent behavior or perform harmful actions (persistence, execution, exfiltration) when applied during a PR review?
Agent hijacking

Coverage gaps 42

Parts of the artifact the static analysis could not fully examine.

context:manifest_unparseable yaml: YAML aliases are not permitted
.github/workflows/build-binaries.yml
context:manifest_unparseable yaml: YAML aliases are not permitted
.github/workflows/build-images.yml
context:manifest_unparseable yaml: while parsing a flow node
crates/openshell-prover-cli/tests/fixtures/invalid.yaml
context:manifest_unparseable yaml: YAML aliases are not permitted
deploy/docker/docker-compose.yml
context:manifest_unparseable yaml: while parsing a flow mapping
deploy/helm/openshell/templates/agent-sandbox-preflight.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/backend-tls-policy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/cert-manager-pki.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/certgen.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/clusterrole.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/clusterrolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-namespace.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-secrets-rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/credential-storage-key-encryption-key-secret.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/deployment.yaml
context:manifest_unparseable yaml: expected '<document start>', but found '<block mapping start>'
deploy/helm/openshell/templates/gateway-config.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/gateway.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/grpcroute.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/hpa.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/peer-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/peer-service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/replica-services.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/route.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/serviceaccount.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/statefulset.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-hpa.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-pdb.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-service.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor-token-secret.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/supervisor.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/workspace-secret-source-role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell/templates/workspace-secret-source-rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/networkpolicy.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/role.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/rolebinding.yaml
context:manifest_unparseable yaml: while parsing a flow node
deploy/helm/openshell-workspace/templates/serviceaccount.yaml
context:manifest_unparseable yaml: while scanning a simple key
e2e/mcp-conformance/policy-template.yaml