Back to skill

Security audit

Real Mars Shot 真实火星计划

Security checks for vulnerabilities and agentic risk

Overview

This game needs review because narration can send text online by default without clear notice, and restarting can overwrite an existing save without a backup.

Create games with --tts off, or disable narration using a meta action with tts set to false, unless you accept online speech processing. Use explicit game commands, unique save IDs and independent backups. Starting again with an existing ID replaces its save without creating a new backup. Opening the orbit HTML online also attempts to load three.js from unpkg.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · tests/test_engine.py (reported line 235)May include surrounding context.

python
def test_path_traversal_user_id_is_rejected(self):
        with self.assertRaises(ValueError):
            new_state(user_id="../etc/passwd")

    def test_two_calls_with_the_same_seed_share_a_mole_assignment(self):
        a = new_state(user_id="a1", seed=99)

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

The TTS workflow does not disclose that narration text is sent to an external speech service.

Medium
Category
Output Handling
Confidence
90% confidence
Finding

The document describes optional speech generation using edge-tts without explaining that narration text is transmitted to Microsoft's online speech service. If narration incorporates player-provided names or other private text, enabling this feature could disclose that information outside the local environment without informed consent; its optional, fictional-game context reduces the likely exposure.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, file_read, file_write, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The TTS workflow does not disclose that narration is sent to an external speech service.

Medium
Category
Output Handling
Confidence
90% confidence
Finding

The workflow references edge-tts and online neural voices without explaining that speech generation sends narration to an external service. Enabling audio is not necessarily informed consent to that disclosure, and narration may contain player-provided names or other personal details; the enabled-state requirement and restriction to short game narration limit the exposure.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Narration text is sent to an external TTS service without disclosing the data transfer.

Medium
Category
Output Handling
Confidence
94% confidence
Finding

edge-tts sends the supplied narration text to an external speech service, while this file provides no disclosure or consent check and treats TTS as enabled when the setting is absent. Game narration is ordinarily low sensitivity, but user-supplied or private information included in the narration would also leave the local environment; the 4,000-character limit does not prevent that disclosure.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/generate_turn_tts.py (reported line 47)May include surrounding context.

python
out = Path(args.out) if args.out else Path.home() / ".realmarsshot" / "tts" / f"{args.user_id}-{datetime.now().strftime('%Y%m%d-%H%M%S')}.mp3"
    out.parent.mkdir(parents=True, exist_ok=True)
    text = args.text.strip()[:4000]
    proc = subprocess.run(
        ["edge-tts", "--voice", voice, "--text", text, "--write-media", str(out)],
        capture_output=True,
        text=True,

Trial crews suffer casualties for local-production shortfalls even when stored supplies cover the deficit, contradicting the documented survival rules.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

evaluate_month() determines survival from local production without considering stored food, oxygen, or water, and apply_month() calls _harm() on that basis before evaluating store-supported foothold survival. Consequently, a trial crew with adequate stored supplies can suffer unwarranted deaths, population-clock resets, and financial penalties. This is a simulation-integrity defect; the game context limits the demonstrated consequences to game state rather than real-world harm or host compromise.

Content

No source excerpt is available for this finding.

Save migration grants deep-time win thresholds despite explicitly documenting that no deep-time years are granted.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

For version-1 saves with achieved biology or machine footholds, migration raises the corresponding simulated years to the configured win threshold, contrary to its documented promise not to grant deep-time years. This can bypass progression requirements in downstream checks that trust those counters, although the demonstrated impact is limited to game-state integrity rather than host security or sensitive-data exposure.

Content

No source excerpt is available for this finding.

The file-writing helper creates directories and can overwrite an existing file without disclosure.

Medium
Category
Output Handling
Confidence
90% confidence
Finding

At L228–L229, write() creates parent directories and writes to the supplied path, replacing existing contents if the file already exists. There is no confirmation, log message, docstring, or comment explaining these filesystem effects.

Content

No source excerpt is available for this finding.

The standalone trigger “火种” is an ordinary word without a game-specific activation constraint.

Low
Category
Trigger Abuse
Confidence
94% confidence
Finding

The ordinary word “火种” can appear in conversation without expressing an intent to start this game, yet the workflow directs the agent to create a game after activation. This can cause unwanted tool execution and persistent state changes; the documented reuse of a default user ID also creates a risk of overwriting an existing game, although adjacent backups reduce the potential damage.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.