Back to skill

Security audit

Heartbeat Cron

Security checks for vulnerabilities and agentic risk

Overview

The skill is honestly aimed at creating scheduled automation, but it can set up recurring agents with broad permissions and includes unsafe examples that need careful review before use.

Install only if you are comfortable reviewing each generated HEARTBEAT.md before registration. Keep jobs scoped to read-only or workspace-write where possible, avoid permissions: skip and danger-full-access unless truly necessary, do not schedule destructive commands like docker system prune -f without explicit operational approval, use narrowly scoped tokens in .env, and prefer pinned/signed murmur releases over building the latest source branch.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
tests/run-tests.js:56
Finding

Shell Command Injection Through Unvalidated Test Runner Arguments

Content
View full analysis

Vulnerability Details

File Location: tests/run-tests.js, lines 56-69
Vulnerability Type: OS command injection
Risk Level: High

Vulnerable Code:

javascript
// Add any remaining args
const remainingArgs = args.filter(
  arg => !['--unit', '--integration', '--e2e', '--coverage', '--verbose', '-v', '--watch', '-w'].includes(arg)
);
jestArgs.push(...remainingArgs);

console.log('Running tests...\n');
console.log(`Command: ${command} ${jestArgs.join(' ')}\n`);

try {
  execSync(`${command} ${jestArgs.join(' ')}`, {
    stdio: 'inherit',
    cwd: __dirname
  });

Technical Analysis

Unrecognized command-line arguments are appended directly to jestArgs. The resulting array is joined into a string and passed to execSync, which invokes the operating system shell by default.

Because the arguments are neither escaped nor constrained to an allowlist, shell metacharacters such as command substitution, semicolons, pipes, and redirection operators retain their shell meaning. An argument intended for Jest can therefore alter the command executed by the shell.

Although this file is test tooling rather than the runtime Skill implementation, executing the provided test runner with attacker-controlled arguments can result in arbitrary local command execution.

Attack Path

  1. An attacker supplies or persuades a user, CI task, or wrapper script to pass a crafted argument to run-tests.js.
  2. The crafted value is not recognized by the option filter, so it is added to remainingArgs.
  3. jestArgs.join(' ') incorporates the value into a shell command without escaping.
  4. execSync passes the constructed string to the system shell.
  5. The shell interprets injected metacharacters and executes the attacker's additional command.
  6. The injected command runs with the same operating-system identity and privileges as the user or CI worker running the tests.

Impact Assessment

S ...[truncated 645 chars]

Remediation
View remediation

Remediation Suggestions

  • Do not construct a shell command by joining arguments into a string.

  • Invoke Node directly with execFileSync or spawnSync and pass each argument as a distinct array element:

    javascript
    import { execFileSync } from 'child_process';
    
    execFileSync(process.execPath, jestArgs, {
      stdio: 'inherit',
      cwd: __dirname,
      shell: false
    });
    
  • Reject unknown arguments rather than forwarding every unrecognized value.

  • If additional Jest options must be supported, define an explicit allowlist and validate each option's expected value.

  • Avoid relying on manual shell escaping, because escaping requirements vary across operating systems and shells.

  • Add regression tests containing semicolons, pipes, command substitution, redirection characters, spaces, and quotes to verify that they cannot trigger shell interpretation.

T09 · Insecure Skill Coding Practices

Error
Location
references/examples.md:204
Finding

Destructive Docker Cleanup Performed by an Unattended Scheduled Agent

Content
View full analysis

Vulnerability Details

File Location: references/examples.md, lines 204-216
Vulnerability Type: Unsafe destructive automation and excessive operational privileges
Risk Level: High

Vulnerable Code:

markdown
### Docker resource check

```markdown
---
interval: 6h
---

Run `docker system df` and `docker ps --format '{{.Names}} {{.Status}}'`.

- If disk usage > 80%, run `docker system prune -f` and log what was cleaned.
- If any container is in "Restarting" or "Exited" state, report it.

Append results to `docker-health.log` in this workspace.

Technical Analysis

The example changes a monitoring task into an unattended destructive maintenance operation. docker system prune -f removes unused Docker resources without an interactive confirmation prompt. The -f flag explicitly suppresses the safeguard that would otherwise require human approval.

The task is intended to run repeatedly every six hours through an AI agent. The decision to delete resources depends on the agent's interpretation of docker system df and the phrase “disk usage > 80%,” which does not precisely define the relevant filesystem, Docker category, or calculation. A parsing error, prompt confusion, or inaccurate inference could therefore trigger cleanup unexpectedly.

Docker access is itself highly privileged on many systems. Granting it to a recurring agent exceeds the minimum permissions needed to inspect and report resource usage.

Attack Path

  1. A user adopts the Docker health-check example and registers it as a recurring heartbeat.
  2. The scheduled agent receives access to the local Docker CLI and daemon.
  3. Docker output, environmental conditions, or inaccurate agent interpretation causes the usage threshold to be treated as exceeded.
  4. The agent runs docker system prune -f without requesting confirmation.
  5. Docker deletes resources considered unused at that moment.
  6. Operational data or r ...[truncated 879 chars]
Remediation
View remediation

Remediation Suggestions

  • Make the default heartbeat report excessive usage rather than delete resources.
  • Remove -f and require explicit human confirmation before cleanup.
  • Separate monitoring and maintenance into independently approved tasks.
  • If automatic cleanup is required, obtain explicit user opt-in and use narrowly scoped commands with documented exclusions.
  • Define the threshold calculation precisely, including the filesystem and Docker resource category being measured.
  • Generate and preserve a dry-run inventory of resources proposed for deletion.
  • Implement minimum-age filters and protected-resource labels where supported.
  • Run the heartbeat under an account without Docker access unless Docker inspection is essential.
  • Require approval before granting access to the Docker socket, because such access can have host-wide security implications.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:73
Finding

Unpinned Remote Source Is Downloaded and Built Locally

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 73-81
Vulnerability Type: Mutable remote dependency and unsafe source installation
Risk Level: Medium

Vulnerable Code:

markdown
- **Not found** → install via Homebrew:
  ```bash
  brew install t0dorakis/murmur/murmur
  ```
  If Homebrew isn't available, install from source:
  ```bash
  git clone https://github.com/t0dorakis/murmur.git
  cd murmur && bun install && bun run build
  # Then add ./murmur to PATH
  ```

Technical Analysis

The source-installation fallback clones the repository's current default branch rather than a reviewed release tag or immutable commit. It then immediately installs dependencies and executes the project's build script.

Consequently, the code executed by users can change after this Skill has been audited. A compromised upstream repository, malicious future commit, dependency compromise, or altered build script could execute arbitrary commands during bun install or bun run build.

The use of HTTPS protects transport integrity but does not establish that the downloaded revision is the one reviewed or intended by the user.

Attack Path

  1. Murmur is not installed and Homebrew is unavailable or not selected.
  2. The user follows the documented source-installation fallback.
  3. git clone downloads the repository's current default branch.
  4. An upstream compromise or unreviewed change supplies a malicious manifest, lifecycle hook, dependency, or build script.
  5. bun install or bun run build executes the changed code locally.
  6. The malicious code operates with the user's filesystem, environment, credential, and network privileges.

Impact Assessment

A successful supply-chain compromise could permit arbitrary code execution with the installing user's privileges. This may expose:

  • Source code and files available to the user.
  • Environment variables, package-re ...[truncated 388 chars]
Remediation
View remediation

Remediation Suggestions

  • Pin installation to a reviewed release tag and immutable commit hash.
  • Publish and verify cryptographic checksums or signed release artifacts.
  • Use a frozen lockfile mode so dependency resolution cannot silently change.
  • Document the expected commit and require verification before executing installation or build scripts.
  • Prefer signed package-manager releases over building the mutable default branch.
  • Review package lifecycle hooks and build scripts before execution.
  • Run source builds in an isolated environment without production credentials or unnecessary filesystem access.
  • Periodically re-audit the pinned release before updating the documented version.

T09 · Insecure Skill Coding Practices

Warning
Location
references/examples.md:11
Finding

Telegram Bot Credentials Are Embedded in Request URLs

Content
View full analysis

Vulnerability Details

File Location: references/examples.md, lines 11-12 and line 88
Vulnerability Type: Sensitive credential exposure through command-line URLs
Risk Level: Medium

Vulnerable Code:

markdown
- **Slack webhook**: `curl -X POST -H 'Content-Type: application/json' -d '{"text":"..."}' $SLACK_WEBHOOK_URL`
- **Telegram bot**: `curl -s "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" -d "chat_id=$CHAT_ID&text=..."`

A second example uses the same pattern:

markdown
- Send a Telegram message: `curl -s "https://api.telegram.org/bot{token}/sendMessage" -d "chat_id={id}&text=PR #{number} needs review: {title}"`

Technical Analysis

The Telegram Bot API format places the bot token in the URL path. Expanding $TELEGRAM_TOKEN directly in a curl command means the credential becomes part of the process argument list.

Command-line arguments may be observable through local process inspection, debugging output, shell tracing, CI logs, command audit facilities, crash diagnostics, or proxy and application URL logs. The use of curl -s suppresses transfer progress but does not prevent URL or process-argument disclosure.

The Skill correctly recommends storing secrets in .env; however, environment storage alone does not protect a token after it is expanded into a command-line URL.

Attack Path

  1. A scheduled heartbeat loads TELEGRAM_TOKEN from the workspace environment.
  2. The shell expands the variable into the URL before launching curl.
  3. The complete URL, including the bot token, appears in the curl process arguments.
  4. A local process-monitoring user, CI logger, command tracer, or diagnostic system records the argument.
  5. An attacker obtains the recorded token.
  6. The attacker submits Telegram Bot API requests using the compromised bot identity until the token is revoked.

Impact Assessment

Exposure of a Telegram bot token can allow a ...[truncated 572 chars]

Remediation
View remediation

Remediation Suggestions

  • Clearly warn that Telegram's URL-based token format can expose credentials through process arguments and logs.
  • Prefer a purpose-built Telegram client or library that minimizes command-line exposure.
  • Disable shell tracing and prevent command echoing when secret-bearing commands execute.
  • Ensure scheduler logs redact tokens and webhook URLs.
  • Run the delivery process in an isolated account so unrelated local users cannot inspect its processes.
  • Restrict .env permissions and exclude it from version control, backups, generated reports, and diagnostic bundles where appropriate.
  • Use dedicated, narrowly scoped bot tokens for each automation.
  • Document token rotation and immediate revocation procedures.
  • Never place literal bot tokens in generated HEARTBEAT.md files.

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:49
Finding

Recurring Agent Configuration Permits Permission Checks to Be Disabled and Sandbox Boundaries Removed

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 49-59
Vulnerability Type: Excessive privileges and permission-check bypass
Risk Level: Medium

Vulnerable Code:

yaml
# sandbox: workspace-write  # codex-specific: "read-only", "workspace-write", or "danger-full-access"
# networkAccess: false  # codex-specific: allow outbound network in workspace-write sandbox
# permissions: skip      # skip permission checks (only "skip" supported in frontmatter)

The associated notes state:

markdown
- `permissions: "skip"` is the only permissions value supported in frontmatter. For deny lists, use config.json.

Technical Analysis

The Skill documents danger-full-access and permissions: skip as valid recurring-agent settings without a mandatory risk warning, privilege justification, or separate user confirmation.

danger-full-access removes the workspace-focused containment expected for scheduled repository tasks. permissions: skip disables interactive permission safeguards. These settings are particularly risky for a persistent scheduler because each heartbeat may process changing repository content, web responses, issue bodies, API output, or other potentially untrusted data.

Most declared heartbeat purposes only require read access, scoped workspace writes, and access to specific network destinations. General filesystem access and skipped permission checks therefore exceed minimum privilege in ordinary use.

Attack Path

  1. A user or generated heartbeat selects danger-full-access or permissions: skip.
  2. The workspace is registered with Murmur and runs repeatedly.
  3. The agent consumes changing or attacker-influenced content, such as repository text, issue bodies, fetched pages, or API responses.
  4. That content causes or persuades the agent to perform an unsafe command or filesystem operation.
  5. Permission prompts do not stop the operation, or the unrestricted sandbox p ...[truncated 924 chars]
Remediation
View remediation

Remediation Suggestions

  • Default all generated heartbeats to read-only or workspace-write.
  • Do not generate permissions: skip or danger-full-access unless the user explicitly requests it after receiving a clear risk explanation.
  • Require separate confirmation immediately before testing or registering a heartbeat with elevated settings.
  • Document the exact operations that require elevation and reject elevation when a narrower configuration is sufficient.
  • Keep outbound network access disabled by default and allowlist only required destinations where the runtime supports it.
  • Use a dedicated low-privilege operating-system account for Murmur.
  • Add permission deny lists for sensitive paths and commands.
  • Prevent scheduled agents from reading .ssh, cloud credentials, shell configuration, password stores, and unrelated workspaces.
  • Reconfirm elevated permissions when the heartbeat prompt or workspace changes.
  • Record elevated actions in tamper-resistant audit logs without recording secrets.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (46)

YARA rule 'agent_skill_credential_exfiltration_webhook': AI agent skill credential harvesting followed by webhook or external exfiltration [agent_skills]

Critical
Category
YARA Match
Confidence
85% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · tests/e2e/complete-workflow.test.js (reported line 45)May include surrounding context.

js
ulation
      const interview = {
        goal: 'Auto-triage incoming GitHub issues',
        details: {
          repo: 'myorg/myrepo',
          tools: ['gh CLI'],
          schedule: { type: 'interval', value: '30m' },
          timeout: '10m'
        },
        delivery: {
          type: 'slack',
          webhookEnv: 'SLACK_WEBHOOK_URL'
        },
        credentials: ['SLACK_WEBHOOK_URL', 'GITHUB_TOKEN']
      };
      
      // Step 2: Generate heartbeat
      const heartbeatContent = `---
interval: ${interview.details.schedule.value}
timeout: ${interview.details.timeout}
agent: claude-code
name: Issue Triage Bot
description: Auto-label and triage GitHub issues
---

Check for new unlabeled issues on ${interview.details.repo}:
\`gh issue list --state open --json number,title,body,labels --jq '.[] | select(.labels | length == 0)'\`

For each unlabeled issue:
1. Read title and body
2. Determine category: bug, feature, question, or security
3. Apply label: \`gh issue edit {number}

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose is centered on configuring recurring automated actions for the murmur scheduler. The supplied code instead implements UI navigation for code coverage pages: it selects missing-coverage elements in the DOM, tracks the current selection, scrolls to matches, and responds to key presses like n/j/k/p/b. This is a materially different primary purpose and unrelated behavior, with no evidence of heartbeat file generation, prompt refinement, scheduler integration, or recurring task setup.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose concerns interviewing the user, drafting HEARTBEAT.md files, testing prompts, and registering recurring jobs with a scheduler for the murmur CLI daemon. The supplied code does none of that. Instead, it is unrelated browser-side JavaScript for navigating an lcov HTML coverage report using keyboard shortcuts. This is a materially different primary purpose and unrelated functionality, so the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

There is a clear mismatch between the declared purpose and the actual code. The description claims functionality related to configuring recurring scheduled prompts for the murmur CLI daemon, including drafting HEARTBEAT.md files and registering scheduled jobs. However, the code is an unrelated front-end JavaScript asset from a coverage report (prettify.js) implementing code syntax highlighting and pretty printing in the browser. It does not interact with murmur, cron, HEARTBEAT.md files, scheduling, Claude prompts, or any automation workflow. Its primary purpose is entirely different from the declared description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about configuring recurring scheduled actions for the murmur CLI daemon, including creating HEARTBEAT.md files and registering jobs. The supplied code instead operates entirely in a web page context, querying DOM elements, attaching event listeners, and enabling sorting/filtering for a coverage summary table. It does not interact with murmur, cron, HEARTBEAT.md files, prompts, schedulers, or any automation setup. This is a clear primary-purpose mismatch, not just an implementation detail difference.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about configuring recurring scheduled prompts for a CLI daemon called murmur. The actual code does nothing related to HEARTBEAT.md generation, user interviews, scheduler registration, cron/interval automation, or daemon/task management. Instead, it is a client-side code prettifier that parses source text and applies syntax-highlighting spans and line numbers in HTML. This is a materially different primary purpose and unrelated functionality, so the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about configuring recurring automated prompts for a daemon named murmur, including generating heartbeat configuration files and registering scheduled tasks. The supplied code does none of that. It is unrelated front-end code for enhancing a coverage summary HTML table with sorting and search/filter behavior. Its primary purpose, resources accessed (DOM elements in a coverage report), and triggers (window load, table header clicks, search input) are materially different from the declared purpose. This is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose centers on a user-facing skill for setting up recurring murmur tasks: interviewing the user, drafting HEARTBEAT.md files, testing them, and registering them with the scheduler. The actual code does none of that. It is purely a test suite for validating documentation examples in references/examples.md and checking helper-based validation of sample frontmatter. While the subject matter is related to murmur heartbeats and schedules, the primary behavior is materially different: documentation QA/testing rather than heartbeat creation or scheduler registration. Therefore this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description is about an end-user workflow for interviewing, drafting HEARTBEAT.md files, testing them with murmur, and registering scheduled actions. The supplied code does not implement that workflow. Instead, it is a developer utility for test reporting: it invokes Jest, parses coverage output, and generates a markdown test report. While the report content references heartbeat/murmur concepts, the code’s primary purpose is unrelated to creating or registering heartbeats. This is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared purpose is centered on configuring recurring automated actions for murmur by creating HEARTBEAT.md files and registering scheduled prompts. The actual code does none of that. It is purely a generic test runner for a JavaScript project, dispatching Jest test commands based on CLI flags. This is a materially different primary purpose and includes unrelated capabilities (test selection, coverage reporting, watch mode). Therefore the description does not accurately represent the supplied code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description is about user-facing workflow for configuring recurring automated actions in murmur, including drafting heartbeat files and registering scheduled prompts. The actual code chunk does not implement any of that functionality. Instead, it only prepares a JavaScript test environment for heartbeat-cron tests by setting globals and mocking console methods. This is a materially different primary purpose from the declared skill behavior, so it is a mismatch.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==3.14.2 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

js-yaml 3.14.2 is present and has known CPU-exhaustion issues when parsing crafted YAML with merge keys or omap structures. Even though it is nested under test tooling, any workflow that parses untrusted YAML in tests, fixtures, or CI could be forced into denial of service.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
96% confidence
Finding

brace-expansion 1.1.12 is a real vulnerable version with multiple denial-of-service conditions involving pathological brace patterns. Because it is used transitively in globbing/matching libraries inside the test toolchain, attacker-controlled patterns in CI or test inputs could hang or exhaust memory.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
90% confidence
Finding

browserslist 4.28.1 is present and reportedly vulnerable to crashes, prototype writes, and memory growth when handling untrusted stats/query inputs. In this repository context it is part of development tooling, which reduces direct production exposure but still leaves CI/build processes susceptible to denial of service or unsafe object mutation if untrusted configuration is consumed.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==4.1.1 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

js-yaml 4.1.1 is also present and affected by CPU-consumption issues on crafted YAML documents. Since this skill relates to automation and scheduled tasks, test or validation code that ingests user-provided YAML could repeatedly trigger resource exhaustion in CI or local tooling, though this remains a dev/test-scope issue in the provided file.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: picomatch==2.3.1 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
94% confidence
Finding

picomatch 2.3.1 is a vulnerable version with reported method-injection and ReDoS issues tied to crafted glob patterns. Because glob-style matching is common in test and build systems, untrusted patterns could cause incorrect matching behavior or excessive CPU use, especially in automated scheduled workflows that may run unattended.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill explicitly instructs the agent to run shell commands such as which murmur, brew install, git clone, bun install, murmur init, and murmur beat, but it does not declare any tool scope or allowed-tools constraints. In a skill that performs installation, testing, and scheduler registration, missing tool scoping increases the chance of over-broad command execution and weakens reviewability of what the skill is permitted to do.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
88% confidence
Finding

The core purpose of the skill is to create recurring automated runs, and it also supports session reuse (session: my-session) and persistent state files in the workspace. Persistence is not inherently malicious, but in a scheduler context it amplifies the effect of any harmful prompt, credential misuse, or unintended command because it can recur without fresh human review.

Content

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

md
---
name: heartbeat-cron
description: >
  Create and refine HEARTBEAT.md files for murmur — a CLI daemon that runs
  scheduled Claude prompts on a cron or interval schedule. Use this skill when
  the user wants to set up a recurring automated action (e.g., "monitor my
  GitHub issues", "check Hacker News for AI articles", "watch my endpoints",

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger list includes broad terms such as monitor, watch, and automate, which are common in ordinary conversations and can cause accidental invocation. Because this skill can lead to command execution, software installation, workspace modification, and registration of persistent scheduled tasks, unintended activation materially raises risk.

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 · references/examples.md (reported line 11)May include surrounding context.

md
Every heartbeat that produces output needs a destination. Common patterns:

- **Slack webhook**: `curl -X POST -H 'Content-Type: application/json' -d '{"text":"..."}' $SLACK_WEBHOOK_URL`
- **Telegram bot**: `curl -s "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" -d "chat_id=$CHAT_ID&text=..."`
- **Append to local file**: Write findings to a markdown file in the workspace
- **GitHub issue/comment**: Use `gh issue create` or `gh issue comment`

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The Docker resource check example instructs the agent to run docker system prune -f automatically when disk usage exceeds a threshold. That is a destructive cleanup action that can delete unused images, networks, build cache, and stopped containers, creating risk of unintended data loss or service disruption if users copy the example without understanding the consequences.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The example includes a destructive cleanup command without an explicit warning in nearby text that it may remove Docker resources automatically. In a skill designed to help users draft scheduled automations, omission of that warning increases the chance that users will deploy unattended destructive behavior they did not fully evaluate.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · tests/e2e/complete-workflow.test.js (reported line 66)May include surrounding context.

js
3. Apply label: \`gh issue edit {number} --add-label {category}\`

If security issue detected, notify via Slack:
\`curl -X POST -H 'Content-Type: application/json' -d '{"text":"🚨 Security issue #{number}: {title}"}' $${interview.delivery.webhookEnv}\`

Respond HEARTBEAT_OK if no unlabeled issues.`;

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 · tests/e2e/complete-workflow.test.js (reported line 113)May include surrounding context.

js
goal: 'Monitor API endpoint uptime and latency',
        details: {
          endpoints: [
            'https://api.example.com/health',
            'https://api.example.com/status'
          ],
          schedule: { type: 'interval', value: '15m' },

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 · tests/e2e/complete-workflow.test.js (reported line 114)May include surrounding context.

js
goal: 'Monitor API endpoint uptime and latency',
        details: {
          endpoints: [
            'https://api.example.com/health',
            'https://api.example.com/status'
          ],
          schedule: { type: 'interval', value: '15m' },

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
tests/generate-report.js:24

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
tests/run-tests.js:28