T03 · Remote Payload Retrieval and Execution
- Location
README.md:34- Finding
Mutable Remote Installer Is Piped Directly into a Shell
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This career-assistant skill is mostly transparent and local, but its recommended installer runs mutable remote code and can overwrite skill folders across multiple AI tools.
Review the installer before using it. Prefer cloning or downloading a tagged release, inspecting install.sh, and installing only the AI environment you actually use. Avoid the curl | bash one-liner, keep the inbox server off when not actively saving a JD, and treat workspace/ as sensitive because it may contain resumes, salary expectations, offers, and interview notes.
README.md:34Mutable Remote Installer Is Piped Directly into a Shell
install.sh:21Unverified Mutable Repository Snapshot Is Installed Across Multiple Agent Environments
scripts/inbox_server.py:47Unauthenticated Wildcard-CORS Local Inbox Permits Cross-Origin Data Injection
scripts/tracker.py:63Tracker Writes Untrusted Spreadsheet Cells Without Formula or Record Sanitization
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# —— 日志与临时 ——
*.log
*.tmp
.env
The use of shell chaining into bash is a classic command-execution anti-pattern because it converts downloaded text into executable code with no review step. If the remote content is malicious or tampered with, the user immediately grants it execution on their machine, enabling credential theft, persistence, or modification of agent configuration. Within a skill ecosystem, such compromise may also tamper with other installed skills or host-level AI tooling.
不用先下载,打开终端贴这一句回车:
curl -fsSL https://raw.githubusercontent.com/tanchunzhuo/ai-career-position/main/install.sh | bash
脚本自动装到 WorkBuddy / Claude Code / Codex / Cursor 的 skills 目录。重启后直接说「帮我找方向」或「评估这个 JD」就会触发,不用记任何命令。
声明描述的是技能的业务功能,但所给代码块实际只是安装器。它的主要行为是解析安装目标、定位源目录、必要时通过 curl 从 GitHub 下载仓库、解压后复制到用户主目录下各平台的 skills 目录,并可能覆盖已有内容。这与声明中的核心能力(本地评估 JD、识别骗局、生成简历、准备面试、比较 offer 等)不一致。虽然安装脚本可被视为配套实现细节,但当前提供的“代码块实际做什么”与声明用途存在明显偏差:代码并未实现所宣称的技能功能,反而执行了未在声明中体现的安装、网络访问和文件写入/删除操作。
声明描述的是一个较完整的求职辅助/职业分析技能,核心能力围绕岗位分析、匹配评估、简历优化和求职决策。实际代码块则是单一的简历排版导出脚本:读取本地 HTML 文件,启动 Chromium,加载 file:// 页面并打印为 PDF。虽然这可被视为简历生成流程中的辅助步骤,但从该代码本身看,主功能与声明的主要用途明显不一致,而且声明中没有明确说明存在一个独立的 HTML→PDF 渲染工具。因此应判定为描述与行为不匹配。
声明描述的是一个较广泛的职业求职辅助技能,核心围绕JD/offer/简历/方向判断等功能。实际代码仅覆盖其中很小的一部分“准备面试”相关能力,而且还是以本地文件形式管理 STAR+R 故事库:创建故事模板、读取故事、列出故事、根据问题关键词做简单匹配。它不处理招聘JD、URL、截图,也不分析职位匹配、职级总包、外包培训贷、简历优化或offer比较。虽然“准备面试”与故事库存在弱相关,但该代码块的主要目的与声明的整体用途明显不一致,并引入了未在描述中明确说明的本地故事库存取与CLI交互模式,因此应判定为描述与行为不匹配。
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
一路按提示操作即可;建议为私钥设置口令。随后打印公钥:
cat ~/.ssh/id_ed25519.pub
复制整行内容,前往 GitHub:头像 → Settings → SSH and GPG keys → New SSH key,粘贴并保存。
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
一路按提示操作即可;建议为私钥设置口令。随后打印公钥:
cat ~/.ssh/id_ed25519.pub
复制整行内容,前往 GitHub:头像 → Settings → SSH and GPG keys → New SSH key,粘贴并保存。
Piping remote content directly into bash is a classic dangerous command chain because it combines download and execution into one step with no review boundary. This materially increases the chance of compromise from repository takeover, CDN manipulation, or social engineering.
# ./install.sh claude codex # 装指定平台
#
# 远程一句话安装(无需先 clone,直接贴进终端回车):
# curl -fsSL https://raw.githubusercontent.com/tanchunzhuo/ai-career-position/main/install.sh | bash
#
# 支持的平台及其用户级 skills 目录(以各平台官方文档为准,2026-08):
# WorkBuddy -> ~/.workbuddy/skills
The help text again presents a direct network-to-shell chain, which is unsafe regardless of the script's benign stated purpose. Because this is an installer for a simple local skill, the convenience does not justify the elevated execution risk.
./install.sh <平台...> 只装指定平台,例如:./install.sh workbuddy claude
远程一句话安装:
curl -fsSL https://raw.githubusercontent.com/tanchunzhuo/ai-career-position/main/install.sh | bash
EOF
}
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
# ---- 定位 skill 源目录 ----
# 若在项目目录内运行(旁边有 SKILL.md),直接用当前目录;
# 否则(如 curl | bash 管道执行)下载 tarball 解压到临时目录。
SOURCE_DIR=""
if [ -n "${BASH_SOURCE[0]:-}" ]; then
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
rm -rf "$dest/$SKILL_NAME" is a destructive filesystem operation in a user-controlled path context, and while quoting plus constrained target names reduce worst-case risk, it can still erase an existing installation without confirmation. In an installer for a benign skill, silent deletion of user data is an unnecessary integrity hazard.
--exclude '.DS_Store' \
"$SOURCE_DIR/" "$dest/$SKILL_NAME/"
else
rm -rf "$dest/$SKILL_NAME"
cp -R "$SOURCE_DIR" "$dest/$SKILL_NAME"
rm -rf "$dest/$SKILL_NAME/.git" "$dest/$SKILL_NAME/workspace"
fi
The cleanup rm -rf "$dest/$SKILL_NAME/.git" "$dest/$SKILL_NAME/workspace" removes subdirectories after copying, which is destructive but scoped to the installed skill tree. It is less severe than arbitrary deletion, yet still poses a risk of deleting user modifications or workspace content without notice.
else
rm -rf "$dest/$SKILL_NAME"
cp -R "$SOURCE_DIR" "$dest/$SKILL_NAME"
rm -rf "$dest/$SKILL_NAME/.git" "$dest/$SKILL_NAME/workspace"
fi
installed="$installed $t"
done
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
done
# ---- 清理临时目录 ----
[ -n "$TMP_DIR" ] && rm -rf "$TMP_DIR"
# ---- 结果 ----
echo ""
This markdown file contains exclusively Chinese natural-language guidance about the skill’s behavior, including user-facing output phrasing changes, with no indication that users can choose another language or locale. Under the stated policy, forcing a specific language without opt-in is a natural-language policy concern.
The README asks users to execute a remote installer directly via curl piped to bash. That creates a trust-on-first-use remote code execution path: anyone who can alter the script source, repository, delivery path, or referenced branch can run arbitrary commands on the user's machine. For a job-evaluation skill, this installation method is not necessary to fulfill the core purpose and materially increases supply-chain risk.
The README says that after installation users can simply say broad phrases like '帮我找方向' or '评估这个 JD' and the skill will trigger automatically. Broad natural-language triggers can cause accidental activation in unrelated conversations, leading the skill to ingest sensitive CV, salary, or job data when the user did not explicitly intend to invoke it. In a career-assistant context handling personal employment data, unintended invocation raises privacy and integrity concerns.
The activation guidance is ambiguous because it instructs users to paste prompt files into 'any AI' and then provide modules and JD text, but does not clearly separate setup steps from invocation boundaries. That ambiguity can cause the skill logic or prompt content to be applied in unintended contexts, including over-broad data exposure or accidental processing of sensitive job materials. Since the skill is designed to process resumes, salary expectations, and offer details, ambiguous triggering increases privacy risk.
Without declared permissions the skill's intent is opaque and cannot be validated.
The skill defines broad natural-language triggers like job analysis, resume review, and career direction phrases that can occur in ordinary conversation. In agent environments, overly broad triggers can cause unintended invocation, pulling sensitive resume, profile, or local workspace data into the skill flow when the user did not clearly intend to activate it.
The trigger section contains ambiguous phrases such as '帮我找方向', '我适合什么', and '看看这个简历' without hard scope boundaries. Because the skill is designed to read local files and potentially write tracking records, accidental activation in a general chat could expand data access and produce actions the user did not explicitly request.
The file’s headings, descriptions, and user-facing guidance are entirely in Chinese, and there is no indication that users may choose another language or locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale constraint is explicitly documented and justified.
This YAML file's comments, labels, reminders, and templates are all in Chinese, which can impose a fixed language/locale on users. The file does not indicate that Chinese is optional, user-selected, or required for a region-specific use case, so it appears to violate the language-choice policy.
This manifest-style YAML is entirely presented in Chinese, including comments, labels, and explanatory text, which effectively forces a specific language for users consuming the skill data. Under the policy, locale or language constraints should either be optional for the user or clearly documented as a justified region-specific limitation.
The file header comments and explanatory text are written entirely in Chinese, and the dataset entries also assume Chinese-language consumption throughout. For a general-purpose skill asset, this constitutes a natural-language locale constraint without any visible user opt-in or justification that the skill is intended only for Chinese-speaking users or a China-specific audience.
This YAML file contains user-facing natural-language policy content exclusively in Chinese, including explanations, actions, and disclaimers, but nowhere indicates that the skill is China-specific or that users can opt into this locale. Under the language/locale policy, forcing a specific language without user choice or clear justification is a natural-language policy violation.
No suspicious patterns detected.