T01 · Skill Instruction Hijacking
- Location
agents/openai.yaml:4- Finding
Cross-Skill Instruction Hijacking Through a Hard-Coded Cloned Voice Identity
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches a voice-transcription purpose, but it uses unbundled runtime code, local credential bootstrap, and a hard-coded cloned voice handoff that require review before installation.
Install only if you trust the AudioClaw/SenseAudio environment, accept that user voice recordings are sent to the documented remote ASR service, and can constrain the runtime to trusted shared modules. Review or remove the cloned voice handoff and make credential lookup explicit before using this in production.
agents/openai.yaml:4Cross-Skill Instruction Hijacking Through a Hard-Coded Cloned Voice Identity
scripts/openclaw_voice_intake.py:10Arbitrary Code Execution Through Ancestor-Controlled Python Module Loading
The skill instructs runtime bootstrap logic to replace a provided token with a real API key loaded from a local credentials file under the user's home directory. Accessing a persistent local secrets store as part of skill execution expands credential exposure and creates a path for unintended secret use or leakage, especially in multi-skill or multi-tenant agent environments.
This skill now treats `SENSEAUDIO_API_KEY` as the default API key source again.
Runtime rules:
- If the host app injects `SENSEAUDIO_API_KEY` as an AudioClaw login token such as `v2.public...`, the shared bootstrap will replace it with the real `sk-...` value from `~/.audioclaw/workspace/state/senseaudio_credentials.json` before ASR starts.
- `--api-key-env` still works, but the default runtime path is `SENSEAUDIO_API_KEY`.
## Commands
The skill describes capabilities that involve shell execution, filesystem access, environment variable use, and outbound network calls, but it does not declare any explicit tool scope or permissions boundary. That omission can cause the skill to run with broader-than-expected privileges, making accidental misuse or unsafe composition with other agent capabilities more likely.
The default prompt instructs the agent to prefer a specific prepared clone voice_id for voice replies without requiring explicit user opt-in at the point of use. Hard-coding a cloned voice preference can cause unauthorized voice impersonation, consent violations, or privacy/compliance issues if the selected voice belongs to a real person or is used outside the user's expectations.
The natural-language fallback message 这段语音我没有听清楚,请再说一次。 is always used when clarification is needed, regardless of the user's preferred language or locale. This imposes a specific language choice with no opt-in or documented locale constraint.
This script sends user audio and associated request parameters to a remote ASR service via transcribe(request, api_key) and records the API endpoint in the manifest, but provides no in-file notice, consent gate, or minimization around remote transmission. In a voice-intake skill, this can expose sensitive spoken content, identifiers, and metadata to an external service without clear user awareness.
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
if args.out_json:
out_path = Path(args.out_json)
out_path.parent.mkdir(parents=True, exist_ok=True)
out_path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8")
json.dump(manifest, sys.stdout, ensure_ascii=False, indent=2)
sys.stdout.write("\n")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from typing import Dict, List, Optional, Sequence, Tuple, Union
API_URL = "https://api.senseaudio.cn/v1/audio/transcriptions"
SUPPORTED_SUFFIXES = {".wav", ".mp3", ".ogg", ".opus", ".flac", ".aac", ".m4a", ".mp4"}
MAX_BYTES = 10 * 1024 * 1024
MAX_SECONDS = 7200
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from typing import Dict, List, Optional, Sequence, Tuple, Union
API_URL = "https://api.senseaudio.cn/v1/audio/transcriptions"
SUPPORTED_SUFFIXES = {".wav", ".mp3", ".ogg", ".opus", ".flac", ".aac", ".m4a", ".mp4"}
MAX_BYTES = 10 * 1024 * 1024
MAX_SECONDS = 7200
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from typing import Dict, List, Optional, Sequence, Tuple, Union
API_URL = "https://api.senseaudio.cn/v1/audio/transcriptions"
SUPPORTED_SUFFIXES = {".wav", ".mp3", ".ogg", ".opus", ".flac", ".aac", ".m4a", ".mp4"}
MAX_BYTES = 10 * 1024 * 1024
MAX_SECONDS = 7200
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def detect_duration_seconds(path: Path) -> float:
try:
output = subprocess.check_output(["/usr/bin/afinfo", str(path)], stderr=subprocess.STDOUT)
except (subprocess.CalledProcessError, FileNotFoundError):
return 0.0
for raw_line in output.decode("utf-8", "ignore").splitlines():
The code uploads raw audio content to a third-party ASR endpoint, but this file contains no mechanism to ensure the caller has obtained user consent or surfaced a privacy disclosure before transmission. Because voice recordings often contain sensitive personal data, silent external transfer can create privacy, compliance, and data-governance exposure in the skill context.
No suspicious patterns detected.