Back to skill

Security audit

Turf Skills

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed Turf.js geospatial CLI skill with broad routing language but no evidence of hidden, destructive, exfiltrating, or persistence behavior beyond normal installation.

Install this only if you want an agent to run a local Turf.js CLI for geospatial calculations. Be aware that it can read GeoJSON files and overwrite an output file path when you ask it to, and its trigger wording may make agents prefer it for broad geography or coordinate-related requests.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (56)

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · CONTRIBUTING.md (reported line 100)May include surrounding context.

});

text

3. **Update SKILL.md** 更新 SKILL.md 文档

在相应的类别下添加新操作的文档,包括:

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The description claims a comprehensive Turf.js-based geospatial skill covering 60+ operations across multiple categories and instructs immediate use for any spatial or GeoJSON task. However, the provided code chunk exposes only two functions: clustersKmeans and clustersDbscan. Those functions do align with the clustering portion of the description, but they do not support the much broader stated primary purpose. This is a material description-to-behavior mismatch because the declared scope and triggers imply a general-purpose geospatial toolkit, while the actual code shown is a narrow clustering module.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description advertises a comprehensive geospatial analysis skill covering 60+ Turf.js operations across measurement, query, transformation, grid, and analysis categories. The supplied code chunk does not implement those behaviors; it only wraps basic Turf constructors for GeoJSON features plus random feature generation. While these helpers are geospatially related and consistent with a subset of the declared data-creation category, the actual behavior is far narrower than the declared primary purpose. This is a material description-behavior mismatch due to substantial overstatement of supported capabilities.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

There is a clear description-to-behavior mismatch. The declared purpose presents the skill as a broad, default geospatial toolbox for virtually all Turf.js-based spatial operations, including querying, transformation, grid creation, clustering, and GeoJSON processing. However, the supplied code chunk is narrowly scoped to measurement and basic geometric summary utilities. While the implemented functions are consistent with part of the description, the actual behavior shown here does not substantiate the much broader claimed capabilities. This is an overbroad description relative to the supplied code chunk's functionality.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a comprehensive geospatial analysis tool and strongly claims it should be used for many Turf.js-powered spatial tasks. However, the supplied code only provides helper functions for parsing JSON/GeoJSON strings, reading inputs from files or arguments, converting numbers, and writing results. There is no implementation of measurement, spatial predicates, geometry transformation, grid generation, clustering, projections, or any other geographic computation. The code’s primary purpose is generic parser and file/console IO support, which is materially different from the declared geospatial-analysis behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description claims this is the default/preferred tool for all geography-related tasks and explicitly lists a very wide set of capabilities across six categories, implying broad coverage. However, the provided code chunk implements only a narrower transformation-focused subset of Turf.js functions. There is no evidence in this chunk of the many advertised measurement, query, grid, clustering, and projection features. This is therefore a description-behavior mismatch due to significant overstatement of available capabilities in the supplied code. There is no sign of unrelated or suspicious extra behavior; the issue is that the actual implemented scope is materially narrower than declared.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill instructs the agent to 'ALWAYS use this skill immediately' for very broad geography-related requests, which can override normal tool-selection judgment and cause unintended invocation. In an agentic environment, overbroad auto-triggering increases the chance of processing untrusted inputs, unnecessary file access, or taking actions when a simpler non-tool response would be safer.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The catch-all trigger 'Any task mentioning GeoJSON, lat/lng, coordinates, GPS points' is too vague and can activate on incidental mentions rather than genuine requests to perform geospatial computation. That broad matching can cause tool misuse, accidental data handling, or prompt-routing errors that degrade safety boundaries.

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The common-keyword list includes highly generic words like 'map', 'geometry', 'point', 'line', 'location', and 'distance', which are likely to appear in ordinary conversation outside intended geospatial tasks. In a tool-calling agent, such broad lexical triggers can hijack routing and increase the chance of unsafe or unnecessary command execution.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 38)May include surrounding context.

md
## Features

| Category       | Actions                                                                                                                                                                                    |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Measurement    | distance, area, length, bearing, destination, midpoint, center, centroid, centerOfMass, along, bbox, bboxPolygon, envelope                                                                 |
| Query          | booleanPointInPolygon, booleanContains, booleanCrosses, booleanDisjoint, booleanEqual, booleanIntersects, booleanOverlap, booleanWithin, booleanParallel, booleanPointOnLine, nearestPoint |

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.zh-CN.md (reported line 20)May include surrounding context.

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.zh-CN.md (reported line 20)May include surrounding context.

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

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 · README.md (reported line 24)May include surrounding context.

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

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 · README.zh-CN.md (reported line 20)May include surrounding context.

cd turf-skills && npm install && npm link

安装为技能

mkdir -p ~/.claude/skills/turf-skills ln -s $(which turf-skills) ~/.claude/skills/turf-skills/ cp SKILL.md ~/.claude/skills/turf-skills/

text

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.zh-CN.md (reported line 34)May include surrounding context.

md
## 功能

| 分类      | 操作                                                                                                                                                                                       |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 测量      | distance, area, length, bearing, destination, midpoint, center, centroid, centerOfMass, along, bbox, bboxPolygon, envelope                                                                 |
| 空间查询  | booleanPointInPolygon, booleanContains, booleanCrosses, booleanDisjoint, booleanEqual, booleanIntersects, booleanOverlap, booleanWithin, booleanParallel, booleanPointOnLine, nearestPoint |

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 44)May include surrounding context.

md
| 空间查询  | booleanPointInPolygon, booleanContains, booleanCrosses, booleanDisjoint, booleanEqual, booleanIntersects, booleanOverlap, booleanWithin, booleanParallel, booleanPointOnLine, nearestPoint |
| 变换      | buffer, union, intersect, difference, simplify, convex, concave, dissolve, voronoi, tin, bezierSpline, transformRotate, transformScale, transformTranslate                                 |
| 创建      | point, lineString, polygon, multiPoint, multiLineString, multiPolygon, featureCollection, randomPoint, randomLineString, randomPolygon                                                     |
| 插值/网格 | interpolate, isobands, isolines, hexGrid, pointGrid, squareGrid, triangleGrid                                                                                                              |
| 聚类      | clustersKmeans, clustersDbscan                                                                                                                                                             |

## 示例

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.zh-CN.md (reported line 40)May include surrounding context.

md
| 空间查询  | booleanPointInPolygon, booleanContains, booleanCrosses, booleanDisjoint, booleanEqual, booleanIntersects, booleanOverlap, booleanWithin, booleanParallel, booleanPointOnLine, nearestPoint |
| 变换      | buffer, union, intersect, difference, simplify, convex, concave, dissolve, voronoi, tin, bezierSpline, transformRotate, transformScale, transformTranslate                                 |
| 创建      | point, lineString, polygon, multiPoint, multiLineString, multiPolygon, featureCollection, randomPoint, randomLineString, randomPolygon                                                     |
| 插值/网格 | interpolate, isobands, isolines, hexGrid, pointGrid, squareGrid, triangleGrid                                                                                                              |
| 聚类      | clustersKmeans, clustersDbscan                                                                                                                                                             |

## 示例

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 45)May include surrounding context.

md
| 变换      | buffer, union, intersect, difference, simplify, convex, concave, dissolve, voronoi, tin, bezierSpline, transformRotate, transformScale, transformTranslate                                 |
| 创建      | point, lineString, polygon, multiPoint, multiLineString, multiPolygon, featureCollection, randomPoint, randomLineString, randomPolygon                                                     |
| 插值/网格 | interpolate, isobands, isolines, hexGrid, pointGrid, squareGrid, triangleGrid                                                                                                              |
| 聚类      | clustersKmeans, clustersDbscan                                                                                                                                                             |

## 示例

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.zh-CN.md (reported line 41)May include surrounding context.

md
| 变换      | buffer, union, intersect, difference, simplify, convex, concave, dissolve, voronoi, tin, bezierSpline, transformRotate, transformScale, transformTranslate                                 |
| 创建      | point, lineString, polygon, multiPoint, multiLineString, multiPolygon, featureCollection, randomPoint, randomLineString, randomPolygon                                                     |
| 插值/网格 | interpolate, isobands, isolines, hexGrid, pointGrid, squareGrid, triangleGrid                                                                                                              |
| 聚类      | clustersKmeans, clustersDbscan                                                                                                                                                             |

## 示例

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 150)May include surrounding context.

md
安装为 Claude Code 技能后,可以直接用自然语言描述需求,Claude 会自动转换为对应的 turf-skills 命令。

| 你说                                                        | Claude 执行                                                                                                                                                                        |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "计算北京到上海的距离"                                      | `turf-skills --action distance --input '{"type":"Point","coordinates":[116.397428,39.90923]}' --input2 '{"type":"Point","coordinates":[121.473701,31.230416]}' --units kilometers` |
| "天安门是否在这个多边形内?"                                | `turf-skills --action booleanPointInPolygon --input '...' --input2 '...'`                                                                                                          |

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.zh-CN.md (reported line 146)May include surrounding context.

md
安装为 Claude Code 技能后,可以直接用自然语言描述需求,Claude 会自动转换为对应的 turf-skills 命令。

| 你说                                                        | Claude 执行                                                                                                                                                                        |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "计算北京到上海的距离"                                      | `turf-skills --action distance --input '{"type":"Point","coordinates":[116.397428,39.90923]}' --input2 '{"type":"Point","coordinates":[121.473701,31.230416]}' --units kilometers` |
| "天安门是否在这个多边形内?"                                | `turf-skills --action booleanPointInPolygon --input '...' --input2 '...'`                                                                                                          |

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 153)May include surrounding context.

md
| 你说                                                        | Claude 执行                                                                                                                                                                        |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "计算北京到上海的距离"                                      | `turf-skills --action distance --input '{"type":"Point","coordinates":[116.397428,39.90923]}' --input2 '{"type":"Point","coordinates":[121.473701,31.230416]}' --units kilometers` |
| "天安门是否在这个多边形内?"                                | `turf-skills --action booleanPointInPolygon --input '...' --input2 '...'`                                                                                                          |
| "给这个点创建 5 公里缓冲区"                                 | `turf-skills --action buffer --input '...' --radius 5 --units kilometers`                                                                                                          |
| "对 points.geojson 中的点集计算凸包,保存到 result.geojson" | `turf-skills --action convex --file points.geojson --output result.geojson`                                                                                                        |
| "计算 polygon.geojson 的面积"                               | `turf-skills --action area --file polygon.geojson`                                                                                                                                 |

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · README.md (reported line 154)May include surrounding context.

md
| 你说                                                        | Claude 执行                                                                                                                                                                        |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "计算北京到上海的距离"                                      | `turf-skills --action distance --input '{"type":"Point","coordinates":[116.397428,39.90923]}' --input2 '{"type":"Point","coordinates":[121.473701,31.230416]}' --units kilometers` |
| "天安门是否在这个多边形内?"                                | `turf-skills --action booleanPointInPolygon --input '...' --input2 '...'`                                                                                                          |
| "给这个点创建 5 公里缓冲区"                                 | `turf-skills --action buffer --input '...' --radius 5 --units kilometers`                                                                                                          |
| "对 points.geojson 中的点集计算凸包,保存到 result.geojson" | `turf-skills --action convex --file points.geojson --output result.geojson`                                                                                                        |
| "计算 polygon.geojson 的面积"                               | `turf-skills --action area --file polygon.geojson`                                                                                                                                 |

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
test/test.js:13