Back to skill

Security audit

social-media-favorites-archiver

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent, but it needs review because it installs and runs an external GitHub CLI by tag while using an authenticated browser session.

Install only if you trust the external GitHub project and maintainer, or prefer a reviewed full commit SHA or signed release with a published digest. Use a dedicated browser profile and user-owned vault/cache paths, keep cookies and platform tokens out of configs and logs, and enable enrichment or scheduling only when you explicitly want those features.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:34
Finding

Externally Hosted CLI Is Installed and Executed Without Immutable Integrity Verification

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:34-39
Vulnerability Type: Remote payload retrieval and execution without immutable verification
Risk Level: High

Vulnerable Code:

markdown
## Install the CLI

If `smfa` is not already available, install the immutable public release. Copy and run exactly this command; do not substitute a PyPI package spec, branch, or other source:

```bash
uv tool install git+https://github.com/dvlin-dev/social-media-favorites-archiver.git@v1.0.4
text

### Technical Analysis

The Skill instructs the Agent to retrieve and install executable code directly from an external Git repository. Although the Git reference uses a version tag rather than a moving branch, a tag is not an immutable cryptographic identity and can potentially be moved or replaced by an upstream maintainer or an attacker who compromises the repository.

The audited project contains documentation only and does not include the installed application's source code. It also provides no full commit SHA, artifact digest, signature, trusted release manifest, or reproducible-build verification procedure. Consequently, the effective executable payload is outside the audited bundle and may differ between the time of review and installation.

The statement that this is an “immutable public release” is therefore not technically enforced by the installation command. The security properties documented elsewhere in the Skill—such as sanitized logging, constrained browser access, safe cleanup, and restricted enrichment—cannot be independently verified against the remotely retrieved implementation.

### Attack Path

1. An attacker compromises the upstream GitHub repository, an authorized maintainer account, or the release-tag management process.
2. The attacker moves or recreates the `v1.0.4` tag so that it resolves to a malicious commit.
3. A user or Agent follows the Skill instructions and runs:
   `uv tool install 
...[truncated 1472 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin the dependency to a full, reviewed Git commit SHA instead of a mutable tag:

    bash
    uv tool install git+https://github.com/dvlin-dev/social-media-favorites-archiver.git@FULL_REVIEWED_COMMIT_SHA
    
  2. Prefer a versioned release artifact with a published SHA-256 or stronger digest. Require users or the installer to verify the digest before installation.

  3. Sign release artifacts and provenance metadata using a verifiable mechanism such as Sigstore, and document mandatory signature verification steps.

  4. Include the executable application's source in the audited bundle, or provide a direct reference to the exact reviewed commit and a reproducible-build process that proves the installed artifact corresponds to that source.

  5. Fail closed if integrity verification cannot be completed. Do not silently fall back to a branch, unpinned package version, alternate repository, or unsigned artifact.

  6. Run the CLI with least privilege and isolate it from unrelated files and credentials. Limit the dedicated browser profile, vault, state database, and cache permissions to the minimum required paths.

  7. Keep optional enrichment credentials out of the environment unless enrichment is actively requested, thereby reducing the impact of a compromised installation.

Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 41)May include surrounding context.

macOS LaunchAgent

Save as ~/Library/LaunchAgents/dev.smfa.sync.plist, then load it with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.smfa.sync.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 45)May include surrounding context.

macOS LaunchAgent

Save as ~/Library/LaunchAgents/dev.smfa.sync.plist, then load it with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.smfa.sync.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 46)May include surrounding context.

macOS LaunchAgent

Save as ~/Library/LaunchAgents/dev.smfa.sync.plist, then load it with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.smfa.sync.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 61)May include surrounding context.

macOS LaunchAgent

Save as ~/Library/LaunchAgents/dev.smfa.sync.plist, then load it with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.smfa.sync.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 45)May include surrounding context.

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>dev.smfa.sync</string>

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/troubleshooting.md (reported line 92)May include surrounding context.

WantedBy=timers.target

text

Enable it with `systemctl --user daemon-reload && systemctl --user enable --now smfa-sync.timer`. Inspect only sanitized application reports with `smfa status --json` and `smfa report --json`.

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 14)May include surrounding context.

text
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

Static analysis

No suspicious patterns detected.