Back to skill

Security audit

Things Mac

Security checks for vulnerabilities and agentic risk

Overview

This Things 3 helper is mostly coherent, but it asks users to grant broad macOS Full Disk Access and shows risky token-handling examples for a task-management integration.

Review this skill before installing. Prefer pinning the CLI to a reviewed version, use THINGSDB or --db for a narrowly selected Things database when possible, avoid putting real auth tokens directly in commands, and revoke Full Disk Access after use if you grant it at all.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:14
Finding
Excessive Full Disk Access Granted to the Calling Application## Vulnerability Details **File Location**: `SKILL.md`, line 14 **Vulnerability Type**: Excessive system permission request **Risk Level**: High **Vulnerable Code Snippet**: ```markdown - If DB reads fail: grant **Full Disk Access** to the calling app (Terminal for manual runs; `Clawdbot.app` for gateway runs). ``` ### Technical Analysis The setup instructions recommend granting macOS Full Disk Access to the entire calling application when database reads fail. This permission is not limited to the Things database: it allows the authorized application and code operating within its process context to access a broad range of privacy-protected files. Consequently, every skill, dependency, plugin, or other component operating through the authorized agent may inherit access substantially beyond what is necessary to manage Things data. This violates the principle of least privilege and magnifies the consequences of a compromised dependency or agent component. ### Attack Path 1. A user follows the setup instruction and grants Full Disk Access to Terminal or `Clawdbot.app`. 2. The calling application obtains access to protected files outside the Things database. 3. A compromised dependency, malicious skill, or unrelated vulnerable component executes in the authorized application context. 4. That component reads protected data using the application's inherited permissions. 5. The accessed information may subsequently be disclosed, modified, or otherwise misused. ### Impact Assessment Exploitation could expose protected user data such as mail, messages, browser information, application databases, backups, and other private files accessible through Full Disk Access. The exact scope depends on macOS privacy controls and the identity of the authorized application, but it materially exceeds the access needed for the stated task-management functionality.
Remediation
## Remediation Suggestions - Avoid presenting Full Disk Access as routine setup. - Prefer narrowly scoped authorization to the specific `ThingsData-*` directory when supported. - Allow the user to configure `THINGSDB` or `--db` to select an explicitly authorized database location. - If Full Disk Access is technically unavoidable, clearly explain its full security impact and require explicit user confirmation. - Recommend a dedicated, minimally privileged helper process rather than granting broad access to a general-purpose terminal or agent application. - Advise users to revoke the permission after use and periodically review authorized applications in macOS Privacy and Security settings.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:5
Finding
Mutable Third-Party CLI Installed Using an Unpinned Latest Version## Vulnerability Details **File Location**: `SKILL.md`, lines 5 and 13 **Vulnerability Type**: Unpinned executable supply-chain dependency **Risk Level**: Medium **Vulnerable Code Snippets**: ```markdown metadata: {"clawdbot":{"emoji":"✅","os":["darwin"],"requires":{"bins":["things"]},"install":[{"id":"go","kind":"go","module":"github.com/ossianhempel/things3-cli/cmd/things@latest","bins":["things"],"label":"Install things3-cli (go)"}]}} ``` ```markdown - Install (recommended, Apple Silicon): `GOBIN=/opt/homebrew/bin go install github.com/ossianhempel/things3-cli/cmd/things@latest` ``` ### Technical Analysis Both the installation metadata and manual setup instructions use the mutable `@latest` version selector. This causes installation to compile and install whichever upstream version is considered current at installation time. The installed code can therefore change after this skill has been reviewed without any corresponding modification to `SKILL.md`. The declared repository is consistent with the skill's homepage, and the reviewed file does not demonstrate that the upstream project is currently malicious. The vulnerability is the absence of an immutable version, reviewed commit, or integrity verification. A compromised upstream maintainer account, repository, release process, or dependency could result in arbitrary code being installed under the legitimate `things` command name. ### Attack Path 1. An attacker compromises the upstream repository, maintainer account, release pipeline, or a transitive dependency. 2. The attacker publishes malicious code that resolves through `@latest`. 3. A user or automated installer executes the documented `go install ...@latest` operation. 4. Go downloads, compiles, and installs the modified executable. 5. The agent invokes `things`, causing the malicious code to execute with the user's privileges. 6. If the calling application has also been granted Full Disk Access, the compro ...[truncated 442 chars]
Remediation
## Remediation Suggestions - Replace `@latest` with a reviewed, immutable release version or commit hash. - Maintain the same pinned version in both installation metadata and documentation. - Record and verify expected source or binary checksums where the installation workflow supports integrity verification. - Review direct and transitive dependencies before updating the pinned revision. - Perform updates through an explicit security review process rather than resolving new upstream code automatically. - Document the trusted repository and release provenance so users can independently verify the installation source.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:47
Finding
Authentication Token Exposed Through Command-Line Arguments## Vulnerability Details **File Location**: `SKILL.md`, lines 47-55 **Vulnerability Type**: Sensitive credential exposure **Risk Level**: Medium **Vulnerable Code Snippet**: ```markdown Examples: modify a todo (needs auth token) - First: get the ID (UUID column): `things search "milk" --limit 5` - Auth: set `THINGS_AUTH_TOKEN` or pass `--auth-token <TOKEN>` - Title: `things update --id <UUID> --auth-token <TOKEN> "New title"` - Notes replace: `things update --id <UUID> --auth-token <TOKEN> --notes "New notes"` - Notes append/prepend: `things update --id <UUID> --auth-token <TOKEN> --append-notes "..."` / `--prepend-notes "..."` - Move lists: `things update --id <UUID> --auth-token <TOKEN> --list "Travel" --heading "Before"` - Tags replace/add: `things update --id <UUID> --auth-token <TOKEN> --tags "a,b"` / `things update --id <UUID> --auth-token <TOKEN> --add-tags "a,b"` - Complete/cancel (soft-delete-ish): `things update --id <UUID> --auth-token <TOKEN> --completed` / `--canceled` - Safe preview: `things --dry-run update --id <UUID> --auth-token <TOKEN> --completed` ``` ### Technical Analysis The examples repeatedly encourage users to substitute a real authentication token into the `--auth-token` command-line argument. Secrets passed this way may be exposed through shell history, terminal scrollback, agent command logs, telemetry, diagnostic records, or operating-system process inspection. The document mentions the `THINGS_AUTH_TOKEN` environment variable as an alternative, but it continues to feature token-bearing command lines throughout the examples. Environment variables also require careful handling because they may be inherited by child processes or captured in diagnostics, although they generally avoid direct command-line argument exposure. ### Attack Path 1. A user replaces `<TOKEN>` with a valid Th ...[truncated 779 chars]
Remediation
## Remediation Suggestions - Remove examples that place authentication tokens directly in command-line arguments. - Prefer secure credential storage such as macOS Keychain, with the CLI retrieving the token at runtime. - If supported, accept the token through protected standard input or a dedicated file descriptor rather than process arguments. - If `THINGS_AUTH_TOKEN` must be used, scope it to a single process, prevent logging, and unset it immediately afterward. - Ensure the agent redacts authentication values from command previews, execution logs, telemetry, errors, and dry-run output. - Document token rotation and revocation procedures for users who suspect exposure. - Restrict access to any shell history or log files that may already contain token-bearing commands.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep

Static analysis

No suspicious patterns detected.