Health Mate

AdvisoryAudited by Static analysis on Apr 30, 2026.

Overview

No suspicious patterns detected.

Findings (0)

Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.

What this means

A malicious or poisoned health log or generated report could potentially run code under the user's account when the daily runner is executed.

Why it was flagged

The runner takes generated report text derived from the health memory file and inserts it unescaped into a Python heredoc. If the report text contains Python string delimiters such as triple quotes, it could break out of the string and execute Python code when the runner sends webhooks.

Skill content
result=$(python3 "${SCRIPT_DIR}/daily_report_pro.py" "$TODAY_FILE" "$CURRENT_DATE" 2>&1)
...
delivery_message=$(echo "$result" | sed -n '/=== DELIVERY_MESSAGE_START ===/,/=== DELIVERY_MESSAGE_END ===/p' | sed '1d;$d')
...
message_text = '''${delivery_message}'''
Recommendation

Pass the delivery message as data, not code: use a temporary file, stdin, an environment variable with safe decoding, or JSON serialization, and avoid interpolating report text into executable Python source.

What this means

If the local config file is edited or poisoned, the skill can run unintended shell commands during normal report generation.

Why it was flagged

The shell runner sources the project-local .env file. Sourcing treats the file as shell code, not just key-value configuration, so a modified .env can execute arbitrary shell commands when the runner starts.

Skill content
if [ -f "${CONFIG_DIR}/.env" ]; then
    set -a
    source "${CONFIG_DIR}/.env"
    set +a
Recommendation

Parse .env as key-value data instead of sourcing it, restrict file permissions, and review config/.env before scheduled or automated runs.

What this means

Sensitive health information may be processed into local PDFs, logs, and messages.

Why it was flagged

The skill intentionally reads health-memory logs and turns them into reports. This is purpose-aligned, but the logs can contain sensitive health, medication, symptom, diet, and weight information.

Skill content
It reads structured Markdown logs from `MEMORY_DIR`, generates localized PDF reports, and can optionally deliver the final message to external services.
Recommendation

Point MEMORY_DIR only at the intended health-log folder, protect generated reports/logs, and avoid placing unrelated private files in that directory.

What this means

Configured chat or webhook services may receive sensitive health summaries.

Why it was flagged

The runner can send the generated health-report message to DingTalk, Feishu, or Telegram when the matching credentials are configured. This is disclosed and purpose-aligned, but it sends health-report content to external services.

Skill content
DINGTALK_WEBHOOK = os.environ.get('DINGTALK_WEBHOOK', '')
FEISHU_WEBHOOK = os.environ.get('FEISHU_WEBHOOK', '')
TG_BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN', '')
...
req = urllib.request.Request(f'https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage', data=data
Recommendation

Only configure webhooks for accounts/chats you trust, keep tokens private, and disable delivery credentials if you want reports to remain local.

What this means

Anyone with access to the local config could misuse configured service tokens or send messages through the connected accounts.

Why it was flagged

The skill can use API keys and webhook tokens. These credentials are optional and align with the advertised integrations, but they grant the skill authority to call external services.

Skill content
"TAVILY_API_KEY": "Optional. Enables Tavily-assisted fallback guidance and monthly hospital lookup hints.",
"DINGTALK_WEBHOOK": "Optional. Enables DingTalk delivery.",
"FEISHU_WEBHOOK": "Optional. Enables Feishu delivery.",
"TELEGRAM_BOT_TOKEN": "Optional. Enables Telegram delivery when TELEGRAM_CHAT_ID is also configured."
Recommendation

Use least-privilege tokens where possible, store config/.env securely, and rotate tokens if the skill folder is shared or exposed.

What this means

If enabled, the skill downloads a font from GitHub during report generation.

Why it was flagged

The PDF generator can download fonts at runtime, but only when ALLOW_RUNTIME_FONT_DOWNLOAD is enabled. This is disclosed and purpose-aligned, yet it relies on remote files.

Skill content
FONT_DOWNLOAD_SOURCES = {
    "zh-CN": "https://raw.githubusercontent.com/tankeito/Health-Mate/main/assets/NotoSansSC-VF.ttf",
    "ja-JP": "https://raw.githubusercontent.com/google/fonts/main/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf",
}
...
if allow_runtime_font_download():
Recommendation

Leave runtime font download disabled unless needed, or manually install trusted font files under assets/.

What this means

Private health reports could become accessible through a public web server if REPORT_WEB_DIR is configured carelessly.

Why it was flagged

The skill supports copying generated PDFs to a directory intended for public serving. This is optional and disclosed, but a misconfigured web directory could expose sensitive reports beyond the local machine.

Skill content
"REPORT_WEB_DIR": "Optional. Local directory where generated PDFs can be copied for public serving.",
"REPORT_BASE_URL": "Optional. Public base URL used to build downloadable PDF links."
Recommendation

Use REPORT_WEB_DIR only for directories with the intended access controls, and verify generated PDF links before sharing them.