Back to skill

Security audit

MooTeam CRM

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent MooTeam API integration, but it can change and delete company project data and one documented deletion safeguard is not actually enforced.

Install only if you are comfortable giving this skill a MooTeam token that can modify or delete business data. Prefer a least-privileged token, review destructive commands before running them, and treat project deletion as unsafe until the --force check or stronger confirmation is enforced.

Vulnerability Patterns
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:2
Finding

Unpinned Third-Party Dependencies Permit Unreviewed Package Versions

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:2-8
Vulnerability Type: Unpinned third-party dependencies and unnecessary dependency exposure
Risk Level: Medium

Vulnerable code:

text
requests>=2.31.0
python-dotenv>=1.0.0
rich>=13.0.0

The installation instructions in SKILL.md:25-27 direct users to install these dependencies:

text
python3 -m pip install -r skills/mooteam/requirements.txt

Technical Analysis

Each dependency uses only a minimum-version constraint. Pip may therefore install any later release available at installation time, including versions that were not present during this audit. The project does not provide a lock file, exact version constraints, or cryptographic hashes to establish that users install the same reviewed artifacts.

Python packages and their build systems can execute code during installation. Imported packages also execute module initialization code with the privileges and environment of the Agent process. A compromised permitted release could consequently access environment variables, including MOOTEAM_API_TOKEN and MOOTEAM_COMPANY_ALIAS, or modify local data accessible to the process.

python-dotenv is declared but is not imported or otherwise used by the reviewed Python scripts. This unnecessary dependency increases the supply-chain attack surface without providing functionality to the current implementation.

This finding does not establish that the currently available versions are malicious. The risk arises because future, unreviewed versions are automatically eligible for installation.

Attack Path

  1. An attacker compromises the publishing account or release process of one of the permitted packages.
  2. The attacker publishes a malicious version whose version number satisfies the lower-bound-only constraint.
  3. A user follows the documented installation command without a previously locked dependency environment.

...[truncated 811 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin every runtime dependency to an exact version that has been reviewed and tested.
  2. Generate a hash-locked requirements file, for example with pip-compile --generate-hashes, and install with pip install --require-hashes.
  3. Maintain a lock file through a controlled dependency-update process that includes security review and automated testing.
  4. Remove python-dotenv unless the application is updated to use it intentionally.
  5. Install dependencies in a dedicated virtual environment under a non-privileged account.
  6. Run dependency vulnerability and provenance checks in CI before publishing the Skill.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/main.py:190
Finding

Project Deletion Bypasses the Declared Force Safeguard

Content
View full analysis

Vulnerability Details

File Location: scripts/main.py:29-31, 190-191
Vulnerability Type: Missing authorization-style confirmation check for a destructive operation
Risk Level: Medium

Argument declaration:

python
pd = subparsers.add_parser("project-delete")
pd.add_argument("--id", type=int, required=True)
pd.add_argument("--force", action="store_true")

Destructive command handling:

python
elif args.command == "project-delete":
    result = client.delete_project(args.id)

The documented command in SKILL.md:86 also presents --force as part of the deletion interface:

text
python3 scripts/main.py project-delete --id PROJECT_ID --force

Technical Analysis

The parser defines --force as an optional Boolean flag, but the command-dispatch logic never reads args.force. As a result, the CLI accepts project-delete --id ID and immediately invokes client.delete_project(args.id).

The client method sends an authenticated HTTP DELETE request to the MooTeam project endpoint. There is no local confirmation, force check, or other safeguard between parsing the project ID and issuing the request. The presence and documentation of --force creates a misleading expectation that deletion is blocked unless the caller explicitly acknowledges the destructive action.

This flaw is particularly relevant in an Agent-operated CLI because malformed requests, misunderstood user intent, or prompt-induced commands can invoke destructive functionality without the apparent safety flag.

Attack Path

  1. An Agent, user, or attacker influencing Agent input causes the CLI to run project-delete --id 123 without --force.
  2. argparse accepts the command because --force is not declared as required.
  3. The dispatch branch reaches client.delete_project(args.id) without checking args.force.
  4. MooTeamClient.delete_project issues an authenticated DELETE request to `/proje ...[truncated 612 chars]
Remediation
View remediation

Remediation Suggestions

  1. Refuse deletion unless the force flag is explicitly supplied:
    python
    elif args.command == "project-delete":
        if not args.force:
            parser.error("project-delete requires --force")
        result = client.delete_project(args.id)
    
  2. For Agent use, require a separate explicit confirmation value tied to the target project ID rather than relying only on a generic Boolean flag.
  3. Retrieve and display the project's identity before deletion so the caller can verify the target.
  4. Require explicit user confirmation immediately before destructive API calls.
  5. Add automated tests confirming that omission of --force results in no HTTP request.
  6. Apply equivalent confirmation controls consistently to other destructive commands, including task, comment, workflow, status, label, time-log, and team-mapping deletion operations.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (47)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 37)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 66)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 78)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 82)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 83)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 84)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 85)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 86)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 87)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 88)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 92)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 93)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 94)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 95)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 96)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 100)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 101)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 102)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 106)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 108)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 112)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 113)May include surrounding context.

md
`python3 scripts/main.py <command> [args]`

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
# Основная библиотека для HTTP-запросов
requests>=2.31.0

# Работа с переменными окружения из .env файла
python-dotenv>=1.0.0

# Опционально: для более красивого вывода JSON в консоль при отладке

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.