xiaoai-bridge

WarnAudited by ClawScan on May 10, 2026.

Overview

The voice bridge is mostly purpose-aligned, but it ships real-looking Xiaomi session credentials and includes unsafe shell-command examples that need review before use.

Do not install this package until the bundled scripts/.mi.json credential cache is removed and the exposed Xiaomi tokens are rotated. If you proceed after cleanup, configure only your own Xiaomi credentials, keep a non-empty trigger phrase, secure logs, and replace the documented exec-based examples with spawn/execFile argument arrays.

Findings (5)

Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.

What this means

Anyone receiving the skill package may see or try to use someone else’s Xiaomi account/session data, and the skill’s own credential requirements are not clearly declared in metadata.

Why it was flagged

This file contains real-looking Xiaomi passToken/serviceToken values plus device identifiers, not placeholders. That exposes account/device access material and contradicts the expected user-supplied credential model.

Skill content
"userId":"2277466353","passToken":"V1:...","serviceToken":"6a/ouu75...","device":{"name":"小米AI音箱"..."mac":"50:A0:09:E8:E6:F9"}
Recommendation

Remove scripts/.mi.json from the package, revoke/rotate the exposed Xiaomi tokens, add credential cache files to .gitignore, and declare MI_USER_ID, MI_PASS_TOKEN or MI_PASSWORD, and MI_DEVICE_ID as required configuration.

What this means

A crafted voice command or generated response could cause unintended local shell commands to run if users follow the example exactly.

Why it was flagged

The documentation places dynamic assistant response text into a shell command. If that text contains quotes or shell metacharacters, copying this pattern can allow command injection.

Skill content
await exec(`node skills/xiaoai-bridge/scripts/xiaoai-listen.js speak "${response}"`);
Recommendation

Use child_process.spawn or execFile with argument arrays and shell:false, or call a safe internal API instead of building shell commands with interpolated text.

What this means

Spoken commands may appear in OpenClaw context or logs, especially when running with output redirected to xiaoai.log.

Why it was flagged

The listener retrieves Xiaomi voice conversation records and outputs both filtered text and the original spoken text for downstream processing.

Skill content
const conversations = await mina.getConversations({ limit: 10, timestamp: lastTimestamp }); ... originalText: msg.originalText
Recommendation

Use a non-empty trigger prefix, protect or rotate logs, avoid speaking sensitive information near the device, and document how long any logs or forwarded messages are retained.

What this means

The bridge may keep listening in the background longer than expected if the user forgets it is running.

Why it was flagged

The skill explicitly supports a long-running background listener. This is disclosed and purpose-aligned, but it means the bridge continues polling and processing voice messages until stopped.

Skill content
node scripts/xiaoai-listen.js > xiaoai.log 2>&1 &
Recommendation

Run it under a visible process manager, document stop/restart commands, and only enable it when continuous voice control is intended.

What this means

Dependency installation relies on external package sources, and users must trust the pinned packages and mirror configuration.

Why it was flagged

The package lock pins the dependency with an integrity hash, but it resolves from an HTTP mirror rather than HTTPS. The dependency is purpose-aligned, but provenance should be verified.

Skill content
"resolved": "http://mirrors.tencentyun.com/npm/@mi-gpt/miot/-/miot-1.2.2.tgz", "integrity": "sha512-HM4j..."
Recommendation

Prefer HTTPS registry URLs, keep the lockfile, verify dependency provenance, and avoid installing if the lockfile changes unexpectedly.