Back to skill

Security audit

Codebase to Course

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it can turn untrusted repository content into browser-executed HTML/JavaScript without clear sanitization safeguards.

Install only if you are comfortable with the skill reading the target codebase, writing a generated course directory, optionally cloning a GitHub repository you provide, and opening the result in a browser. Avoid using it on untrusted or adversarial repositories until the generated HTML path requires proper escaping/sanitization or removes the unsafe innerHTML sinks.

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
references/main.js:193
Finding

Stored Cross-Site Scripting in Generated Course Content

Content
View full analysis
Exactly! ' + rightExp; feedback.className = 'quiz-feedback show success'; } else { selected.classList.add('incorrect'); const correctBtn = $(`.quiz-option[data-value="${correct}"]`, q); if (correctBtn) correctBtn.classList.add('correct'); feedback.innerHTML = 'Not quite. ' + wrongExp; feedback.className = 'quiz-feedback show error'; } ``` The `rightExp` and `wrongExp` values originate from generated `data-*` attributes and are inserted as executable HTML. `references/main.js:468-480`: ```javascript window.checkBugLine = function (el, isCorrect) { const challenge = el.closest('.bug-challenge'); const feedback = $('.bug-feedback', challenge); if (isCorrect) { el.classList.add('correct'); feedback.innerHTML = 'Found it! ' + (el.dataset.explanation || ''); feedback.className = 'bug-feedback show success'; $$('.bug-line', chal ...[truncated 5123 chars]
Remediation
View remediation
` in text contexts. - Encode quotation marks as well when content is placed in an attribute. - Clarify that “exact copy” means the browser must display the exact source text, not that raw source bytes should be inserted as HTML. 2. **Remove unsafe `innerHTML` assignments** - Render untrusted explanations and hints using `textContent`. - Create trusted formatting elements separately rather than concatenating markup with untrusted strings. A safer quiz implementation is: ```javascript feedback.replaceChildren(); const prefix = document.createElement('strong'); prefix.textContent = selected.dataset.value === correct ? 'Exactly! ' : 'Not quite.'; const explanation = document.createTextNode( selected.dataset.value === correct ? rightExp : wrongExp ); feedback.append(prefix, explanation); ``` A safer bug-feedback implementation is: ```javascript feedback.replaceChildren(); if (isCorrect) { const prefix = document.createElement('strong'); prefix.textContent = 'Found it! '; feedback.append(prefix, document.createTextNode(el.dataset.explanation || '')); } else { feedback.textContent = el.dataset.hint || 'Not this line — keep looking...'; } ``` 3. **Sanitize any intentionally supported formatting** - If explanation fields must support limited HTML, process them through a well-maintained sanitizer. - Use a strict allowlist of harmless formatting elements. - Prohibit scripts, event-handler attributes, forms, embedded frames, dangerous URLs, and style-based execution paths. 4. **Validate generated modules before assembly** - Add a validation step that rejects unexpected `
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (21)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 8)May include surrounding context.

md
ive course. The output is a **directory** containing a pre-built `styles.css`, `main.js`, per-module HTML files, and an assembled `index.html` — open it directl

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 135)May include surrounding context.

md
ive course. The output is a **directory** containing a pre-built `styles.css`, `main.js`, per-module HTML files, and an assembled `index.html` — open it directl

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 149)May include surrounding context.

md
ive course. The output is a **directory** containing a pre-built `styles.css`, `main.js`, per-module HTML files, and an assembled `index.html` — open it directl

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 186)May include surrounding context.

md
ive course. The output is a **directory** containing a pre-built `styles.css`, `main.js`, per-module HTML files, and an assembled `index.html` — open it directl

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 190)May include surrounding context.

md
ive course. The output is a **directory** containing a pre-built `styles.css`, `main.js`, per-module HTML files, and an assembled `index.html` — open it directl

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 164)May include surrounding context.

md
Read `references/interactive-elements.md` for HTML patterns for each interactive element type. Read `references/design-system.md` for visual conventions.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 171)May include surrounding context.

md
Read `references/interactive-elements.md` for HTML patterns for each interactive element type. Read `references/design-system.md` for visual conventions.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 190)May include surrounding context.

md
Read `references/interactive-elements.md` for HTML patterns for each interactive element type. Read `references/design-system.md` for visual conventions.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 221)May include surrounding context.

md
Read `references/interactive-elements.md` for HTML patterns for each interactive element type. Read `references/design-system.md` for visual conventions.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · references/_base.html (reported line 8)May include surrounding context.

html
<meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>COURSE_TITLE</title>

  <!-- Google Fonts: Bricolage Grotesque · DM Sans · JetBrains Mono -->
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,600;12..96,700;12..96,800&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400;1,9..40,500&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · references/design-system.md (reported line 243)May include surrounding context.

md
<div class="nav-dots">
      <button class="nav-dot" data-target="module-1" data-tooltip="Module 1 Name"
              role="tab" aria-label="Module 1"></button>
      <!-- one per module -->
    </div>
  </div>
</nav>

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger phrases are broad enough to match common requests for explanation or teaching, which can cause the skill to activate when a user did not explicitly ask for course generation. Because this skill transforms a codebase into a large self-contained HTML artifact, unintended activation could lead to unnecessary repository processing, disclosure of more code context than needed, or surprising output that bypasses a more appropriate narrower workflow.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest says the skill produces a "self-contained HTML file," but the skill documentation later states the output is a directory with separate CSS, JS, per-module HTML files, and an assembled index.html, with Google Fonts as an external dependency. This is a direct mismatch between the promised deliverable and the documented implementation behavior.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest description says to use the skill whenever someone wants to create an interactive course, tutorial, or educational walkthrough, and also lists phrases like 'turn this into a course' and 'teach this code.' These are broad natural-language triggers that could match ordinary conversation and the file does not provide exclusion conditions or clear scope boundaries to prevent unintended invocation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill authorizes cloning arbitrary GitHub repositories into /tmp and then analyzing them, which expands the agent's operational scope beyond user-provided local content. This increases exposure to untrusted remote content and can lead to unintended network access, storage of potentially sensitive or malicious repositories, and downstream processing of attacker-controlled files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill directs cloning repositories, writing files, executing a shell script, and opening generated HTML without an explicit user-facing warning about those side effects. That can lead to unintended filesystem modification, command execution, and application launch on behalf of the user without informed consent.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · SKILL.md (reported line 67)May include surrounding context.

md
- Real bugs or gotchas (if visible in git history or comments)
- The tech stack and why each piece was chosen

**Figure out what the app does yourself** by reading the README, the main entry points, and the UI code. Don't ask the user to explain the product — they may not be familiar with it either. The course should open by explaining what the app does in plain language (a brief "here's what this thing does and why it's interesting") before diving into how it works. The first module should start with a concrete user action — "imagine you paste a YouTube URL and click Analyze — here's what happens under the hood."

### Phase 2: Curriculum Design

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file includes a teaching example that sends a POST request and includes an Authorization API key, with plain-English text normalizing the action but no warning that data may be transmitted to an external service or that credentials are involved. Under the markdown-file criteria, behaviors affecting privacy or system integrity should be accompanied by warnings.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The manifest describes generating an HTML course artifact, but the instructions go further by telling the agent to open the built index.html in a browser. Launching local applications is a separate capability from content generation and is not necessary to fulfill the core stated purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The document sets <html lang="en">, which enforces English as the page language. Under the policy rule for natural-language violations, a fixed language setting should either be optional for users or clearly justified as region-specific; neither is present in this file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The typography guidance uses natural language to prohibit specific font and system-font options (e.g. 'NOT Inter/Roboto/Arial' and 'NOT system fonts') as a fixed policy. This imposes a stylistic language/locale-like constraint without presenting it as optional or justified by a documented regional/compliance requirement.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.