Back to skill

Security audit

AI Conference Deadline Radar

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its conference-deadline purpose, but its helper uses an unsafe predictable temp cache that could corrupt user-writable files on shared machines.

Review before installing on shared machines. The skill does not need credentials and its web lookups are purpose-aligned, but until the cache handling is fixed, prefer running the helper with --no-cache or set AI_CONFERENCE_DEADLINE_RADAR_CACHE to a private user-controlled directory.

Vulnerability Patterns
  • 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
  • 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
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch_deadline_sources.py:98
Finding

Predictable Temporary Cache File Permits Symlink-Based File Overwrite

Content
View full analysis

Vulnerability Details

File Location: scripts/fetch_deadline_sources.py, lines 98-126
Vulnerability Type: Predictable temporary file and unsafe symlink handling
Risk Level: Medium

Vulnerable Code

python
def default_cache_path() -> str:
    override = os.environ.get("AI_CONFERENCE_DEADLINE_RADAR_CACHE")
    if override:
        return override
    return os.path.join(tempfile.gettempdir(), "ai-conference-deadline-radar-cache.json")


def load_cache(path: str) -> dict:
    try:
        with open(path, "r", encoding="utf-8") as fh:
            data = json.load(fh)
        return data if isinstance(data, dict) else {}
    except Exception:
        return {}


def save_cache(cache: dict, path: str) -> None:
    try:
        parent = os.path.dirname(path)
        if parent:
            os.makedirs(parent, exist_ok=True)
        tmp = path + ".tmp"
        with open(tmp, "w", encoding="utf-8") as fh:
            json.dump(cache, fh, ensure_ascii=False)
        os.replace(tmp, path)
    except Exception:
        # Cache failure should never prevent the lookup result.
        return

Technical Analysis

The default cache uses the globally predictable path /tmp/ai-conference-deadline-radar-cache.json, and its staging file is always <cache-path>.tmp. The staging file is opened with open(..., "w"), which follows symbolic links and truncates the resolved target. The implementation does not use exclusive creation, verify that the file is regular, reject symbolic links, or place the cache in a private per-user directory.

On a shared system, another local user can predict the staging filename and create it as a symbolic link to a file writable by the victim. When the victim runs the helper, Python follows the link and replaces the target's contents with cache JSON.

The subsequent os.replace() does not eliminate the vulnerability because the target has ...[truncated 2094 chars]

Remediation
View remediation

Remediation Suggestions

  • Store the cache in a private per-user cache directory rather than a shared, predictable path. Create the directory with permissions limited to the current user.
  • Create staging files with tempfile.mkstemp() or tempfile.NamedTemporaryFile(delete=False, dir=cache_directory). These APIs generate unpredictable names and use exclusive creation.
  • Write through the securely returned file descriptor, flush the data, call os.fsync() if durability is required, close the descriptor, and then use os.replace() for atomic publication.
  • Set cache and staging-file permissions to 0600.
  • Before replacing an existing cache, use os.lstat() to reject symbolic links and non-regular files where supported.
  • Validate an environment-provided cache path and document that it must refer to a trusted, user-controlled directory.
  • Do not silently suppress security-relevant cache-write failures. Report a concise warning to standard error while allowing the deadline lookup itself to continue.
  • Add a regression test that pre-creates the staging path as a symbolic link and verifies that the linked target is not modified.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill instructs the agent to use terminal/network/file-capable workflows but does not declare any tool scope or permissions boundaries. In a generic agent runtime, that mismatch can cause over-privileged execution, making it easier for the skill to trigger filesystem or network actions without explicit least-privilege review.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger description covers broad planning and scheduling requests beyond a tightly scoped deadline-lookup function, which can cause the skill to activate in contexts where it is not the best or safest handler. Over-broad activation increases the chance the agent will browse, run helper scripts, or steer decisions based on this skill when the user only asked a general planning question.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill sets a default output language policy that can switch responses to Chinese based on platform context rather than explicit user preference. This can cause user-confusion, miscommunication of deadline details, and unintended disclosure of contextual assumptions in cross-platform or public deployments.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill enables implicit invocation with only a broad natural-language description of when it should be used, and no explicit trigger boundaries or approval constraints are defined in the policy. That can cause the agent to auto-route user queries into this skill in situations where the user did not clearly request it, increasing the chance of unintended data exposure, incorrect planning advice, or overuse of external deadline sources without explicit user intent.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · scripts/fetch_deadline_sources.py (reported line 779)May include surrounding context.

python
sample = f"""
    <html><head><style>.x{{}}</style></head><body>
    <p>3DV 2027 should not match unless 3DV is requested.</p>
    <p>filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler filler</p>
    <h1>AAAI 2027</h1>
    <a href="/aaai/aaai-27/call-for-papers/">AAAI 2027 CFP</a>
    <a href="https://openreview.net/group?id=ICLR.cc/2027/Conference">ICLR OpenReview</a>

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

This code performs outbound HTTP requests to multiple third-party sites, which transmits the user's query context and system network metadata, but there is no confirmation prompt or visible runtime disclosure before the fetches occur. While the module docstring explains the helper's purpose, it does not explicitly warn users that external network access to listed sources will happen.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.