Back to skill

Security audit

abe-diet-tracker

Security checks for vulnerabilities and agentic risk

Overview

The diet tracker has a coherent core purpose, but it also performs undisclosed Obsidian and GitHub synchronization that can upload sensitive or unrelated files.

Review this skill before installing. Use it only if you are comfortable sending meal queries to SkillBoss and storing diet data locally, and remove or explicitly configure the Obsidian/Git synchronization path so it cannot stage and push unrelated private notes.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/update_memory.py:152
Finding

Undisclosed Bulk Data Exfiltration Through Automatic Git Synchronization

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/get_food_nutrition.py:47
Finding

Sensitive Health and Profile Data Exposed in Execution Logs

Content
View full analysis
Remediation
View remediation

other

Warning
Location
scripts/update_memory.py:119
Finding

Meal Nutrition Values Are Double-Counted in Daily Totals

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (24)

Tainted flow: 'SKILLBOSS_API_KEY' from os.environ (line 6, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/get_food_nutrition.py (reported line 10)May include surrounding context.

python
API_BASE = "https://api.heybossai.com/v1"

def pilot(body: dict) -> dict:
    r = requests.post(
        f"{API_BASE}/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json=body,

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This mismatch includes local persistence to multiple paths, copying into an Obsidian vault, and git add/commit/push operations to GitHub, none of which are disclosed in the skill description. For a diet skill containing health-related data, silent synchronization or publication creates a severe confidentiality risk because personal dietary and body-profile information could be stored or propagated outside the user's expected boundary.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This mismatch includes local persistence to multiple paths, copying into an Obsidian vault, and git add/commit/push operations to GitHub, none of which are disclosed in the skill description. For a diet skill containing health-related data, silent synchronization or publication creates a severe confidentiality risk because personal dietary and body-profile information could be stored or propagated outside the user's expected boundary.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
100% confidence
Finding

The script stores daily diet records locally and then copies and publishes them to a remote GitHub repository. Because diet logs can contain sensitive health-related information and lifestyle patterns, this behavior creates a clear confidentiality risk that is disproportionate to the stated purpose of the skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

A diet tracker has no obvious need to run multiple subprocess-based git add/commit/pull/push operations as part of routine meal logging. In this context, the command sequence is dangerous because it operationalizes remote synchronization of sensitive records and expands the attack surface beyond what the feature requires.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill declares access to environment secrets but does not declare any explicit tool scope despite behavior that implies file reads/writes, network access, and shell execution. In a health-tracking skill, this is dangerous because it handles sensitive profile and diet data while leaving the effective privilege boundary undefined, increasing the risk of unexpected data access, exfiltration, or command execution through companion scripts.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Overly broad trigger conditions can cause the skill to activate on ordinary conversation about food or dieting without clear intent to log sensitive health data. In this context, unintended invocation matters because activation may lead to reading profile files, storing meal history, or contacting external services based on casual user statements.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill describes autonomous cron-based reminders without a clear user-facing warning or consent model for background behavior. Autonomous activation is risky in a personal health context because it can read logs, infer missed meals, or generate messages without a contemporaneous user request.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The example trigger phrases are everyday language and lack constraints that distinguish casual discussion from a request to persist or analyze health information. This can lead to accidental data collection or status calculations from ambiguous user messages, which is especially problematic for a skill touching sensitive diet and body metrics.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill reads and stores sensitive health/profile data, but the description does not provide a clear user warning about that access and retention. Because calorie targets, body metrics, and activity level can reveal health status, lack of notice undermines informed consent and increases privacy risk if the data is stored, synced, or exposed.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/get_food_nutrition.py (reported line 7)May include surrounding context.

python
import os

SKILLBOSS_API_KEY = os.environ["SKILLBOSS_API_KEY"]
API_BASE = "https://api.heybossai.com/v1"

def pilot(body: dict) -> dict:
    r = requests.post(

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill sends user-provided food items to a third-party API for nutrition lookup, but the manifest does not disclose this network transfer. In a diet-tracking context, meal data can reveal sensitive health, religious, cultural, or medical information, so undisclosed external transmission raises a meaningful privacy concern.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This is an external transmission of user-supplied meal information to a third-party service. In the context of a diet-tracking skill, food entries can be sensitive personal data, so sending them externally without transparent disclosure or consent presents a privacy vulnerability even if the destination is legitimate.

Content

Scanner excerpt · scripts/get_food_nutrition.py (reported line 10)May include surrounding context.

python
API_BASE = "https://api.heybossai.com/v1"

def pilot(body: dict) -> dict:
    r = requests.post(
        f"{API_BASE}/pilot",
        headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"},
        json=body,

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill reads broad health-profile data from a global user file, including age, sex, activity level, and macro targets, even though the stated functionality is meal logging and nutrition tracking. This creates unnecessary access to sensitive personal and health-related data, increasing privacy risk if the file is exposed, reused elsewhere, or later transmitted without clear consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script reads personal health data from /root/clawd/USER.md, including height, weight, age, gender, and activity-related information, then incorporates user-provided food queries into a remote requests.post call via the SkillBoss API. While the network call exists, the code provides no disclosure that external transmission occurs and no comment/docstring warning users about this behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code hard-codes Chinese-only regex patterns for nutritional targets and later emits Chinese-language summaries and status messages. This creates a locale policy issue because the skill implicitly requires Chinese-formatted input and Chinese output, with no choice or opt-in for users in other languages.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/update_memory.py (reported line 165)May include surrounding context.

python
date_str = now.strftime("%Y-%m-%d")

            # Git add, commit, push
            subprocess.run(["git", "-C", obsidian_dir, "add", "-A"], check=True, capture_output=True)
            subprocess.run(["git", "-C", obsidian_dir, "commit", "-m", f"Update diet log for {date_str}", "--allow-empty"], check=False, capture_output=True)
            result = subprocess.run(["git", "-C", obsidian_dir, "push", "origin", "master"], check=False, capture_output=True, text=True)
            if result.returncode == 0:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/update_memory.py (reported line 166)May include surrounding context.

python
# Git add, commit, push
            subprocess.run(["git", "-C", obsidian_dir, "add", "-A"], check=True, capture_output=True)
            subprocess.run(["git", "-C", obsidian_dir, "commit", "-m", f"Update diet log for {date_str}", "--allow-empty"], check=False, capture_output=True)
            result = subprocess.run(["git", "-C", obsidian_dir, "push", "origin", "master"], check=False, capture_output=True, text=True)
            if result.returncode == 0:
                print(f"✅ 已推送到 GitHub")

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
98% confidence
Finding

This call pushes the diet log repository to a remote GitHub origin, which can disclose sensitive personal health and behavioral data outside the local system. In the context of a diet-tracking skill, automatic remote publication is especially risky because meal logs, calorie targets, and notes may reveal health status, routines, and other private information without explicit per-use consent.

Content

Scanner excerpt · scripts/update_memory.py (reported line 167)May include surrounding context.

python
# Git add, commit, push
            subprocess.run(["git", "-C", obsidian_dir, "add", "-A"], check=True, capture_output=True)
            subprocess.run(["git", "-C", obsidian_dir, "commit", "-m", f"Update diet log for {date_str}", "--allow-empty"], check=False, capture_output=True)
            result = subprocess.run(["git", "-C", obsidian_dir, "push", "origin", "master"], check=False, capture_output=True, text=True)
            if result.returncode == 0:
                print(f"✅ 已推送到 GitHub")
            else:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
96% confidence
Finding

Automatically pulling from a remote and rebasing introduces an unnecessary network interaction and trust boundary for a local diet log. It increases exposure to unintended data synchronization, remote repository tampering effects, and silent propagation of sensitive records in a skill whose primary purpose does not justify remote VCS operations.

Content

Scanner excerpt · scripts/update_memory.py (reported line 172)May include surrounding context.

python
print(f"✅ 已推送到 GitHub")
            else:
                # Try pull and push again
                subprocess.run(["git", "-C", obsidian_dir, "pull", "origin", "master", "--rebase"], check=False, capture_output=True)
                subprocess.run(["git", "-C", obsidian_dir, "push", "origin", "master"], check=False, capture_output=True)
                print(f"✅ 已推送到 GitHub (after rebase)")
        except Exception as e:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
98% confidence
Finding

This second push attempt again transmits the diet log to a remote repository, reinforcing the privacy and exfiltration risk. Retrying automatically after a pull/rebase makes remote publication more persistent and harder for a user to notice or control.

Content

Scanner excerpt · scripts/update_memory.py (reported line 173)May include surrounding context.

python
else:
                # Try pull and push again
                subprocess.run(["git", "-C", obsidian_dir, "pull", "origin", "master", "--rebase"], check=False, capture_output=True)
                subprocess.run(["git", "-C", obsidian_dir, "push", "origin", "master"], check=False, capture_output=True)
                print(f"✅ 已推送到 GitHub (after rebase)")
        except Exception as e:
            print(f"⚠️ GitHub 推送失败: {e}")

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The cron system event names are specified only in Chinese, which imposes a locale/language requirement without user opt-in or documented justification. This may violate language/locale policy expectations for skills that should not force a specific language implicitly.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This JSON file contains only Chinese-language food names for the primary dataset entries, which can impose a specific language/locale on downstream users or systems. Under the policy, a language constraint should either provide user choice or be clearly documented and justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file assumes a Chinese-language profile format in USER.md and also sends a Chinese-only prompt to the external model for nutrition lookup. There is no user opt-in or configurable language/locale selection, which can violate language-choice policy for general-purpose skills.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.