Back to skill

Security audit

Kagi Summarizer

Security checks for vulnerabilities and agentic risk

Overview

The skill performs the advertised Kagi summarization, but its wrapper can download and immediately run a mutable, unverified GitHub release binary.

Review this before installing. The summarizer itself is straightforward, but avoid the auto-download path unless you trust the GitHub release source and verify the binary yourself. Prefer building from the included Go source. Do not submit confidential documents, internal URLs, secrets, or regulated data unless Kagi use is approved for that data.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Error
Location
kagi-summarizer.sh:43
Finding

Unverified Remote Binary Download and Execution

Content
View full analysis
/dev/null 2>&1; then RELEASE_META="$(curl -fsSL "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")" elif command -v wget >/dev/null 2>&1; then RELEASE_META="$(wget -qO- "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")" else echo "Error: Neither curl nor wget found. Please download the binary manually from:" >&2 echo " https://github.com/joelazar/kagi-skills/releases/latest" >&2 exit 1 fi TAG="$(printf '%s\n' "$RELEASE_META" | grep -m1 '"tag_name"' | cut -d'"' -f4 || true)" if [[ -z "$TAG" ]]; then echo "Error: Could not resolve latest release tag from GitHub API." >&2 echo "Please download manually from: https://github.com/joelazar/kagi-skills/releases/latest" >&2 exit 1 fi BINARY="kagi-summarizer_${TAG}_${OS}_${ARCH}" URL="https://github.com/joelazar/kagi-skills/releases/download/${TAG}/${BINARY}" echo "kagi-summarizer binary not found. Download pre-built binary from GitHub releases?" >&2 echo " $URL" >&2 read -r -p "Download? [Y/n] " reply >&2 &2 echo " $URL" >&2 exit 1 ;; esac if command -v curl >/dev/null 2>&1; then curl -fsSL "$URL" -o "$BIN" else wget -qO "$BIN" "$URL" fi chmod +x "$BIN" fi fi exec "$BIN" "$@" ``` ### Technical Analysis If a suitable locally built executable is unavailable, t ...[truncated 2597 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The advertised behavior is summarization, but the skill also fetches release metadata from GitHub, downloads a prebuilt executable, and may build code locally with Go. That mismatch is dangerous because users may invoke a seemingly simple summarizer while actually enabling software installation and execution paths they did not consent to or review.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

This script implements an installer/updater flow by querying GitHub for the latest release, downloading the matching binary, marking it executable, and later executing it. That behavior is not necessary for the declared business function of summarizing text/URLs and creates a meaningful remote code execution and supply-chain exposure if the fetched artifact is malicious or unexpectedly changed.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill uses shell commands, environment variables, network access, and binary execution, but it does not declare any explicit tool scope or permissions. This is dangerous because consumers cannot easily understand or constrain the operational capabilities, increasing the chance of unintended command execution, secret access, or network activity during use or installation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill is explicitly designed to summarize user-provided URLs or raw text via Kagi's external API, but the description does not clearly warn that submitted content leaves the local environment. This creates a privacy and data-handling risk, especially if users paste sensitive documents, internal URLs, or proprietary text assuming the operation is local.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
Requires a Kagi account with API access enabled. Uses the same `KAGI_API_KEY` as all other kagi-* skills.

1. Create an account at https://kagi.com/signup
2. Navigate to Settings → Advanced → API portal: https://kagi.com/settings/api
3. Generate an API Token
4. Add funds at: https://kagi.com/settings/billing_api

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The wrapper can fetch a pre-built executable from GitHub Releases and then run it locally, which expands the skill from simple summarization into remote code installation and execution. Even though the source appears intended as a convenience bootstrapper, downloading an unsigned/unverified binary at runtime creates a supply-chain risk if the release, repository, network path, or resolved tag is tampered with.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
esac

    if command -v curl >/dev/null 2>&1; then
      RELEASE_META="$(curl -fsSL "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    elif command -v wget >/dev/null 2>&1; then
      RELEASE_META="$(wget -qO- "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    else

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · kagi-summarizer.sh (reported line 48)May include surrounding context.

sh
esac

    if command -v curl >/dev/null 2>&1; then
      RELEASE_META="$(curl -fsSL "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    elif command -v wget >/dev/null 2>&1; then
      RELEASE_META="$(wget -qO- "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    else

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · kagi-summarizer.sh (reported line 50)May include surrounding context.

sh
esac

    if command -v curl >/dev/null 2>&1; then
      RELEASE_META="$(curl -fsSL "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    elif command -v wget >/dev/null 2>&1; then
      RELEASE_META="$(wget -qO- "https://api.github.com/repos/joelazar/kagi-skills/releases/latest")"
    else

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script ultimately execs whatever binary was built or downloaded without presenting a clear warning about what that program will do next, beyond the earlier download prompt. This reduces user visibility and compounds the risk from the prior download/install behavior because a substituted or compromised binary is immediately granted execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The tool sends user-supplied URLs or raw text to Kagi's external summarization API, which can expose sensitive or proprietary content if users assume processing is local. In a summarization skill, this behavior is expected, but the absence of an explicit warning or consent mechanism increases the risk of accidental data disclosure.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The usage text says valid engines are "cecil, agnes, muriel", but the code's accepted engine list also includes "daphne". This is an active documentation-to-code mismatch about a user-visible capability, not just missing implementation detail.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.