Credential Access
- Category
- Privilege Escalation
- Confidence
- 60% confidence
- Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- Content
text .env .DS_Store __pycache__ .pyc
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a disclosed Zoom administration helper that handles sensitive account credentials and meeting data, but its behavior is purpose-aligned and bounded to documented Zoom actions.
Install only if you are comfortable granting a dedicated Zoom Server-to-Server OAuth app access to the needed meeting, user, and recording scopes. Keep .env out of sync tools and repositories, use minimum Zoom scopes, avoid shared machines, and do not enable deletion or recording access unless you actually need them.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
.env
.DS_Store
__pycache__
.pyc
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
.env
.DS_Store
__pycache__
.pyc
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Credentials
> ⚠️ **The `ZOOM_CLIENT_SECRET` in `.env` is equivalent to an account-admin password.** Anyone holding the `ACCOUNT_ID + CLIENT_ID + CLIENT_SECRET` triple can mint a 1-hour account-level access token that reads all meeting metadata, cloud recordings, and can delete meetings.
>
> - Never commit `.env` to git. Confirm your IDE, backup tools, and file-sync services (iCloud / Dropbox / OneDrive / Nutstore) are not auto-uploading it.
> - `chmod 600 .env`. The token cache at `~/.zoom-s2s-token.json` is auto-set to `chmod 600` by the script.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
> - `chmod 600 .env`. The token cache at `~/.zoom-s2s-token.json` is auto-set to `chmod 600` by the script.
> - Use the **minimum scopes** you actually need (see table below). Do not enable `meeting:write:delete`, `cloud_recording:read:*`, or `user:read:list_users` unless required.
> - Create a **dedicated** Server-to-Server App for this skill — do not reuse credentials from other business apps.
> - If leaked: delete the App in Zoom Marketplace → re-create and rotate all four values → `rm -f ~/.zoom-s2s-token.json`.
Edit the `.env` file with your Zoom Server-to-Server OAuth App credentials:
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
> - `chmod 600 .env`。脚本缓存的 token 文件 `~/.zoom-s2s-token.json` 由脚本自动 `chmod 600`。
> - **按需开通最小 scope**(见下表)。未用到的功能不要勾选对应权限;不要轻易开启 `meeting:write:delete`、`cloud_recording:read:*`、`user:read:list_users`。
> - 为本 Skill **单独创建一个** Server-to-Server App,不要复用其他业务 App 的凭据。
> - 一旦泄露:在 Zoom Marketplace 删除该 App → 重新创建并轮换四项值 → `rm -f ~/.zoom-s2s-token.json` 强制重新认证。
编辑 `.env` 文件,填入你的 Zoom Server-to-Server OAuth App 凭证:
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
> - `chmod 600 .env`。脚本缓存的 token 文件 `~/.zoom-s2s-token.json` 由脚本自动 `chmod 600`。
> - **按需开通最小 scope**(见下表)。未用到的功能不要勾选对应权限;不要轻易开启 `meeting:write:delete`、`cloud_recording:read:*`、`user:read:list_users`。
> - 为本 Skill **单独创建一个** Server-to-Server App,不要复用其他业务 App 的凭据。
> - 一旦泄露:在 Zoom Marketplace 删除该 App → 重新创建并轮换四项值 → `rm -f ~/.zoom-s2s-token.json` 强制重新认证。
编辑 `.env` 文件,填入你的 Zoom Server-to-Server OAuth App 凭证:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
zoom-s2s-oauth/ ├── SKILL.md # AI Agent 调用说明 ├── README.md # 本文件 ├── .env # 凭证配置 (不要提交到 git!) └── scripts/ └── zoom-s2s.py # 主脚本 (纯 Python3,无外部依赖)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
zoom-s2s-oauth/ ├── SKILL.md # AI Agent 调用说明 ├── README.md # 本文件 ├── .env # 凭证配置 (不要提交到 git!) └── scripts/ └── zoom-s2s.py # 主脚本 (纯 Python3,无外部依赖)
The skill is explicitly designed to read long-lived Server-to-Server OAuth credentials from a local .env, and the document states these are effectively equivalent to an account administrator password. If the skill, its outputs, logs, or surrounding agent workflow mishandle these values, an attacker could obtain account-wide access to meetings, recordings, and destructive operations.
name: zoom-meeting-admin
allowed-tools: Bash(python3 zoom-s2s.py:*) Read
compatibility: Requires Python 3.7+; performs HTTPS calls to zoom.us and api.zoom.us (network); writes a token cache to ~/.zoom-s2s-token.json (auto chmod 600); reads ZOOM_ACCOUNT_ID / ZOOM_CLIENT_ID / ZOOM_CLIENT_SECRET / ZOOM_USER_ID from a local .env.
description: List, create, delete, and query Zoom meetings, cloud recordings, and account users via a fixed CLI (scripts/zoom-s2s.py, 7 whitelisted actions) using Server-to-Server OAuth. Use when the user asks to schedule, reschedule, cancel, find, or look up a Zoom meeting; set up a recurring Zoom; pull cloud recordings or past meeting metadata; or look up account users. Triggers on phrases like "Zoom meeting", "zoom 会议", "约 Zoom", "取消 Zoom", "录像", "schedule a Zoom", "cancel the meeting", "who's on the call", "云录制". create_meeting requires explicit confirmation of topic, start_time, duration; delete_meeting requires --yes and visible confirmation. Agent must only invoke the 7 whitelisted CLI actions and must not modify the script, import internals, or call Zoom REST directly. Requires .env with ACCOUNT_ID/CLIENT_ID/CLIENT_SECRET/USER_ID. Documentation is in Chinese; outputs follow.
---
> ⚠️ **安全提示 — 凭证等同于账户管理员口令**
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
- 会议:`list_meetings` / `get_meeting` / `create_meeting` / `delete_meeting`
- 用户:`get_user` / `list_users`
- 录像:`recordings`
- **越权防护**:脚本内部包含一个 `api_call` 函数供 CLI action 复用,但这是**私有实现细节,不是对外可调用的接口**。Agent 不得通过以下任何方式旁路调用白名单外的 Zoom 端点(如 `DELETE /users/{id}`、`PATCH /accounts/{id}` 等高风险端点):
- 修改 `scripts/zoom-s2s.py`、新增 CLI action、暴露 `api_call`;
- `from zoom_s2s import api_call` 或以其他方式直接调用脚本内部函数;
- 在调用本 Skill 的同时**另起进程**用相同凭证调任意 Zoom REST API(如 `curl` 直接打 `api.zoom.us`);
The script makes outbound network requests to Zoom OAuth and API endpoints, but the metadata does not declare network capability. In a skill system, undeclared egress is dangerous because it can transmit user-provided meeting data and account metadata externally without the permission model clearly reflecting that behavior.
The script makes outbound network requests to Zoom OAuth and API endpoints, but the metadata does not declare network capability. In a skill system, undeclared egress is dangerous because it can transmit user-provided meeting data and account metadata externally without the permission model clearly reflecting that behavior.
The script makes outbound network requests to Zoom OAuth and API endpoints, but the metadata does not declare network capability. In a skill system, undeclared egress is dangerous because it can transmit user-provided meeting data and account metadata externally without the permission model clearly reflecting that behavior.
The script is designed to access credentials from a local .env file containing Zoom account and client secrets. In an agent skill, direct credential access is security-sensitive because compromise of the skill or surrounding environment would expose API credentials capable of managing meetings and reading account data.
# 配置
# =============================================================================
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
ENV_FILE = os.path.join(SCRIPT_DIR, "..", ".env")
TOKEN_CACHE = os.path.expanduser("~/.zoom-s2s-token.json")
ZOOM_ACCOUNT_ID = ""
The load_env function explicitly loads account ID, client ID, client secret, and user ID into process memory from a local file. This is dangerous in shared or weakly isolated environments because secrets become available to the script and any debugging, logging, or compromise affecting the process.
ZOOM_USER_ID = ""
# =============================================================================
# .env 加载
# =============================================================================
def load_env():
global ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET, ZOOM_USER_ID
Opening and reading the .env file is a concrete credential-access operation, and the file path is predictable relative to the script. In the context of a meeting-administration skill with broad Zoom account powers, plaintext secret retrieval materially increases the blast radius of any local file disclosure or agent misuse.
def load_env():
global ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET, ZOOM_USER_ID
if not os.path.exists(ENV_FILE):
print(f"❌ .env 文件不存在: {ENV_FILE}", file=sys.stderr)
sys.exit(1)
with open(ENV_FILE) as f:
for line in f:
The manifest says the skill must only invoke the fixed CLI in scripts/zoom-s2s.py and must not call Zoom REST directly. README line L03 instead describes the skill as managing Zoom meetings 'REST API directly', which presents a broader and different operational model than the manifest allows.
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.
## Setup Steps
1. Log in to https://marketplace.zoom.us/
2. From the "Develop" dropdown, select "build app" and create an app of type `Server-to-Server OAuth`
3. Add required OAuth Scopes
4. Get the credentials
5. Activate the app
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
---
name: zoom-meeting-admin
allowed-tools: Bash(python3 zoom-s2s.py:*) Read
compatibility: Requires Python 3.7+; performs HTTPS calls to zoom.us and api.zoom.us (network); writes a token cache to ~/.zoom-s2s-token.json (auto chmod 600); reads ZOOM_ACCOUNT_ID / ZOOM_CLIENT_ID / ZOOM_CLIENT_SECRET / ZOOM_USER_ID from a local .env.
description: List, create, delete, and query Zoom meetings, cloud recordings, and account users via a fixed CLI (scripts/zoom-s2s.py, 7 whitelisted actions) using Server-to-Server OAuth. Use when the user asks to schedule, reschedule, cancel, find, or look up a Zoom meeting; set up a recurring Zoom; pull cloud recordings or past meeting metadata; or look up account users. Triggers on phrases like "Zoom meeting", "zoom 会议", "约 Zoom", "取消 Zoom", "录像", "schedule a Zoom", "cancel the meeting", "who's on the call", "云录制". create_meeting requires explicit confirmation of topic, start_time, duration; delete_meeting requires --yes and visible confirmation. Agent must only invoke the 7 whitelisted CLI actions and must not modify the script, import internals, or call Zoom REST directly. Requires .env with ACCOUNT_ID/CLIENT_ID/CLIENT_SECRET/USER_ID. Documentation is in Chinese; outputs follow.
---
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
---
name: zoom-meeting-admin
allowed-tools: Bash(python3 zoom-s2s.py:*) Read
compatibility: Requires Python 3.7+; performs HTTPS calls to zoom.us and api.zoom.us (network); writes a token cache to ~/.zoom-s2s-token.json (auto chmod 600); reads ZOOM_ACCOUNT_ID / ZOOM_CLIENT_ID / ZOOM_CLIENT_SECRET / ZOOM_USER_ID from a local .env.
description: List, create, delete, and query Zoom meetings, cloud recordings, and account users via a fixed CLI (scripts/zoom-s2s.py, 7 whitelisted actions) using Server-to-Server OAuth. Use when the user asks to schedule, reschedule, cancel, find, or look up a Zoom meeting; set up a recurring Zoom; pull cloud recordings or past meeting metadata; or look up account users. Triggers on phrases like "Zoom meeting", "zoom 会议", "约 Zoom", "取消 Zoom", "录像", "schedule a Zoom", "cancel the meeting", "who's on the call", "云录制". create_meeting requires explicit confirmation of topic, start_time, duration; delete_meeting requires --yes and visible confirmation. Agent must only invoke the 7 whitelisted CLI actions and must not modify the script, import internals, or call Zoom REST directly. Requires .env with ACCOUNT_ID/CLIENT_ID/CLIENT_SECRET/USER_ID. Documentation is in Chinese; outputs follow.
---
The manifest description says the skill triggers on phrases like "cancel the meeting" and "who's on the call", which are common expressions that may refer to non-Zoom contexts. Although some examples are Zoom-specific, these broad phrases weaken trigger specificity and could cause unintended invocation.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
> 本 Skill 通过 `.env` 中的 `ZOOM_CLIENT_SECRET` 等 Server-to-Server OAuth 凭证访问 Zoom 账户。
> `ACCOUNT_ID + CLIENT_ID + CLIENT_SECRET` 三元组可换取 1 小时有效的账户级访问令牌,**能够读取该账户下所有会议元数据、云录像,并执行删除等破坏性操作**。
>
> **使用前请先完整阅读 [`## 凭证安全`](#凭证安全)**,遵守 `.gitignore`、`chmod 600`、最小 scope、专用 App、泄露应急等要求。
> 任何**修改脚本、import 内部函数、构造任意 payload 调用 `api_call`** 的尝试都构成越权,会被本文档明确禁止。
# Zoom Server-to-Server OAuth REST API
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
> 本 Skill 通过 `.env` 中的 `ZOOM_CLIENT_SECRET` 等 Server-to-Server OAuth 凭证访问 Zoom 账户。
> `ACCOUNT_ID + CLIENT_ID + CLIENT_SECRET` 三元组可换取 1 小时有效的账户级访问令牌,**能够读取该账户下所有会议元数据、云录像,并执行删除等破坏性操作**。
>
> **使用前请先完整阅读 [`## 凭证安全`](#凭证安全)**,遵守 `.gitignore`、`chmod 600`、最小 scope、专用 App、泄露应急等要求。
> 任何**修改脚本、import 内部函数、构造任意 payload 调用 `api_call`** 的尝试都构成越权,会被本文档明确禁止。
# Zoom Server-to-Server OAuth REST API
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
> 本 Skill 通过 `.env` 中的 `ZOOM_CLIENT_SECRET` 等 Server-to-Server OAuth 凭证访问 Zoom 账户。
> `ACCOUNT_ID + CLIENT_ID + CLIENT_SECRET` 三元组可换取 1 小时有效的账户级访问令牌,**能够读取该账户下所有会议元数据、云录像,并执行删除等破坏性操作**。
>
> **使用前请先完整阅读 [`## 凭证安全`](#凭证安全)**,遵守 `.gitignore`、`chmod 600`、最小 scope、专用 App、泄露应急等要求。
> 任何**修改脚本、import 内部函数、构造任意 payload 调用 `api_call`** 的尝试都构成越权,会被本文档明确禁止。
# Zoom Server-to-Server OAuth REST API
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
> 本 Skill 通过 `.env` 中的 `ZOOM_CLIENT_SECRET` 等 Server-to-Server OAuth 凭证访问 Zoom 账户。
> `ACCOUNT_ID + CLIENT_ID + CLIENT_SECRET` 三元组可换取 1 小时有效的账户级访问令牌,**能够读取该账户下所有会议元数据、云录像,并执行删除等破坏性操作**。
>
> **使用前请先完整阅读 [`## 凭证安全`](#凭证安全)**,遵守 `.gitignore`、`chmod 600`、最小 scope、专用 App、泄露应急等要求。
> 任何**修改脚本、import 内部函数、构造任意 payload 调用 `api_call`** 的尝试都构成越权,会被本文档明确禁止。
# Zoom Server-to-Server OAuth REST API
No suspicious patterns detected.