Back to skill

Security audit

Structured PR Review

Security checks for vulnerabilities and agentic risk

Overview

This PR review skill is not overtly malicious, but it can use an authenticated GitHub session to post replies, resolve threads, update PRs, and push commits without enough guardrails.

Use this skill in read-only review mode unless you explicitly want the agent to mutate a PR. Before allowing addressing mode, confirm the repository, PR number, branch, and exact actions, and require approval before comments, thread resolution, PR description edits, or pushes. Prefer --no-lobster or a pinned, verified Lobster version, and treat all PR text and diffs as untrusted input.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T01 · Skill Instruction Hijacking

Error
Location
scripts/merge-pr-context.py:120
Finding

Untrusted pull-request content is passed to the agent without prompt-injection isolation

Content
View full analysis
"$_STDERR_TMP") || { echo "fetch-pr.sh: gh pr view failed: $(cat "$_STDERR_TMP")" >&2 exit 2 } # --------------------------------------------------------------------------- # Fetch PR diff (non-fatal if it fails — diff may be unavailable for closed PRs) # --------------------------------------------------------------------------- PR_DIFF="" PR_DIFF=$(gh pr diff "$PR" "${REPO_ARGS[@]}" 2>/dev/null) || PR_DIFF="" # --------------------------------------------------------------------------- # Build JSON safely via Python (shell values in env, never interpolated) # --------------------------------------------------------------------------- PR_JSON=$(PR_META="$PR_META_OUT" PR_DIFF="$PR_DIFF" python3 - <<'PY' ``` `scripts/fetch-pr.sh:106-120` places that content in the source blob without establishing a trust boundary: ```python result = { "source": "fetch-pr", "pr_number": data.get("number"), "repo": repo_slug, "url": url, "title": data.get("title", ""), "body": data.get("body") or "", "head_ref": data.get("headRefName", ""), "base_ref": data.get("baseRefName", ""), "head_sha": data.get("headRefOid", ""), "state": data.get("state", ""), "files_changed": len(data.get("files") or []), "additions": data.get("additions", 0), "dele ...[truncated 3300 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/lobster-integration.md:134
Finding

Documentation recommends unpinned npm package installation and execution

Content
View full analysis
/dev/null 2>&1 && npx --no-install @clawdbot/lobster version >/dev/null 2>&1; then _LOBSTER_BIN="npx --no-install @clawdbot/lobster" fi if $REQUIRE_LOBSTER && [[ -z "$_LOBSTER_BIN" ]]; then echo "run-pr-review.sh: Lobster not found and --lobster-mode was requested" >&2 echo " Install: npm install -g @clawdbot/lobster" >&2 exit 3 fi ``` ### Technical Analysis The documented `npm install -g @clawdbot/lobster` command resolves the current registry version at installation time. The documented `npx @clawdbot/lobster version` command may download and execute the current release when it is not already installed. Neither command pins an audited version or verifies package integrity. A compromised publisher account, npm package, or future release could therefore introduce arbitrary executable code after the Skill itself has been reviewed. npm installation may also execute package lifecycle scripts. The runtime check uses `npx --no-install`, which ordinarily prevents downloading during automatic detection. This reduces the normal execution risk, but it does not address the unpinned installation instructions or guarantee that the locally cached package is the reviewed version. ### Attack Path 1. ...[truncated 1035 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose describes a PR code review tool that analyzes code and outputs review findings categorized by severity tiers and addressing mode. The supplied code does not review code at all. Its primary function is to retrieve CI/check-run status for a PR or commit using gh pr view and gh api, summarize the results, and return an exit code based on whether checks passed, failed, or are pending. While both relate to pull requests and use the GitHub CLI, this is a materially different purpose and capability set from layered PR review. Therefore this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description says the skill performs layered PR code review with categorized feedback and addressing-mode behavior. However, the actual code only retrieves PR metadata and diff content from GitHub using the gh CLI and packages it into JSON. While using gh CLI is consistent with part of the description, the core promised functionality—reviewing code and producing severity-tiered feedback—is absent. This is a material purpose mismatch, not merely a supporting implementation detail.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says the skill reviews PRs and produces structured review output with severity tiers and addressing-mode. The supplied code only fetches already-existing review artifacts from GitHub (gh pr view, gh api /reviews, gh api /comments) and formats them into JSON. This is a materially different primary purpose: collection/export of review data, not review or classification. The gh CLI aspect is consistent, and Lobster is only mentioned as optional elsewhere, but the core behavior does not match the claimed review capability.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose describes a PR code review skill whose main function is to analyze a pull request and produce structured review feedback with severity tiers and addressing-mode. The supplied code instead only aggregates input JSON blobs from stdin into a combined context object. It recognizes fetch-pr, fetch-ci, and fetch-reviews sources, validates presence of the required PR blob, fills default sections for missing optional data, emits merged JSON, and returns status codes indicating success/partial/error. While the docstring references a Lobster workflow template and PR-related inputs, those are merely integration details for data preparation. The code contains no review logic, no severity classification, no comments generation, and no gh CLI interaction in this chunk. Therefore the actual behavior is materially different from the declared primary purpose.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 8)May include surrounding context.

md
pipeline parallelises data gathering when Lobster (Node/npx) is available; see [references/lobster-integration.md](references/lobster-integration.md).

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 24)May include surrounding context.

md
pipeline parallelises data gathering when Lobster (Node/npx) is available; see [references/lobster-integration.md](references/lobster-integration.md).

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 83)May include surrounding context.

md
pipeline parallelises data gathering when Lobster (Node/npx) is available; see [references/lobster-integration.md](references/lobster-integration.md).

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 77)May include surrounding context.

md
- `scripts/fetch-ci.sh` — CI / check-run status → JSON

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 78)May include surrounding context.

md
- `scripts/fetch-reviews.sh` — Review comments + inline threads → JSON

Context Leakage

High
Category
Data Exfiltration
Confidence
75% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · scripts/run-pr-review.sh (reported line 161)May include surrounding context.

sh
exit $?
  fi

  # Extract the context JSON from Lobster output. Lobster may emit either:
  #   - a compact JSON object per line
  #   - a pretty-printed JSON object
  #   - a JSON array containing step outputs / final context objects

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The activation wording for reviewing or checking a PR is broad and underspecified, which can cause the skill to trigger on common requests and perform repository/API actions in contexts the user did not intend. In a code-hosting environment, ambiguous invocation increases the chance of over-collection of PR data, unintended review actions, or misuse of GitHub tooling against the wrong repository or pull request.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The phrase 'address, fix, or respond to PR feedback' lacks scope constraints and is coupled with instructions to reply to every comment, resolve threads, update the PR description, and push changes. That combination can lead an agent to take write actions on repositories and discussions based on vague prompts, creating a real risk of unauthorized modifications, noisy automation, or operational damage if triggered in the wrong context.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The documentation instructs users to run npx @clawdbot/lobster without pinning a specific package version. That allows execution of whatever version is current in the npm registry at runtime, which creates a supply-chain risk: a compromised maintainer account, malicious publish, or breaking release could lead to unreviewed code execution on the user's machine. In this skill context, the risk is somewhat elevated because the package is being presented as a tool-mode workflow component for agent integration, so users may run it in automation or trusted review environments.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.