The skill is critically insecure, exhibiting SQL injection, SSRF vulnerabilities, unconstrained network access, and insecure secret handling while failing to pin dependencies or declare necessary security capabilities.
npx skills add https://github.com/anthropics/knowledge-work-pluginsEnvironment secret flows to a network sink (JS/TS)
taint source (line 27): process.env.ZOOM_BOT_JID → sink: fetch('https://api.zoom.us/v2/im/chat/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
robot_jid: process.env.ZOOM_BOT_JID,
to_jid: payload.toJid, // From webhook
account_id: payload.accountId, // From webhook
content: {
head: {
text: 'Build Notification',
sub_head: { text: 'CI/CD Pipeline' }
},
body: [
{ type: 'message', text: 'Deployment successful!' },
{
type: 'fields',
items: [
{ key: 'Branch', value: 'main' },
{ key: 'Commit', value: 'abc123' }
]
},
{
type: 'actions',
items: [
{ text: 'View Logs', value: 'view_logs', style: 'Primary' },
{ text: 'Dismiss', value: 'dismiss', style: 'Default' }
]
}
]
}
})
})The provided webhook verification example uses string concatenation for the message payload, which can lead to signature bypass if the JSON serialization is non-deterministic or if the input is manipulated. [severity raised to high: this vector is independently flagged by both deterministic and LLM analysis (ADR-0065 corroboration).]
const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`;The skill encourages users to manage multiple sensitive credentials (Client Secret, Secret Token, Bot JID) in environment variables, which are often logged or exposed in CI/CD environments if not handled with strict secret management.
Required Credentials table in SKILL.md
Outbound network request primitive in skill code — can transmit data externally
fetch('https://api.zoom.us/v2/chat/users/me/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
message: 'Hello from CI/CD pipeline!',
to_channel: 'CHANNEL_ID'
})
})Outbound network request primitive in skill code — can transmit data externally (seen 2 times in this file at lines 7, 20)
fetch('https://zoom.us/oauth/token', {
method: 'POST',
headers: {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'grant_type=client_credentials'
})User input is used to construct a URL for a server-side HTTP request. This could allow an attacker to make requests to internal services or cloud metadata endpoints (Server-Side Request Forgery). Validate URLs against an allowlist of permitted hosts and schemes.
taint source (line 27): process.env.ZOOM_BOT_JID → sink: fetch('https://api.zoom.us/v2/im/chat/messages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
robot_jid: process.env.ZOOM_BOT_JID,
to_jid: payload.toJid, // From webhook
account_id: payload.accountId, // From webhook
content: {
head: {
text: 'Build Notification',
sub_head: { text: 'CI/CD Pipeline' }
},
body: [
{ type: 'message', text: 'Deployment successful!' },
{
type: 'fields',
items: [
{ key: 'Branch', value: 'main' },
{ key: 'Commit', value: 'abc123' }
]
},
{
type: 'actions',
items: [
{ text: 'View Logs', value: 'view_logs', style: 'Primary' },
{ text: 'Dismiss', value: 'dismiss', style: 'Default' }
]
}
]
}
})
})Outbound network request primitive in skill code — can transmit data externally
fetch('https://api.zoom.us/v2/chat/users/me/messages', {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` },
body: JSON.stringify({
message: 'Hello!',
to_channel: 'CHANNEL_ID'
})
})User-controlled input is concatenated into a SQL query string. This allows SQL injection where an attacker can modify the query structure. Use parameterized queries with placeholders ($1, ?) instead of string concatenation.
taint source (line 2): req.headers['x-zm-request-timestamp'] → sink: message
Global/unverified dependency execution — global npm/yarn package, dotnet tool, or auto-confirmed npx run without version or integrity pinning
npm install -g
SKILL.md links to "concepts/api-selection.md" but the file is not part of the skill package — the workflow silently degrades or the content is sourced elsewhere at runtime
[Choose Your API](concepts/api-selection.md)
SKILL.md links to "concepts/environment-setup.md" but the file is not part of the skill package — the workflow silently degrades or the content is sourced elsewhere at runtime
[Environment Setup](concepts/environment-setup.md)
SKILL.md links to "examples/oauth-setup.md" but the file is not part of the skill package — the workflow silently degrades or the content is sourced elsewhere at runtime
[OAuth Setup](examples/oauth-setup.md)
SKILL.md links to "examples/send-message.md" but the file is not part of the skill package — the workflow silently degrades or the content is sourced elsewhere at runtime
[Send First Message](examples/send-message.md)
SKILL.md links to "get-started.md" but the file is not part of the skill package — the workflow silently degrades or the content is sourced elsewhere at runtime
[Get Started](get-started.md)
Skill does not specify a license field. Specifying a license helps users understand usage terms.
[](https://mondoo.com/ai-agent-security/skills/github/anthropics/knowledge-work-plugins/build-zoom-team-chat-app)<a href="https://mondoo.com/ai-agent-security/skills/github/anthropics/knowledge-work-plugins/build-zoom-team-chat-app"><img src="https://mondoo.com/ai-agent-security/api/badge/github/anthropics/knowledge-work-plugins/build-zoom-team-chat-app.svg" alt="Mondoo Skill Check" /></a>https://mondoo.com/ai-agent-security/api/badge/github/anthropics/knowledge-work-plugins/build-zoom-team-chat-app.svgSkills can read files, run commands, and access credentials. Mondoo helps organizations manage the security risks of AI agent skills across their entire fleet.