xiaoai-bridge@1.3.12
CAUTION· install onlyPublisher claims: "小米小爱音箱语音指令桥接。截取小爱音箱的语音消息,转换为 AI 助手指令,并通过 TTS 回复。支持触发词过滤、自动去重、后台监听。可选接入 Jev 判定模型(TokenRhythm)作为热词触发的上位替代:配置 JEV_API_KEY 后,全部语音转写文本会发送至 Jev 判定服务(默认 https://tokenrhythm.studio,仅转写文本与能力边界说明,不含账号/设备/凭据)用于转发决策,未配置或服务不可用时自动降级回热词触发。适用于通过小爱音箱语音控制 OpenClaw 助手、智能家居联动、语音任务执行等场景。" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-07 and scored it 76/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Credential pass-through configuration; Credential pass-through configuration. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
- scripts/.envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.3. **会话缓存**:依赖库 `@mi-gpt/miot` 会把包含 `passToken` / `serviceToken` / `ssecurity` 的 `.mi.json` 写到**进程当前目录**。本 Skill 会在登录前把工作目录切换到私有状态目录,并强制校验:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.2. **优先使用 passToken**:密码登录可能触发验证码,且更容易被风控。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.5. **用完即清**:运行 `node scripts/xiaoai-listen.js clean` 删除本地会话缓存(同时清理旧版本可能遗留的 `.mi.json`)。删除本地缓存**不等于撤销凭据**,如怀疑泄露请退出小米账号所有登录并更换 passToken。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.throw new Error("登录失败:请检查 MI_USER_ID、passToken/密码与 MI_DEVICE_ID");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* @mi-gpt/miot 会把包含 passToken / serviceToken 的会话缓存写到Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.description: 指定 .env 文件路径,默认 scripts/.env 或技能根目录 .env。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const passToken = String(env.MI_PASS_TOKEN ?? "").trim();Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.description: 备选登录方式,可能触发验证码与风控,仅用于无法获取 passToken 时。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.description: 仅在权限无法强制/ACL 无法验证时显式放行(存在凭据泄露风险);必须在进程环境中设置,写在 .env 中会被忽略。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`passToken` 等价于小米账号的登录凭据,能读取设备列表、对话记录并控制音箱。请按以下方式使用:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if (!passToken && !password) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.passToken,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* - `.env` 不得设置安全敏感变量(LOCALAPPDATA/APPDATA/USERPROFILE/HOME/XDG_STATE_HOME、Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.throw new ConfigError("缺少 MI_PASS_TOKEN 或 MI_PASSWORD(推荐 passToken,密码登录可能触发安全验证)");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* @param {{ userId: string, passToken?: string, password?: string, did: string, debug?: boolean }} configFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* - `.env` 通常包含 passToken,读取前先做权限检查;可被同组/其他用户修改时直接拒绝。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* 加载顺序:`XIAOAI_ENV_FILE`(显式指定)→ 否则 `scripts/.env` → 技能根目录 `.env`。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.passToken: config.passToken || undefined,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* `.env` 加载(含权限检查与安全敏感变量隔离)。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* - `.env` 通常包含 passToken,读取前先做权限检查;可被同组/其他用户修改时直接拒绝。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* @param {{ userId: string, passToken?: string, password?: string, did: string, debug?: boolean }} configFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.3. POSIX 上修正属主/权限:`chown -R "$(id -u):$(id -g)" <目录>`、`chmod 700 <目录>`;若目录里有其他文件,`chmod` 需要手动执行,程序不会擅自改动;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* (包括共享临时目录里被其他用户预先创建的目录),并且在 chmod 失败时静默继续,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* - JSON / 表单里的 passToken、password、serviceToken、ssecurity、nonce 等字段Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// 自动 chmod 会影响其它程序,必须由用户自行处理。Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."提示:删除本地缓存不等于撤销凭据;如 passToken 可能已泄露,请在小米账号中退出登录并更换 passToken。\n",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// 在加载凭据之前先安装脱敏,避免 passToken/serviceToken 进入 stderr。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* 环境变量文件(含 passToken)的权限检查与尽力收紧。Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`⚠️ 环境变量文件权限过宽(${formatMode(stats.mode)}):${target},passToken 可被同组或其他用户读取。正在收紧为 0600。`,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`⚠️ 环境变量文件是符号链接:${target}。请确认链接目标仅当前用户可读(chmod 600),否则 passToken 可能泄露。`,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* 背景:上游 `@mi-gpt/[email protected]` 在登录成功后把包含 passToken / serviceToken /Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."登录失败:请检查 MI_USER_ID、passToken/密码与 MI_DEVICE_ID(DEBUG=true 可打印设备列表)",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* `Cookie: userId=...; passToken=...; serviceToken=...`,登录/轮询失败时会把Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`⚠️ 环境变量文件是符号链接:${target}。请确认链接目标仅当前用户可读(chmod 600),否则 passToken 可能泄露。`,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod 600 scripts/.env # POSIX 系统建议执行Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`请把 ${STATE_DIR_ENV_VAR} 指向一个专用目录,或手动执行 chmod 700 "${target}"。`,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`拒绝把凭据写入该目录;请改用私有目录,或执行 chown -R ${uid} "${dir}" 修正属主。`,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.请执行 `chmod 600 scripts/.env` 后重试;`.env` 是符号链接时只告警,需自行确认链接目标权限。Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.XIAOAI_ENV_FILE 指定 .env 路径,默认 scripts/.env 或技能根目录 .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if (/"(passToken|serviceToken|ssecurity)"/.test(raw)) {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* node xiaoai-listen.js clean 清理本地会话缓存(含 passToken)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."passToken|password|serviceToken|yetAnotherServiceToken|ssecurity|psecurity|nonce|MI_PASS_TOKEN|MI_PASSWORD|JEV_API_KEY";Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
4 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim warm-winter: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Credential pass-through configuration≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.