Back to skill

Security audit

meeting-score

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its meeting-scoring purpose, but it can start an unbounded background polling job that keeps reading and updating Feishu tables after the meeting unless manually stopped.

Install only if you are comfortable giving the agent Feishu Bitable access for the specific meeting tables. Avoid or closely supervise the automatic calculation mode unless you can verify the cron task has a clear stop path; manually stop it after the meeting and confirm it is disabled. Review any field or record deletion targets before initialization.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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)

T06 · System Persistence

Error
Location
SKILL.md:251
Finding
Unbounded Recurring Background Task Creates Cross-Session Persistence## Vulnerability Details **File Location**: `SKILL.md`, lines 251-289 **Vulnerability Type**: Persistent scheduled task **Risk Level**: High ### Vulnerable Code Snippet ```text When the host says “start automatic calculation” or “monitor scoring,” use the `cron` tool to create a scheduled task: Task name: meeting-score-{app_token}-calculation Schedule: execute every 0.5 minutes (everyMs: 30000) Target: isolated session ``` The scheduled task is instructed to perform the following operations: ```text 1. Use feishu_bitable_list_records to read all records in the scoring-record table 2. For each record whose three dimensions are filled and whose subtotal or scoring time is empty: - Calculate the subtotal - Use feishu_bitable_update_record to write the subtotal and scoring time 3. Group records by agenda name and calculate averages 4. Use feishu_bitable_update_record to write averages to the agenda table 5. Mark an agenda as completed when all reviewers have scored it 6. If all agendas are completed, send a Feishu message to the host ``` Cleanup relies on later manual action: ```text When the host says “stop automatic calculation,” use the `cron` tool to disable the corresponding task. - After starting automatic calculation, record the task jobId for later stopping - It is recommended to manually stop automatic calculation after the meeting to avoid wasting resources ``` ### Technical Analysis The Skill directs the agent to create a recurring cron task that executes every 30 seconds in an isolated session. This task survives the initiating interaction and repeatedly reads and modifies Feishu Bitable data. It may also send messages through Feishu. The task has no defined expiration time, maximum execution count, or mandatory automatic deletion condition. Even when all agenda items are complete, the instructions only require sending a notification; they do not require disabling or deleting the cron task. Cleanup therefore depends on the host issuing ...[truncated 1831 chars]
Remediation
## Remediation Suggestions 1. Prefer explicit, foreground recalculation initiated by an authorized host instead of creating a persistent scheduled task. 2. If polling is required, obtain explicit confirmation that clearly states the interval, affected tables, duration, and background nature of the task. 3. Add a mandatory expiration time and maximum execution count when the task is created. 4. Automatically disable and delete the cron task immediately after all agenda items reach the completed state. 5. Add an inactivity timeout so the task terminates if no scoring changes are detected for a defined period. 6. Persist the job ID in a reliable, scoped state store and verify that it belongs to the expected meeting before stopping or modifying it. 7. Make every execution idempotent and use version or timestamp checks to avoid overwriting newer records. 8. Restrict the task credentials to only the required Feishu tables and operations. 9. Provide the host with visible task status, expiration time, and a reliable cancellation mechanism. 10. Log task creation, execution, data mutations, notification attempts, and cleanup for auditability.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (7)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- 小计(数字)
   - 备注(文本)

   > ⚠️ **注意**:评分记录表创建后,系统默认的「多行文本」主键字段保留(用于显示),其余默认生成的「单选」「日期」「附件」字段需删除,调用 DELETE /fields/{field_id} 清理。

   > ⚠️ **注意**:飞书多维表格创建后默认会生成若干空白行以及「单选」「日期」「附件」等默认字段,初始化时需要:
   > 1. 删除默认多余字段(单选/日期/附件):逐个调用 DELETE /fields/{field_id}
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- 小计(数字)
   - 备注(文本)

   > ⚠️ **注意**:评分记录表创建后,系统默认的「多行文本」主键字段保留(用于显示),其余默认生成的「单选」「日期」「附件」字段需删除,调用 DELETE /fields/{field_id} 清理。

   > ⚠️ **注意**:飞书多维表格创建后默认会生成若干空白行以及「单选」「日期」「附件」等默认字段,初始化时需要:
   > 1. 删除默认多余字段(单选/日期/附件):逐个调用 DELETE /fields/{field_id}
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
> ⚠️ **注意**:飞书多维表格创建后默认会生成若干空白行以及「单选」「日期」「附件」等默认字段,初始化时需要:
   > 1. 删除默认多余字段(单选/日期/附件):逐个调用 DELETE /fields/{field_id}
   > 2. 删除默认空白行:读取所有记录后逐条调用 DELETE /records/{record_id} 删除主键为空的行
   > 两步操作确保表格整洁,只保留业务所需字段和数据。

   > 💡 **维度名自定义说明**:主持人在初始化时可指定三个维度的实际名称,例如:
Confidence
80% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Vague Triggers

Medium
Confidence
92% confidence
Finding
L051 写明“当主持人说‘创建评分表’、‘新建会议评分’或提供议题信息时执行”,其中“提供议题信息”过于宽泛,没有限定必须同时包含哪些字段或处于什么上下文,容易与普通会议讨论混淆。该描述也缺少负例或排除条件,无法清楚区分何时应激活、何时不应激活。

Vague Triggers

Medium
Confidence
95% confidence
Finding
L234-L238 的触发关键词中包含“开始评分”“生成报告”“评分结果”等较通用表述,这些短语可能出现在普通对话中,不足以唯一标识该技能应被调用。列表也未说明必须由主持人/评委在何种上下文下使用,缺少范围限制和排除条件。

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The skill introduces a persistent cron-based polling job that repeatedly reads and writes meeting data in the background. While this supports the scoring workflow, it expands capability beyond a single user-triggered action and can continue operating after the user no longer expects it, increasing risk of unintended data access, excessive API use, and unintended notifications.

Natural-Language Policy Violations

Low
Confidence
87% confidence
Finding
L003 的描述全文以中文固定呈现,且文档中的触发词、返回消息和操作说明均默认中文,没有说明是否支持用户选择其他语言。根据语言/区域策略,若无用户选择或明确地域限定,强制单一语言可能构成自然语言政策问题。

Static analysis

No suspicious patterns detected.