Back to skill

Security audit

Agent Compete Scope

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to perform the advertised competitor analysis using web search and external LLM APIs, with privacy and dependency hygiene caveats but no evidence of hidden, destructive, or persistent behavior.

Before installing, be comfortable with product and competitor inputs, search queries, retrieved snippets, and generated prompts being sent to Tavily and the selected LLM provider. Keep API keys out of version control, restrict provider keys and quotas, update dependencies, and treat the generated competitive analysis as advisory because web results can influence the LLM output.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
src/analyzer.ts:36
Finding

Indirect Prompt Injection Through Untrusted Search Results

Content
View full analysis
`[${i + 1}] ${a.title}\nURL: ${a.url}\n내용: ${a.content}`) .join('\n\n'); const systemPrompt = `경쟁사 분석 전문가입니다. 주어진 정보를 바탕으로 경쟁사 프로필을 작성하십시오. 반드시 아래 JSON 형식으로만 응답하십시오. 순수 JSON만 출력하십시오. { "description": "경쟁사를 2문장으로 설명", "key_features": ["핵심 기능 1", "핵심 기능 2", "핵심 기능 3"], "pricing_model": "가격 모델 설명 (모르면 '정보 없음')", "positioning": "타겟 시장과 포지셔닝 한 문장", "sources": ["사용한 URL 1", "URL 2"] }`; const userMessage = `경쟁사: ${competitor}\n\n수집된 정보:\n${articlesText}`; ``` ### Technical Analysis Titles, URLs, and content excerpts returned by Tavily originate from untrusted external websites. The Skill inserts this material directly into an LLM user message without a clear data boundary or an instruction requiring the model to ignore commands contained in retrieved documents. A malicious web page can include text that resembles model instructions, such as directions to disregard the requested analysis, fabricate product properties, promote an attacker-controlled URL, or emit manipulated JSON fields. Requiring JSON output constrains formatting but does not prevent semantic prompt injection. The resulting competitor profile is subsequently incorporated into comparison-matrix and recommendation prompts. Consequently, manipulated content can propagate through several analysis stages and affect the final report. ### Attack Path 1. An attacker publishes or modifies a web page associated with a competitor. 2. The page contains search-relevant text and embedded instructions directed at an LLM. 3. Tavily indexes the page and returns its title, URL, or content excerpt. 4. `buildCompetitorProfile()` concatenates the attacker-controlled material into `articlesText`. 5. The mat ...[truncated 1029 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
src/llm/gemini.ts:20
Finding

Gemini API Key Included in Request URL Query String

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (33)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The reported absence of actual competitor-analysis or whitespace-discovery logic, combined with only a generic LLM abstraction, suggests the skill may not do what it claims. While this is partly an integrity issue, in security terms it undermines trust boundaries and can mask broader prompt handling or data transmission behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The reported absence of actual competitor-analysis or whitespace-discovery logic, combined with only a generic LLM abstraction, suggests the skill may not do what it claims. While this is partly an integrity issue, in security terms it undermines trust boundaries and can mask broader prompt handling or data transmission behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The reported absence of actual competitor-analysis or whitespace-discovery logic, combined with only a generic LLM abstraction, suggests the skill may not do what it claims. While this is partly an integrity issue, in security terms it undermines trust boundaries and can mask broader prompt handling or data transmission behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The reported absence of actual competitor-analysis or whitespace-discovery logic, combined with only a generic LLM abstraction, suggests the skill may not do what it claims. While this is partly an integrity issue, in security terms it undermines trust boundaries and can mask broader prompt handling or data transmission behavior.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
96% confidence
Finding

The lockfile pins form-data to 4.0.5, which is reported as vulnerable to CRLF injection in multipart field names/filenames. If this package is used to build multipart requests from untrusted input, an attacker may inject unexpected headers or alter multipart structure, potentially enabling request smuggling-like effects, data corruption, or abuse of downstream HTTP parsers. In this skill context, the presence of SDKs that perform API/file uploads makes the dependency more relevant rather than purely theoretical.

Content

No source excerpt is available for this finding.

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 · src/analyzer.ts (reported line 7)May include surrounding context.

ts
import * as dotenv from 'dotenv';
import * as path from 'path';

// .env 직접 로드
dotenv.config({ path: path.resolve(__dirname, '../.env') });

console.log('[Fetcher] API Key Check:', process.env.TAVILY_API_KEY ? 'FOUND' : 'MISSING');

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 · src/fetcher.ts (reported line 5)May include surrounding context.

ts
import * as dotenv from 'dotenv';
import * as path from 'path';

// .env 직접 로드
dotenv.config({ path: path.resolve(__dirname, '../.env') });

console.log('[Fetcher] API Key Check:', process.env.TAVILY_API_KEY ? 'FOUND' : 'MISSING');

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 · src/analyzer.ts (reported line 8)May include surrounding context.

ts
import * as path from 'path';

// .env 직접 로드
dotenv.config({ path: path.resolve(__dirname, '../.env') });

console.log('[Fetcher] API Key Check:', process.env.TAVILY_API_KEY ? 'FOUND' : 'MISSING');

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 · src/fetcher.ts (reported line 6)May include surrounding context.

ts
import * as path from 'path';

// .env 직접 로드
dotenv.config({ path: path.resolve(__dirname, '../.env') });

console.log('[Fetcher] API Key Check:', process.env.TAVILY_API_KEY ? 'FOUND' : 'MISSING');

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The policy flags natural-language content that forces a specific language without user opt-in. This README presents the skill description and setup context only in Korean, with no indication that the skill is region-specific or that alternative language support is available.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill advertises behavior that implies network and environment-variable use, but it declares no explicit tool scope or permissions. That creates a hidden-capability problem: reviewers and users cannot accurately assess what resources the skill may access, increasing the chance of unintended data exposure or unauthorized outbound requests.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The natural-language description is written only in Korean, which indicates a language-specific skill presentation without any accompanying note that users can choose another language. Under the policy, locale or language constraints should be optional or clearly justified; this file provides neither.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code sends collected article titles, URLs, and full content to an external LLM provider via provider.call() without any visible consent, minimization, or disclosure in this file. In a competitive-intelligence workflow, scraped or uploaded content may include proprietary, personal, or licensed material, so silent third-party transmission creates a real data exposure risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The prompts prescribe Korean output content such as 경쟁사를 2문장으로 설명 and similar Korean-only formatting requirements, and the rest of the file consistently instructs the model in Korean. This imposes a locale/language constraint without any visible user opt-in or justification that the skill is intentionally region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The comparison-matrix prompt requires Korean field content and dimension labels, continuing the same fixed-language behavior. There is no indication that users can choose another language or that the skill is intentionally limited to a Korean-language compliance context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The whitespace and recommendation prompt specifies Korean-language outputs and formatting, again enforcing a single language throughout the skill. Because no language-selection mechanism or documented justification is present, this is a natural-language locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This file contains multiple natural-language comments and runtime log/warning messages in Korean, such as the env-loading comment and search status/error messages. Because the file does not indicate that the skill is intentionally region-specific or provide any user opt-in for language/locale, it appears to enforce a specific language in a way that may violate language/locale policy.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/fetcher.ts (reported line 47)May include surrounding context.

ts
}

  try {
    const response = await fetch('https://api.tavily.com/search', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/fetcher.ts (reported line 47)May include surrounding context.

ts
}

  try {
    const response = await fetch('https://api.tavily.com/search', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code returns user-facing error strings in Korean and uses Korean operational text in comments/logs, but nothing in this file indicates that the skill is intentionally Korean-only or that users can opt into another language. This creates a natural-language policy concern because the skill appears to enforce a specific language by default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The method combines systemPrompt and userMessage and transmits them to Google's Gemini REST API, which is a network operation that may send user or system data off-box. Although there is a console log indicating the model call, it does not disclose that prompt content is being transmitted externally, and there is no confirmation prompt, warning comment, or user-facing disclosure in this file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The API key is placed in the request URL query string, which is more likely to be captured in logs, proxies, tracing systems, browser history, and error telemetry than a header-based credential. Even though this targets a server-side Google endpoint, URL-based secret propagation increases the chance of accidental credential disclosure.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/llm/groq.ts (reported line 15)May include surrounding context.

ts
}
    this.client = new OpenAI({
      apiKey: config.apiKey,
      baseURL: 'https://api.groq.com/openai/v1',
    });
    this.model = config.model || 'llama-3.3-70b-versatile';
  }

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This is a markdown file, so missing user warnings apply to documented behaviors that could affect privacy or security. The setup steps tell users to copy an env template and enter API keys, but do not warn that these credentials are sensitive, should not be committed, and should be handled carefully.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

If the skill performs web searches on competitor data without warning users, sensitive business strategy inputs may be sent to external search providers unexpectedly. The direct technical impact is limited, but the privacy and confidentiality risk is real, especially for internal market-analysis use cases.

Content

No source excerpt is available for this finding.