other
- Location
mermaid_converter.py:93- Finding
Mermaid Source Is Disclosed to Kroki During Default Conversion
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does the advertised Mermaid conversion/upload work, but it can send diagram contents to third-party services by default and has under-disclosed privacy and generated-HTML safety risks.
Review this skill carefully before installing if your diagrams or Markdown may contain internal architecture, hostnames, customer data, credentials, or unreleased business details. Prefer a local mermaid-cli-only workflow for sensitive content, avoid the Markdown batch mode unless you want hosted image links, and treat generated HTML as active content that should not be opened from untrusted Mermaid input.
mermaid_converter.py:93Mermaid Source Is Disclosed to Kroki During Default Conversion
mermaid_converter.py:134Untrusted Mermaid Source Is Injected into Executable HTML Without Escaping
mermaid_converter.py:220Predictable Shared Temporary Output Permits Symlink Overwrite and Conversion Races
SKILL.md:16Dependency Instructions Recommend an Unpinned and Potentially Incorrect Package
image_host_uploader.py:27Shared FreeImage API Credential Is Hard-Coded in Source
The file recommends Kroki online conversion as the preferred method but does not disclose that Mermaid source is sent to an external network service for rendering. This is dangerous because users may assume conversion is local and unknowingly expose proprietary or sensitive diagram content to a remote service.
The documentation promotes uploading generated Mermaid images to third-party image hosts without warning users that diagram content and resulting images will leave the local environment and be stored by external services. If users process internal architecture, credentials, URLs, or other sensitive content, this can cause unintended data disclosure to untrusted providers.
The README encourages use of Kroki and multiple image-hosting services for converting and uploading Mermaid diagrams, but it does not warn users that diagram and possibly Markdown content will be sent to third-party services. This can expose sensitive architecture details, internal identifiers, or embedded secrets if users process private documentation, making the omission a real privacy and data-handling risk in this skill's context.
The skill explicitly promotes uploading generated images to third-party hosting services but does not disclose that Mermaid content, rendered diagrams, filenames, or embedded sensitive information may be transmitted to external providers. In a documentation/content workflow, users may unknowingly publish internal architecture, credentials accidentally embedded in diagrams, or other sensitive material to public services.
This function uploads a local file to a third-party image host and returns a public URL, but it provides no explicit user consent prompt, warning, or policy control around external disclosure. In an agent/skill context, that creates a real data-exfiltration risk if the caller passes sensitive local files or if users do not realize the image becomes available to an external service.
This Postimages path transmits local image data to an external service without any user-facing disclosure or consent mechanism. Even though the behavior is functionally intended, it is dangerous because a skill can be invoked on sensitive screenshots or documents and silently publish them outside the local environment.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Image URL or None
"""
try:
url = "https://api.imgur.com/3/image"
headers = {'Authorization': f'Client-ID {client_id}'}
The Imgur upload sends both local file contents and an authorization header to a third-party service, again without explicit disclosure or confirmation. This increases risk because it not only exports local data but also uses credentials/tokens in the outbound request, which can have privacy and account-governance implications if used unexpectedly.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def check_mermaid_cli(self) -> bool:
"""Check if mermaid-cli is installed"""
try:
result = subprocess.run(
['mmdc', '--version'],
capture_output=True,
text=True,
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
]
# Execute conversion
result = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
if result.returncode == 0:
print(f"Converted successfully: {output_path}")
This code sends the full Mermaid source to the third-party Kroki service over the network, which can expose sensitive diagram content, embedded credentials, internal architecture, or proprietary information. The risk is increased because the transmission occurs as part of normal conversion behavior without an explicit privacy warning, consent gate, or local-only default.
The auto-selection logic tries Kroki first, meaning users who do not explicitly choose a method may unknowingly transmit diagram contents to an external service. In a skill context, diagrams often contain internal system topology, infrastructure details, or business logic, so making remote exfiltration the default materially increases confidentiality risk.
The Markdown processing example states that Mermaid blocks will be replaced with image links, but it does not warn that this modifies file contents and may overwrite or materially transform source documentation. Users could unintentionally lose original Mermaid source in derived files or introduce externally hosted links into documents without realizing the persistence and integrity implications.
The module docstring states it is 'Designed for WeChat Official Account articles,' which ties the skill to a specific platform/locale context in natural language. Under the policy rule, locale- or platform-specific constraints should be clearly justified or offer user opt-in; this file does not present such a choice.
The description is written entirely in Chinese and explicitly targets WeChat public-account article workflows ("专为公众号文章设计"). This imposes a specific language and locale context in the skill metadata without indicating any user choice or broader language support.