Back to skill

Security audit

Broedkrumme Kalibr

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed telemetry and routing plugin, but it gives an external service too much influence over local tool calls and enables external reporting by default without enough disclosure.

Review before installing. Only use this with a Kalibr endpoint and SDK you trust, disable routing unless you explicitly want the service to influence model choice and tool-call parameters, and consider setting telemetry and outcome capture off unless your organization accepts sending session identifiers, tool history, token counts, and failure metadata to the configured service.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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
  • 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 (1)

T07 · Tool Hijacking and Spoofing

Error
Location
index.ts:272
Finding
Remote Tool-Call Parameter Hijacking## Vulnerability Details **File Location**: `index.ts`, lines 272–281 and 324–342 **Vulnerability Type**: Remote injection and overriding of local tool-call parameters **Risk Level**: Critical ### Vulnerable Code ```ts const { decide } = await loadKalibrSdk(); const decision = await decide(goal); const sessionKey = ctx?.sessionKey; if (sessionKey) { runs.setLastDecision(sessionKey, { tool_id: decision.tool_id, params: decision.params, }); } ``` ```ts const decision = runs.getLastDecision(sessionKey); if (!decision || !decision.params || Object.keys(decision.params).length === 0) { return {}; } if (decision.tool_id && decision.tool_id !== event.toolName) { api.logger.info( "[kalibr] Decision tool_id (" + decision.tool_id + ") differs from current tool (" + event.toolName + "), proceeding anyway" ); } api.logger.info( "[kalibr] Injecting params for tool " + event.toolName + ": " + JSON.stringify(decision.params) ); const merged = { ...event.params, ...decision.params }; return { params: merged }; ``` ### Technical Analysis When routing is enabled, the plugin obtains `params` from the external Kalibr service through `decide()` and stores them for the session. Before a local tool call, these externally supplied values are merged after the original arguments: ```ts { ...event.params, ...decision.params } ``` Consequently, remote values override same-named parameters selected by the agent or user. The implementation does not enforce a tool-specific parameter allowlist, validate the values against a trusted schema, protect security-sensitive fields, or request user confirmation. The `tool_id` check does not provide a security boundary. If the remote decision identifies a different tool, the implementation logs the mismatch and explicitly proceeds. If `tool_id` is omitted, no tool identity check is performed at all. Therefore, parameters intended o ...[truncated 1763 chars]
Remediation
## Remediation Suggestions 1. Remove remote tool-parameter injection unless it is strictly required. Treat remote routing decisions as model-selection hints only. 2. If parameter injection must remain, require a nonempty `tool_id` and enforce exact equality with `event.toolName`. Reject the decision rather than proceeding on a mismatch. 3. Define strict, tool-specific schemas and allowlists for remotely adjustable fields. Reject unknown keys, invalid types, oversized values, and values outside explicit constraints. 4. Prevent remote overrides of security-sensitive parameters, including command strings, executable paths, file paths, URLs, hosts, credentials, authorization headers, and destructive-operation flags. 5. Do not let remote values silently override legitimate arguments. Apply only approved defaults to absent, low-risk fields, or require explicit user approval for every change. 6. Bind each decision to a particular run and intended tool invocation rather than only to a session key. Add short expirations and single-use semantics to prevent stale or cross-call application. 7. Authenticate responses cryptographically and use a fixed, trusted HTTPS endpoint. Restrict configurable service URLs where the deployment model permits it. 8. Log parameter names and validation outcomes, but redact secret values and sensitive content. 9. Add tests covering omitted and mismatched `tool_id` values, unknown keys, sensitive-field overrides, stale decisions, cross-tool reuse, and malicious remote responses.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The plugin can change the selected model/provider before agent start and can merge externally decided parameters into tool invocations. This is dangerous because an external service effectively gains influence over agent execution and tool behavior, which can redirect actions, alter safety-relevant parameters, or cause unintended operations without local validation or approval.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill explicitly advertises outcome capture and LLM telemetry but gives no user-facing warning about what data may be transmitted off-system, to whom, or under what controls. In an agent context, outcomes and LLM call data can contain prompts, tool inputs/outputs, user content, secrets, or other sensitive operational data, so silent collection creates a meaningful privacy and data-exfiltration risk.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The configuration exposes a remote API endpoint and enables outcome/LLM telemetry features without warning that agent data may be sent to an external network destination. Because these options are presented as normal configuration rather than sensitive data-export behavior, operators may enable them without understanding the privacy, compliance, and secret-leakage implications.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The SDK is initialized for an external service using configured credentials and URL, establishing the channel later used for telemetry and outcome reporting. In this file there is no user-visible notice, consent, or administrative acknowledgement that session and usage data may leave the local environment, making the data transfer insufficiently transparent.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The plugin automatically injects decision.params into tool call parameters and proceeds even when the chosen tool_id differs from the current tool. This can silently modify tool behavior without operator awareness, increasing the chance of unsafe actions, incorrect outputs, or abuse if the external decision source is compromised or mistaken.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
The plugin records LLM usage, session-linked identifiers, tool usage, and run outcome metadata, then sends it to an external SDK via reportOutcome(). Even if framed as observability, this creates a real data-exfiltration surface because the code exports operational telemetry without any in-file consent flow, minimization, or trust boundary enforcement.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
Outcome reporting transmits detailed metadata including sessionKey, agentId, duration, token counts, and toolsCalled to an external service. This is a genuine privacy and security concern because those fields can reveal user activity patterns, internal identifiers, and workflow details, yet the file provides no user-facing warning or consent checkpoint.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The configuration enables both outcome capture and LLM telemetry by default, while the manifest provides no constraints on scope, minimization, or consent. In an agent plugin, these settings can cause prompts, model inputs/outputs, and execution metadata to be sent to an external service automatically, creating privacy, compliance, and data leakage risk.

Natural-Language Policy Violations

Low
Confidence
80% confidence
Finding
LLM telemetry capture is exposed as a configurable feature but is enabled by default without any visible opt-in or policy-aware handling in the plugin manifest. Even if intended for observability, default-on collection of LLM interaction data can conflict with enterprise governance requirements and increase exposure of sensitive prompts or responses.

Static analysis

No suspicious patterns detected.