Back to skill

Security audit

Recruitment Agent

Security checks for vulnerabilities and agentic risk

Overview

This recruitment skill is not malicious, but it should be reviewed because it can read candidate messages and resumes, change recruiting records, contact candidates, create calendar events, and run an unbounded recurring polling task.

Review before installing. Use it only with authorized recruiting accounts, add explicit confirmation before saving or updating records, sending candidate messages, creating calendar events, or starting polling, and bound heartbeat jobs with expiration, ownership tracking, and reliable cancellation.

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
references/heartbeat_task.md:7
Finding

Unbounded Recurring Task Persistently Polls Candidate Communications

Content
View full analysis

Vulnerability Details

File Location: references/heartbeat_task.md, lines 7–18 and 29–37; references/workflow-schedule-interview.md, lines 48–56
Vulnerability Type: Unbounded cross-session scheduled task
Risk Level: High

Vulnerable Code

markdown
## 创建心跳任务

使用 **CronCreate 工具**:

- **cron**: `*/30 * * * *`
- **recurring**: `true`
- **prompt**:

用 opencli boss chatmsg 查看最新消息,判断 <候选人姓名> 是否有新回复。 如有实质性回复(同意/拒绝/给出时间)则执行约面试流程 Step 5: 查看日程,然后直接在当前对话中告知用户候选人的回复内容,并提供 2-3 个候选时间请用户确认。 否则静默等待。

text
markdown
## 终止心跳任务

面试约好后,执行:

CronDelete <job_id>

text

→ job_id 通过 CronList 查询获得。

The interview workflow independently instructs creation of the same persistent task:

markdown
### Step 4:启动 30 分钟心跳检测

执行以下指令创建定时任务,每 30 分钟检查候选人是否回复:

> 使用 CronCreate 工具,cron 表达式 `*/30 * * * *`,prompt 内容:
>
> "用 opencli boss chatmsg `<uid>` 查看最新消息,判断候选人是否有新回复。如果有明确的回复(同意/拒绝/给出时间),执行约面试流程的 Step 5。如果无新回复,静默等待下次检查。"

Technical Analysis

The Skill directs the agent to install a recurring Cron task that survives the initiating interaction and invokes authenticated Boss Zhipin access every 30 minutes. The task has no expiration time, maximum retry count, or general cleanup handler.

The only documented deletion condition is after an interview has successfully been scheduled. Cleanup is not specified when:

  • The candidate refuses the interview.
  • The candidate never responds.
  • The user cancels or abandons the process.
  • A command or workflow step fails.
  • The task reaches a reasonable timeout.
  • The candidate gives a substantive response that does not result in a scheduled interview.

The workflow also retrieves the task identifier through a global CronList operation rather than requiring the job_id returned by CronCreate to be stored against the specific candidate and workflow. This can make reliable ownership and deletion difficult when several tasks are active.

Because the scheduled prompt accesses an authenticated co ...[truncated 1672 chars]

Remediation
View remediation

Remediation Suggestions

  1. Bound the task lifetime

    • Set a strict expiration, such as 24–48 hours.
    • Enforce a maximum number of polling attempts.
    • Prefer a scheduler that supports automatic expiration.
  2. Implement complete cleanup

    • Delete the task when the candidate accepts, rejects, or provides a conclusive response.
    • Delete it when the user cancels the workflow.
    • Delete it after timeout, unrecoverable errors, or successful scheduling.
    • Use a finally-style cleanup path where supported.
  3. Track task ownership

    • Capture the exact job_id returned by CronCreate.
    • Associate it with the candidate UID and interview workflow instance.
    • Do not depend on global CronList output to infer which task should be deleted.
    • Prevent duplicate active polling tasks for the same candidate.
  4. Require informed user authorization

    • Tell the user that a cross-session recurring task will be created.
    • Obtain explicit confirmation before installing it.
    • Provide a simple command to list and cancel recruitment polling tasks.
  5. Reduce scheduled-task authority

    • Restrict the task to checking and reporting status.
    • Require fresh user approval before sending messages, modifying records, or creating calendar events.
    • Ensure the scheduled prompt cannot broaden its scope based on untrusted candidate message content.
  6. Prefer event-driven processing

    • Use an official message notification or webhook mechanism where available.
    • If polling is unavoidable, use the lowest practical frequency and store only the minimum state required to detect a new response.
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 (17)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The workflow instructs the agent to extract and persist sensitive candidate data from chat messages and resumes, including contact details, work history, education, and portfolio links, without any consent check, privacy notice, or data-minimization step. In a recruitment context this is especially risky because the data is personally identifiable and professionally sensitive, and unauthorized collection or storage can create privacy violations, compliance exposure, and trust harm.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Examples like "我对XXX感兴趣" and "更新XXX的信息/字段" are ambiguous and may be used in normal discussion rather than as deliberate automation commands. In this skill's context, such ambiguity is more dangerous because invocation can cause candidate records to be created or updated in a talent database, producing privacy, integrity, and workflow errors.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Examples like "我对XXX感兴趣" and "更新XXX的信息/字段" are ambiguous and may be used in normal discussion rather than as deliberate automation commands. In this skill's context, such ambiguity is more dangerous because invocation can cause candidate records to be created or updated in a talent database, producing privacy, integrity, and workflow errors.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document instructs a background cron task to repeatedly read candidate private messages and act on them, but it does not require user consent, clear disclosure, scope limits, or data-handling safeguards. In a recruitment context this creates a real privacy and unauthorized-monitoring risk, especially because the task can silently continue polling and surface message content back into another workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file includes a concrete command to create a calendar event on the user's behalf, which modifies user data and schedule state. In a recruitment/interview workflow this action is legitimate, but without an explicit confirmation/authorization step and warning that the command changes calendar data, an agent could create or alter events prematurely or based on ambiguous user intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file defines the tool and all message templates exclusively in Chinese, including fixed outbound message text, with no indication that language should match user preference or that the tool is intended only for a Chinese-language context. This can violate language/locale policy when a skill forces a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The workflow performs create/update operations against a persistent talent database but does not require an explicit confirmation that records will be created or modified. This can lead to silent state changes, accidental overwrites, and unauthorized record creation or updates, especially because the agent is told to decide field changes on its own.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger phrases are broad conversational expressions such as “跟进一下XXX” and “记一下要约XXX面试”, which can overlap with ordinary discussion rather than an explicit command to modify records. In this skill, mis-triggering is security-relevant because the workflow leads directly to persistent state changes in recruitment systems, potentially creating inaccurate candidate decisions or actions without clear user intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The workflow instructs the agent to upsert decision records into the Lark base but does not require notifying the user that a persistent data modification will occur. In a recruiting context, decision logs can affect hiring outcomes and internal audit trails, so silent writes increase the risk of unintended, misleading, or unauthorized updates.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad and map directly to state-changing actions on a recruitment database. This creates a real risk of accidental invocation from ordinary conversation, which could cause unintended candidate record updates or archival changes without sufficiently explicit user intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The workflow performs direct persistent updates to candidate records via record-upsert but does not instruct the agent to notify the user that permanent data will be modified. In a hiring context, silent writes to notes, interview summaries, tags, or archive status can alter business records and affect downstream recruiting decisions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger condition is very broad and based on natural-language phrases like '约一下XXX', which can be invoked without strong confirmation of user intent or candidate identity. In a skill that sends external messages and updates recruiting records, ambiguous activation can cause the agent to contact the wrong person or initiate interview workflows without sufficiently explicit authorization.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The workflow instructs the agent to send messages to candidates on Boss直聘, write recruiting decisions into Lark tables, and create recurring heartbeat checks, but it does not require an upfront notice or confirmation about external communications and personal-data handling. Because this skill operates on identifiable candidate data and performs outbound actions, the lack of explicit consent/notice increases the risk of privacy violations, unintended disclosure, and unauthorized data modification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

All user-facing instructions in this file are presented exclusively in Chinese, with no indication that the user can choose another language or that the skill is intentionally restricted to a Chinese-speaking context. The policy requires flagging language or locale constraints when they are imposed without user opt-in or clear justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The file presents all operational instructions and labels in Chinese, which can amount to a language policy issue if the organization requires not forcing a specific language without user opt-in. There is no indication that the user may choose another language or that this locale restriction is intentional and documented.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The tool explicitly enables proactive Feishu IM messages to a user but provides no guardrails about minimizing personal data, confirming necessity, or avoiding sensitive candidate information in outbound messages. In a recruitment workflow, unsolicited or overly detailed notifications can leak interview details or candidate information to the wrong recipient or through an inappropriate channel, creating a privacy and user-impact issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

整个技能文件以中文编写并要求以中文触发表达为主,但未说明这是面向特定中文使用场景的限定,也未提供语言选择或兼容性说明。按照语言/locale 政策,若技能隐含强制特定语言而无用户 opt-in,属于自然语言层面的合规风险。

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.