Back to skill

Security audit

hermes-time-awareness

Security checks for vulnerabilities and agentic risk

Overview

The skill’s time-injection behavior is coherent, but its setup instructions ask an agent to download and run unpinned remote code that installs and enables a persistent Hermes plugin.

Review the exact code you install and prefer a pinned release or commit instead of the one-shot agent prompt. The runtime plugin is narrowly focused on adding time and idle context, but once enabled it runs before every Hermes LLM call and sends time, timezone, and idle-duration hints in the prompt copy.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
time_awareness/time_context.py:78
Finding

Unbounded Per-Session Timestamp Cache Can Cause Memory Exhaustion

Content
View full analysis
unix timestamp def record_user_message(session_id: str, ts: Optional[float] = None) -> None: """Record when a user message was received. Called by the hook.""" import time with _last_user_ts_lock: _last_user_ts[session_id] = ts or time.time() ``` ### Technical Analysis The `pre_llm_call` hook records every non-empty `session_id` in the process-wide `_last_user_ts` dictionary. The cache has no maximum size, expiration policy, session-close cleanup, or validation of session identifiers. Existing session identifiers overwrite their prior entries, but every unique identifier creates a permanent entry for the lifetime of the Hermes process. If an untrusted or remotely accessible client can cause Hermes to create or process requests with many unique session identifiers, it can force the dictionary to grow continuously. The locking mechanism prevents concurrent corruption but does not mitigate resource exhaustion. ### Attack Path 1. An attacker obtains access to an interface that creates Hermes sessions or supplies session identifiers. 2. The attacker repeatedly sends requests using distinct session IDs. 3. The `pre_llm_call` hook invokes `record_user_message()` for each identifier. 4. Every unique identifier remains in `_last_user_ts`. 5. The long-running Hermes process consumes progressively more memory. 6. Sufficient requests can degrade performance or terminate the process through memory exhaustion. Exploitation depends on whether the surrounding Hermes deployment allows an attacker to create a large number of ...[truncated 591 chars]
Remediation
View remediation

T03 · Remote Payload Retrieval and Execution

Error
Location
SETUP_PROMPT.md:15
Finding

One-Shot Installation Fetches and Executes an Unpinned Remote Repository

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (16)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The README instructs users to run rm -rf ~/.hermes/plugins/hermes-time-awareness, which is a destructive filesystem operation. While narrowly scoped and common for uninstall steps, it still creates avoidable risk of accidental deletion if the path is mistyped, expanded unexpectedly, or copied into the wrong environment.

Content

Scanner excerpt · README.md (reported line 76)May include surrounding context.

bash
hermes plugins disable hermes-time-awareness
rm -rf ~/.hermes/plugins/hermes-time-awareness

Configuration

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

The README instructs users to run rm -rf ~/.hermes/plugins/hermes-time-awareness, which is a destructive filesystem operation. While narrowly scoped and common for uninstall steps, it still creates avoidable risk of accidental deletion if the path is mistyped, expanded unexpectedly, or copied into the wrong environment.

Content

Scanner excerpt · README.md (reported line 76)May include surrounding context.

bash
hermes plugins disable hermes-time-awareness
rm -rf ~/.hermes/plugins/hermes-time-awareness

Configuration

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 · README.md (reported line 85)May include surrounding context.

Optional: set timezone explicitly if auto-detection is wrong:

bash
# In ~/.hermes/.env
HERMES_TIMEZONE=Australia/Sydney

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 · README.md (reported line 278)May include surrounding context.

Optional: set timezone explicitly if auto-detection is wrong:

bash
# In ~/.hermes/.env
HERMES_TIMEZONE=Australia/Sydney

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

This is the Chinese duplicate of the destructive uninstall command. It is not malicious, but it still presents a real safety issue because it normalizes copy-pasting a permanent recursive deletion command without a warning or verification step.

Content

Scanner excerpt · README.md (reported line 269)May include surrounding context.

bash
hermes plugins disable hermes-time-awareness
rm -rf ~/.hermes/plugins/hermes-time-awareness

配置

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

This is the Chinese duplicate of the destructive uninstall command. It is not malicious, but it still presents a real safety issue because it normalizes copy-pasting a permanent recursive deletion command without a warning or verification step.

Content

Scanner excerpt · README.md (reported line 269)May include surrounding context.

bash
hermes plugins disable hermes-time-awareness
rm -rf ~/.hermes/plugins/hermes-time-awareness

配置

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill claims runtime time/idle injection, yet the reported behavior centers on plugin installation, enablement, filesystem modification, and running tests, while not demonstrating the claimed injection itself. Such a description-behavior gap can conceal risky local modifications and mislead users about what code will run on their system.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The skill claims runtime time/idle injection, yet the reported behavior centers on plugin installation, enablement, filesystem modification, and running tests, while not demonstrating the claimed injection itself. Such a description-behavior gap can conceal risky local modifications and mislead users about what code will run on their system.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README explains that time and idle data are injected into every LLM turn, but it frames this as a feature rather than a prominent warning about prompt-bound metadata disclosure. Users may not realize that each API request carries additional contextual data, which can affect privacy expectations and downstream model/provider exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The setup prompt instructs an AI agent to clone remote code, execute shell scripts, modify the user's Hermes plugin state, and restart the service. Even if this is normal for plugin installation, presenting these actions as copy-paste instructions without an explicit warning or consent checkpoint is risky because an agent may perform system-modifying actions on the user's behalf with limited scrutiny.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
76% confidence
Finding

The skill advertises automatic per-turn context injection but declares no explicit tool or permission scope, while associated capabilities indicate environment access and file reads. In an agent/plugin ecosystem, missing scope declarations reduce reviewability and can allow users to enable a skill without understanding what local access it requires.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The uninstall instructions include a recursive deletion command without any cautionary text. Although the path is specific, copy-pasted destructive commands can cause accidental data loss if modified, expanded incorrectly, or run in an unexpected environment.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill sends current system time and inferred idle duration into every LLM turn, but the description does not clearly warn users that this contextual metadata will be attached to all prompts. This can expose behavioral and locale-related information to downstream models or logging systems without meaningful user awareness.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
66% confidence
Finding

The sample injected string uses "AEST +10:00 Sat," which reflects a specific locale/timezone presentation. While this may be only an example, the file does not clarify that timezone/locale formatting follows the user's system settings or can vary, which could be read as imposing a locale-specific format.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The script changes into the plugin directory and invokes pytest, which is a subprocess execution in a code file. While this is a diagnostic script and the action is somewhat expected, there is no explicit warning or comment that running tests may execute code from the plugin under test; the existing output is only a generic status message.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The file defines _WEEKDAYS_EN and uses it in the generated user-facing time context, which forces English weekday output regardless of user locale. This is a natural-language locale policy concern because the skill does not provide opt-in, configuration, or documented justification for restricting output to English.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
__init__.py:20