Back to skill

Security audit

Algernon Interview

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent mock interview tool, but it can save or export interview results without clear per-use consent.

Install only if you are comfortable with interview summaries being written under the OpenAlgernon memory directory and, when Notion variables are configured, full reports being appended to Notion. Prefer requiring confirmation before export and validating material slugs before database queries.

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
SKILL.md:29
Finding

User-Controlled SQL Injection Through Material Slug

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 29–35
Vulnerability Type: SQL injection caused by unsafe string interpolation
Risk Level: Medium

Vulnerable Code

bash
sqlite3 "$DB" \
  "SELECT c.front, c.tags FROM cards c
   JOIN decks d ON d.id = c.deck_id
   JOIN materials m ON m.id = d.material_id
   WHERE m.slug = 'SLUG'
   ORDER BY RANDOM() LIMIT 30;"

Technical Analysis

The material slug originates from the user-facing /algernon interview [SLUG] invocation and is inserted into a quoted SQL statement without parameter binding, escaping, or input validation.

If the implementation replaces SLUG directly with user-provided text, an attacker can supply a value containing a single quote and additional SQL syntax. This can terminate the intended string literal, alter the query, or introduce additional statements accepted by the SQLite command-line client.

For example, a crafted slug could change the filtering condition to return cards belonging to materials other than the requested one. More destructive payloads could attempt to execute UPDATE, DELETE, or other SQLite statements against the study database.

Attack Path

  1. An attacker invokes the skill using a crafted material slug containing SQL metacharacters.
  2. The agent or surrounding implementation substitutes that slug for the SLUG placeholder in the documented command.
  3. The resulting SQL is passed to sqlite3 as executable SQL rather than as a bound value.
  4. SQLite interprets the injected syntax as part of the query or as an additional statement.
  5. The attacker may access unrelated card data or modify the database, subject to the filesystem permissions of the process running the skill.

Impact Assessment

Successful exploitation could compromise the confidentiality and integrity of the local OpenAlgernon study database. An attacker may be able to:

  • Read cards and metadata from materials outs ...[truncated 488 chars]
Remediation
View remediation

Remediation Suggestions

  • Replace direct string substitution with a wrapper implemented in a language or library that supports SQLite parameter binding. Bind the slug as a value, for example:

    python
    cursor.execute(
        """
        SELECT c.front, c.tags
        FROM cards c
        JOIN decks d ON d.id = c.deck_id
        JOIN materials m ON m.id = d.material_id
        WHERE m.slug = ?
        ORDER BY RANDOM()
        LIMIT 30
        """,
        (slug,),
    )
    
  • Validate the slug before executing the query. If valid slugs are intentionally limited to letters, digits, underscores, and hyphens, enforce an allowlist such as ^[A-Za-z0-9_-]+$.

  • Reject values containing quotes, whitespace, semicolons, control characters, or other characters outside the defined slug format. Validation should supplement, not replace, parameter binding.

  • Open the database in read-only mode for interview operations so that a query-processing flaw cannot modify study data.

  • Resolve the supplied slug against a list of existing materials before loading card data.

  • Avoid constructing executable SQL through textual replacement in agent instructions.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases are broad enough to match ordinary conversation, which can cause the skill to activate unexpectedly. In this skill, unexpected activation is more dangerous because it can lead to hidden persistence or external export of interview content without the user realizing a stateful skill has taken over.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill is presented as a mock interview mode, but it also persists interview outputs to Notion and local memory files. This creates an undocumented data-handling expansion: user answers and evaluations may be stored or transmitted beyond the immediate session, increasing privacy and confidentiality risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The optional Notion export sends the full interview report and study topics to an external system even though the skill is described only as an interview simulator. External transmission of potentially sensitive user-generated responses without clear necessity or disclosure can leak personal, professional, or proprietary information.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill can transmit interview content to Notion without any user-facing warning in the skill description or runtime flow. Because interview responses may include sensitive career history, internal project details, or proprietary technical examples, silent external transmission creates a meaningful privacy and data-exfiltration risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill appends a summary of the interview session to a local memory file without warning the user that their interaction will be persisted. Even if the stored entry is summarized, it still creates an undisclosed retention trail that may expose performance assessments or sensitive topics to later readers or systems.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The documented interview workflow depends on environment-based paths and a CLI binary, then writes session summaries into a persistent memory file. For a skill whose stated role is to simulate an interviewer, this persistence-oriented local state handling is not an obvious requirement of the core purpose.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.