Back to skill

Security audit

obsidian-llm-wiki

Security checks for vulnerabilities and agentic risk

Overview

This skill is a plausible Obsidian knowledge-base helper, but its security claims understate command execution, dependency installation, and overwrite behavior users should review carefully.

Review before installing. Use this only on a backed-up vault, avoid running the initializer on an existing non-empty vault unless you accept overwrites, and install any extractor dependencies in an isolated environment with pinned versions where possible. Be aware that despite the skill's Security section, it can run local commands and third-party tools and may fetch content from network URLs you provide.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/init-wiki.sh:173
Finding

Existing Vault Index Is Unconditionally Overwritten During Initialization

Content
View full analysis
"$VAULT_PATH/index.md" << EOF # 知识库索引 _Last updated: $DATE_ --- ## 实体页 > 人物、组织、概念、工具等 | Page | Summary | Updated | |------|---------|---------| --- ## 主题页 > 研究主题,知识领域 | Page | Summary | Updated | |------|---------|---------| --- ## 素材摘要 > 每个消化过的素材都有一篇摘要 | Page | Summary | Updated | |------|---------|---------| --- ## 对比分析 | Page | Summary | Updated | |------|---------|---------| --- ## 综合分析 | Page | Summary | Updated | |------|---------|---------| EOF echo -e "${GREEN}[CREATE] index.md${NC}" ``` The same unsafe overwrite pattern is also used for `README.md` at line 138 and `log.md` at line 224. ### Technical Analysis The shell redirection operator `>` opens the destination with truncation enabled. Therefore, initialization against an existing vault destroys the previous contents of `index.md` without checking whether the file exists, requesting confirmation, creating a backup, or requiring an explicit force option. The destination is also not checked with `-L` or an equivalent non-following filesystem operation. If `index.md` is a symbolic link, shell redirection follows the link and truncates its target. Path quoting prevents shell argument injection, but it does not prevent destructive overwrites or symbolic-link traversal. The script explicitly accepts an existing vault and skips existing directories, which may lead users to expect similarly non-destructive handling of existing files. ### Attack Path 1. A user selects an existing Obsidian vault as `VAULT_PATH`. 2. The vault already contains a populated `index.md`, or an attacker with write access to the vault places a symbolic link at that path. 3. The user runs `scripts/init-wiki.sh` with their normal filesystem privileges. 4 ...[truncated 692 chars]
Remediation
View remediation
&2 exit 1 fi ``` 2. Add an explicit `--force` option and require informed confirmation before destructive replacement. 3. Reject symbolic links for every generated destination, including `README.md`, `index.md`, `log.md`, and template files. 4. Preserve existing files by creating timestamped backups before an authorized overwrite. 5. Write to a securely created temporary file in the same directory and atomically rename it after successful generation. 6. Apply the same controls to template copying, which currently uses `cp` without a no-clobber policy. 7. Consider refusing to initialize a non-empty vault unless the user explicitly selects a merge or replacement mode. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:469
Finding

Third-Party Tools Are Installed Without Version or Integrity Pinning

Content
View full analysis
pip install youtube-transcript-api` | 视频字幕提取 | | wechat-article-to-markdown | `uv tool install wechat-article-to-markdown` 或 `pip install wechat-article-to-markdown` | 微信公众号文章提取 | | baoyu-url-to-markdown | `bun install ` | 通用网页提取 | **环境说明:** - `` — 替换为你的 Python 环境名(如 `manti`、`base` 等) - 示例:`pip install youtube-transcript-api` 或 ` pip install youtube-transcript-api` ``` ### Technical Analysis The installation commands do not pin reviewed package versions, verify artifact hashes, identify trusted package sources, or use a committed lockfile. Consequently, package managers resolve whatever release is current when installation occurs. The Bun instruction is additionally ambiguous because it uses the placeholder `` instead of an exact reviewed package identity. A user or agent could substitute an incorrect, similarly named, or malicious package. Python and JavaScript package installation may execute package build hooks or lifecycle scripts. A compromised upstream release, account takeover, dependency confusion event, or typosquatted substitution can therefore result in code execution under the installing user's account. This finding does not establish that the named packages are currently malicious. It identifies an unsafe dependency acquisition process that leaves the effective installed code outside the audited artifact. ### Attack Path 1. An agent or user follows the dependency setup instructions in `SKILL.md`. 2. The package manager queries its configured registry without a pinned version or verified hash. 3. An attacker publishes or compromises a resolved package release, transitive dependency, or simila ...[truncated 743 chars]
Remediation
View remediation
--hash=sha256: wechat-article-to-markdown== --hash=sha256: ``` 3. Identify the exact Bun package and pin its version instead of using ``. 4. Commit the relevant lockfile and require immutable or frozen-lockfile installation. 5. Document the expected official registry and upstream repository for each package. 6. Review direct and transitive dependencies before updating pinned versions. 7. Install extraction tools in an isolated, least-privileged environment without access to unrelated credentials or sensitive files. 8. Correct the statement that the Skill has “no external code execution,” because the documented workflow runs a bundled shell script and third-party extraction tools. ]]>
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (9)

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs execution of multiple external commands and scripts against user-supplied URLs and paths, expanding the attack surface well beyond simple vault management. Because these tools are external and some arguments come from untrusted input, the skill can trigger unintended code execution, unsafe parsing, network exfiltration, or harmful filesystem side effects through dependent tooling.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The security section claims there is no external code execution, yet the documented workflows explicitly call shell commands, CLI utilities, and helper scripts. This kind of false security assertion is dangerous because it can cause operators and downstream systems to apply weaker scrutiny to a skill that actually performs command execution and network-capable processing.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill states it only reads and writes inside the vault, but elsewhere it documents access to local source files, skill-bundled templates, temporary files, and a state file in the user's home directory. Misrepresenting the filesystem scope increases risk because users may authorize the skill under the false assumption that it cannot touch data outside the vault boundary.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The natural-language instructions, trigger conditions, and workflow guidance are presented exclusively in Chinese, which effectively forces a specific language/locale for use of the skill. The file does not offer an opt-in language choice or explain that the skill is intentionally restricted to a Chinese-speaking or region-specific context.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest frames the skill as a local knowledge-base construction and vault management system, but the documented behavior includes active retrieval from web URLs, WeChat articles, YouTube, X/Twitter, and other online sources via external tools. Network access may be a practical implementation detail for supported web sources, but the manifest does not clearly state that the skill itself performs external content acquisition rather than only organizing user-provided materials.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The template headings and content placeholders are written entirely in Chinese, which implies the skill output is constrained to a specific language by default. The file does not offer a language choice or explain a justified region-specific requirement, which matches the policy's language/locale violation criterion.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The markdown template hard-codes section headings and labels in Chinese, such as '概述', '关键要点', and '来源'. This imposes a specific language/locale on generated content without offering a user choice or documenting that the template is intended only for a Chinese-language context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script’s user-facing documentation and prompts are entirely in Chinese, including usage examples and interactive instructions. This effectively fixes the interaction language without any opt-in or alternative locale, which is a natural-language locale policy concern under the stated rules.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

This markdown template uses Chinese headings and content labels throughout, which imposes a specific language on users by default. The file does not offer an alternative language choice or explain that the template is intended only for a Chinese-language context.

Content

No source excerpt is available for this finding.