Back to skill

Security audit

Tistory Publish

Security checks for vulnerabilities and agentic risk

Overview

This skill is built for Tistory publishing, but it deserves Review because it can publish live posts, use account credentials, and has unsafe browser automation handling.

Install only if you are comfortable giving the skill control over an authenticated Tistory browser session. Use --private or a test blog first, keep any Kakao credential file outside shared repos with tight permissions, and do not run it on body HTML or --blog values from untrusted sources until the OG placeholder escaping and host validation issues are fixed.

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

Error
Location
scripts/publish.sh:248
Finding

JavaScript Injection Through Untrusted OG Placeholder Values

Content
View full analysis
Remediation
View remediation
prepareOGPlaceholder(url)", url) ``` Apply additional input validation before using the value: ```python from urllib.parse import urlparse def validate_og_url(value): parsed = urlparse(value) if parsed.scheme not in ("http", "https") or not parsed.hostname: fail(f"invalid OG URL: {value}") if parsed.username or parsed.password: fail("credentials are not permitted in OG URLs") return value ``` Recommended hardening measures: 1. Treat all body HTML and placeholder attributes as untrusted input. 2. Never interpolate external values into JavaScript source strings. 3. Use Playwright’s structured argument serialization for every dynamic value. 4. Restrict placeholders to absolute `http` or `https` URLs. 5. Optionally enforce an allowlist of domains appropriate for the publishing workflow. 6. Add regression tests containing quotes, backslashes, line separators, and JavaScript-like placeholder values. 7. Reject malformed placeholders before any browser-side evaluation occurs. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/publish.sh:117
Finding

Unrestricted Blog Host Allows Out-of-Scope Browser Navigation and Script Injection

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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description frames the skill as blog publishing automation, but the content also includes credential-file parsing and Kakao login/session recovery. That is security-relevant behavior because it handles authentication secrets and account access; if users are not clearly warned, they may provide credentials under a narrower trust assumption than the skill actually requires.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description frames the skill as blog publishing automation, but the content also includes credential-file parsing and Kakao login/session recovery. That is security-relevant behavior because it handles authentication secrets and account access; if users are not clearly warned, they may provide credentials under a narrower trust assumption than the skill actually requires.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/login.sh (reported line 6)May include surrounding context.

sh
# publish.sh 실행 전 로그인 세션이 만료됐을 때 사용
#
# 사용:
#   bash scripts/login.sh --cred-file /path/to/credentials.json [--cdp-port 18800]
#
# 자격증명 파일 형식 (JSON 또는 key: value):
#   {"email": "...", "password": "..."}

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/login.sh (reported line 15)May include surrounding context.

sh
# publish.sh 실행 전 로그인 세션이 만료됐을 때 사용
#
# 사용:
#   bash scripts/login.sh --cred-file /path/to/credentials.json [--cdp-port 18800]
#
# 자격증명 파일 형식 (JSON 또는 key: value):
#   {"email": "...", "password": "..."}

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/login.sh (reported line 32)May include surrounding context.

sh
# publish.sh 실행 전 로그인 세션이 만료됐을 때 사용
#
# 사용:
#   bash scripts/login.sh --cred-file /path/to/credentials.json [--cdp-port 18800]
#
# 자격증명 파일 형식 (JSON 또는 key: value):
#   {"email": "...", "password": "..."}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The markdown clearly states that the skill automatically publishes posts to Tistory, which affects user-controlled remote content. Under the markdown-file criteria, the description should warn about impacts to user data or system integrity, but no cautionary note about live publication, overwriting mistakes, or remote upload effects is present.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The first usage example shows a direct publish.sh invocation against a real blog domain, but the README does not disclose that running the command can immediately create or publish a post on the user's account. For markdown guidance that can affect user data or privacy, a visible warning is expected.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill advertises network and file-reading capabilities but does not declare any explicit tool scope or permission boundaries. In a skill that automates browser actions and optionally interacts with local credential files, missing scope declarations increases the chance of unintended file access or network actions occurring without clear user awareness or policy enforcement.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documentation describes credential-based session recovery using email/password files but does not provide a strong user-facing warning about secret handling, storage risks, or privacy implications. Because this skill targets a real Kakao/Tistory account and may restore authenticated sessions, insufficient disclosure increases the risk of unsafe credential practices and unintended account compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill automates actions that can publish content, upload media, and modify a live Tistory blog, but the description lacks a prominent warning that these are write operations against a production account. In this context, silent or poorly disclosed state-changing automation is risky because a user may trigger irreversible blog changes, reputational damage, or accidental disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code loads email and password credentials from a user-supplied file, then later uses them to authenticate against Kakao/Tistory. Although the script has usage comments and status prints, it does not clearly disclose that it processes highly sensitive credentials and transmits them during automated login.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script documentation and command examples are entirely in Korean, and later runtime messages and UI assumptions also rely on Korean text. This imposes a specific language/locale on users without any opt-in or documented justification, which matches the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The automation searches for Korean UI text such as "첨부", "사진", "완료", "비공개 저장", and "공개 발행" to perform actions. This means the skill only works in a Korean locale and does not provide any user choice or documented opt-in for that constraint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script contains functions that directly activate the final publication flow, including clicking the public publish button, without any built-in confirmation, preview checkpoint, or user-consent gate. In this skill’s context, the code is explicitly designed to automate posting to a live blog while also working around trusted-event restrictions, so accidental or unauthorized publication of content is materially more likely.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The runbook instructs the user to run a publishing command that can create or modify content on a live Tistory blog, and only later briefly notes that removing --private enables real publication. Because this skill is explicitly designed to automate remote blog publishing and editor manipulation, failing to foreground the live-impact behavior can lead to unintended publication or remote data changes by users who follow the example verbatim or adapt it without understanding the consequences.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file contains user-facing natural language in Korean, but there is no indication that the skill is intentionally Korean-only or that users can opt into another language. Under the policy rule, forcing a specific language without opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The user-facing comments, usage guidance, and runtime messages are presented exclusively in Korean. Under the stated policy, forcing a single language without opt-in or alternative locale support is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file's natural-language instructions, comments, and UI matching strings are written to operate only in Korean and assume Korean-language interface text such as '완료', '공개 발행', '첨부', and '사진'. There is no indication that the user can opt into this locale constraint or select another language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language instructions, headings, and option descriptions are all presented in Korean, which can amount to forcing a specific language on users without opt-in. The policy allows locale constraints only when the skill offers a language choice or clearly documents a justified regional limitation, which is not present here.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.