Back to skill

Security audit

AI Knowledge Workbench Lite

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a disclosed local Markdown indexing tool, but its mutable workspace configuration can redirect later scans to other readable local folders without a fresh authorization check.

Install only if you are comfortable with a local tool that scans and stores metadata about Markdown and other files under its configured source roots. Keep the .ai-workbench/workbench.json file protected, and recheck configured source paths before update or scan operations, especially in shared or writable workspaces.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/runtime/workbench/config.py:111
Finding

Mutable configuration permits scanning outside the user-authorized source boundary

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Note
Location
scripts/runtime/workbench/doctor.py:156
Finding

Environment diagnosis exposes host details beyond minimum functional requirements

Content
View full analysis
dict[str, Any]: version = version or (sys.version_info.major, sys.version_info.minor, sys.version_info.micro) return { "executable": sys.executable, "version": ".".join(str(value) for value in version), "supported": version >= (3, 10, 0), "minimum": "3.10.0", } ``` The application probe returns local installation and executable paths: ```python def obsidian_installation() -> dict[str, Any]: system = platform.system().lower() app_candidates: list[Path] = [] if system == "darwin": app_candidates = [Path("/Applications/Obsidian.app"), Path.home() / "Applications/Obsidian.app"] elif system == "windows": for key in ("LOCALAPPDATA", "PROGRAMFILES"): base = os.environ.get(key) if base: app_candidates.append(Path(base) / "Obsidian" / "Obsidian.exe") existing = [str(path) for path in app_candidates if path.exists()] cli = shutil.which("obsidian") return { "application_detected": bool(existing), "application_paths": existing, "cli_detected": bool(cli), "cli_path": cli, } ``` The structured diagnosis result exposes operating-system release, architecture, shell, and the preceding path information: ```python data = { "workspace": str(workspace), "sources": [str(path) for path in sources], "platform": { "system": system, "release": platform.release(), "machine": platform.machine(), "shell": os.environ.get( ...[truncated 3546 chars]
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (13)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The 'When to Use' section is written in Chinese and directly instructs when the skill should be used, but the file does not offer the user a language/locale choice or explain that the locale is intentionally region-specific. This creates a natural-language locale policy issue because the skill imposes a specific language for key operational guidance without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The display name, short description, and default prompt are written entirely in Chinese, which indicates a fixed language/locale expectation. The file does not provide any user opt-in, alternative language choice, or justification that this skill is intentionally region-specific, so it may violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code generates multiple output paths and filenames using Chinese text such as "00-入口.md", "10-索引", and "待审核.md". That imposes a specific language/locale in the generated artifact structure without any visible user opt-in or justification, which matches the language/locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The configuration defines fixed non-English folder names such as "10-索引" and "80-待审核", which imposes a specific language/locale in the generated workspace structure. The file does not provide any user opt-in, alternative locale selection, or documented justification for this locale constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This code file contains natural-language and locale settings that explicitly fix the document language to zh-CN, and the surrounding interface text is predominantly Chinese. Under the policy, forcing a specific language/locale without user opt-in is a natural-language policy violation unless it is clearly justified as region-specific, which is not documented here.

Content

No source excerpt is available for this finding.

Unbounded Resource Access

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Content

Scanner excerpt · scripts/runtime/workbench/lifecycle.py (reported line 390)May include surrounding context.

python
url_host = f"[{host}]" if ":" in host else host
    health_url = f"http://{url_host}:{port}/healthz"
    try:
        with urlopen(health_url, timeout=0.75) as response:  # noqa: S310 - loopback URL is validated above
            health = json.loads(response.read().decode("utf-8"))
    except (OSError, URLError, ValueError, json.JSONDecodeError) as exc:
        return make_result(

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The generated report path hard-codes Chinese directory and file names ("99-系统/质量报告.md"), which imposes a specific language/locale choice in the skill behavior. There is no indication in this file that the user can choose the report language or that the locale restriction is documented as region-specific.

Content

No source excerpt is available for this finding.

Dynamic import via __import__()

Medium
Category
Dangerous Code Execution
Confidence
75% confidence
Finding

Dynamic import() can load arbitrary modules at runtime, bypassing static analysis and potentially importing malicious code.

Content

Scanner excerpt · scripts/runtime/workbench/server.py (reported line 127)May include surrounding context.

python
actual_port = int(server.server_address[1])
    service = {
        "status": "running",
        "pid": __import__("os").getpid(),
        "instance_id": instance_id,
        "host": selected_host,
        "port": actual_port,

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · LICENSE (reported line 7)May include surrounding context.

text
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README is primarily written in Chinese and only provides a brief English quick start at the end. Under the stated policy, forcing a specific language without explicit user opt-in can be a natural-language policy violation unless a justified locale constraint is documented, which is not present here.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The function reads platform-specific environment variables (LOCALAPPDATA and PROGRAMFILES) to locate an Obsidian installation, and later also reads SHELL/COMSPEC for platform reporting. In this file there is no user-facing print/log, comment, or docstring explaining that environment-derived system information will be inspected and included in diagnostic output.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The code writes a generated markdown report to a path containing Chinese directory and file names ("99-系统/质量报告.md") without any visible user opt-in or locale selection. For a general-purpose skill, this can impose a specific language/locale convention on outputs, which falls under the policy's natural-language locale concerns.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.