Back to skill

Security audit

Zulip

Security checks for vulnerabilities and agentic risk

Overview

This is a straightforward Zulip integration skill whose chat and file-sharing powers are disclosed and aligned with its purpose, but users should handle API keys and private messages carefully.

Install only if you intend to let the agent act through a Zulip bot account. Use a least-privilege bot, keep `zuliprc` out of source control, restrict its file permissions, avoid pasting real API keys into shell history or shared logs, and confirm before reading private messages, sending DMs, posting to streams, or uploading files.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:13
Finding
Unpinned Third-Party Zulip Dependency## Vulnerability Details **File Location**: `SKILL.md`, lines 13–17 **Vulnerability Type**: Unpinned third-party dependency installation **Risk Level**: Medium **Vulnerable Code**: ```markdown ### 1. Install Python Client ```bash pip install zulip ``` ``` ### Technical Analysis The installation command retrieves the latest available release of the `zulip` package from pip's configured package index without enforcing a reviewed version or validating package hashes. The project does not provide a lockfile, version constraint, hash verification, or trusted-index requirement. Consequently, the code installed by users can change after this project has been audited. If the upstream package, maintainer account, package repository, or local pip index configuration is compromised, following the documented setup instructions could install and execute attacker-controlled package code. This is a supply-chain weakness rather than evidence that the current `zulip` package is malicious. ### Attack Path 1. An attacker compromises the upstream package, its publisher account, the configured package index, or another relevant distribution channel. 2. The attacker publishes or serves a malicious release under the expected `zulip` package name. 3. A user follows the setup instructions and runs `pip install zulip`. 4. Pip resolves the mutable package name to the attacker-controlled release because no reviewed version or hash is enforced. 5. Malicious installation or runtime code executes with the privileges of the user running pip. 6. Depending on those privileges and the environment, the malicious package could access user-readable files, Zulip credentials, environment variables, or data available to the Python process. ### Impact Assessment Successful exploitation permits arbitrary Python code execution with the privileges of the installing or executing user. The accessible scope may include the user's files, environment variabl ...[truncated 311 chars]
Remediation
## Remediation Suggestions - Pin the dependency to a specifically reviewed version, for example `zulip==<reviewed-version>`. - Maintain dependencies in a lockfile or hashed requirements file and install them with hash verification, such as `pip install --require-hashes -r requirements.txt`. - Record and review package provenance, including the expected official package index. - Use `--index-url` with an approved HTTPS repository where organizational policy requires a controlled source. - Install the dependency inside a dedicated virtual environment rather than the system Python environment. - Add automated dependency vulnerability and integrity scanning to the release process. - Review and deliberately update the pinned package version instead of automatically consuming future releases.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (6)

Exfiltration Commands

High
Category
Prompt Injection
Content
---
name: zulip
description: Interact with Zulip chat platform via REST API and Python client. Use when you need to read messages from streams/topics, send messages to channels or users, manage DM conversations, list users, or integrate with Zulip organizations for team communication workflows.
---

# Zulip Integration
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Session Persistence

Medium
Category
Rogue Agent
Content
pip install zulip
```

### 2. Create Configuration File

Create `~/.config/zulip/zuliprc`:
Confidence
60% 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.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The setup and curl examples show API email/key usage and storing credentials in a local config file, but they do not warn about secret handling, shell history exposure, file permissions, or avoiding hardcoding tokens. This can lead users to leak long-lived Zulip credentials through copied commands, repositories, screenshots, or permissive local files.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill explicitly documents reading private messages and sending direct messages, but it provides no warning that these actions may access or transmit sensitive interpersonal communications. In a team-chat integration, DMs commonly contain credentials, HR information, incidents, or other confidential data, so omission of privacy guidance can lead to accidental over-collection or disclosure.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Content
```python
with open("file.pdf", "rb") as f:
    result = client.upload_file(f)
    file_url = result["uri"]

# Share in message
Confidence
55% confidence
Finding
Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Missing User Warnings

Low
Confidence
81% confidence
Finding
This markdown file includes examples for reading messages, sending private messages, and listing users with emails, but it does not warn that these operations may access or transmit private conversation data and personal information. Under the markdown-specific SQP-2 criteria, documentation should disclose behaviors that could affect user privacy or user data.

Static analysis

No suspicious patterns detected.