Back to skill

Security audit

M365 Planner

Security checks for vulnerabilities and agentic risk

Overview

This Microsoft Planner skill is mostly coherent, but linked setup documentation asks administrators to grant broader Microsoft 365 group-write authority than the scripts appear to need.

Review before installing. Use the narrower Group.Read.All permission instead of Group.ReadWrite.All unless you have a separate reason, keep the M365 app secret in a dedicated restricted file, rotate any secret previously used with overbroad permissions, and avoid sharing test-connection output because it prints tenant, client, secret-suffix, and group details.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/cleanup_verlaengerungen.js:15
Finding

Shared OpenClaw credential file is read and indiscriminately imported into the process environment

Content
View full analysis
{ const match = line.match(/^([^#=]+)=(.*)$/); if (match) { const key = match[1].trim(); let val = match[2].trim(); val = val.replace(/^["']|["']$/g, ''); process.env[key] = val; } }); ``` Only three values are subsequently needed: ```javascript const clientId = process.env.M365_CLIENT_ID; const clientSecret = process.env.M365_CLIENT_SECRET; const tenantId = process.env.M365_TENANT_ID; ``` ### Technical Analysis Each Node.js script reads the complete shared `~/.openclaw/.env` file and copies every parsed entry into the global process environment. The Skill only needs `M365_CLIENT_ID`, `M365_CLIENT_SECRET`, and `M365_TENANT_ID`, but unrelated credentials stored in the same OpenClaw environment file are also exposed to the entire Node.js process and every loaded dependency. The reviewed code does not launch child processes or transmit unrelated environment variables, and no active exfiltration of those unrelated secrets was identified. Nevertheless, the implementation violates least exposure: a compromised dependency, diagnostic module, future child process, or later code change would be able to access credentials unrelated to Microsoft Planner. The fixed file path itself is documented and appropriate for the declared integration. The weakness is reading and importing every value rather than selecting only the required keys. ...[truncated 960 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
references/setup-guide.md:18
Finding

Reference documentation requests unnecessary tenant-wide group write permission

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/test-connection.js:48
Finding

Connection diagnostics disclose credential fragments and tenant metadata to logs

Content
View full analysis
{ const isM365 = g.resourceProvisioningOptions?.includes('Team') || g.mail ? '✅ M365/Planner-fähig' : '⚠️ Keine M365-Gruppe'; console.log(` - ${g.displayName}`); console.log(` ID: ${g.id}`); console.log(` Mail: ${g.mail || 'N/A'}`); console.log(` Status: ${isM365}\n`); }); ``` ### Technical Analysis Client IDs and tenant IDs are identifiers rather than authentication secrets, but they provide useful targeting information. Printing a client-secret suffi ...[truncated 1726 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (73)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared purpose focuses on Planner management, but the documented behavior also includes reading local secrets, obtaining OAuth tokens, enumerating tenant groups, and validating connectivity. This mismatch can mislead operators into granting or invoking a skill with broader access than expected, increasing the chance of unintended credential use and directory reconnaissance.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/test-connection.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/test-connection.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/test-connection.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/test-connection.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/list_plans.js

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
node scripts/cleanup_verlaengerungen.js <group-id> "<plan-name>" "<bucket-name>"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/cleanup_verlaengerungen.js <group-id> "<plan-name>" "<bucket-name>"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/cleanup_verlaengerungen.js <group-id> "<plan-name>" "<bucket-name>"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/cleanup_verlaengerungen.js <group-id> "<plan-name>" "<bucket-name>"

Credential Access

High
Category
Privilege Escalation
Confidence
86% confidence
Finding

The skill explicitly relies on reading credentials from ~/.openclaw/.env, which is sensitive secret material. In the context of an agent skill, host-level credential access is significant because compromise or misuse of the skill can expose Microsoft 365 app credentials that enable broad API access.

Content

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

Secure permissions:

bash
chmod 600 ~/.openclaw/.env

Step 5: Test Connection

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

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

Content

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

md
### test-connection.js
Tests connection to Microsoft Graph:
- Request access token
- Display tenant information
- List available M365 Groups
- Check Planner capability

Known Vulnerable Dependency: axios==1.15.0 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2026-42044 (Axios: Invisible JSON Response Tampering via Prototype Pollution Gadget in `pars) +13 more

High
Category
Supply Chain
Confidence
94% confidence
Finding

The lockfile pins axios to 1.15.0, and the static analysis reports multiple known advisories affecting that exact version. In a skill that manages Microsoft 365 Planner via Graph API, HTTP client compromise can be especially dangerous because requests may carry OAuth tokens and sensitive task or group data; exploitation could enable request/response tampering, credential exposure, or other network-layer abuse depending on the vulnerable code paths used.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
87% confidence
Finding

The lockfile includes form-data 4.0.5, which the scanner flags for CRLF injection in multipart field names and filenames. If this skill ever constructs multipart requests from attacker-controlled input, the flaw could let crafted values alter request structure or smuggle unintended headers/body parts; the risk is somewhat reduced because Planner/Graph usage is typically JSON-centric, but the dependency remains present and potentially reachable through axios functionality.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.15.0 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2026-42044 (Axios: Invisible JSON Response Tampering via Prototype Pollution Gadget in `pars) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

The package.json explicitly includes axios 1.15.0, which the finding reports as having multiple known high-severity advisories. In a skill that interacts with Microsoft Graph and likely handles OAuth tokens and task data, a vulnerable HTTP client can increase the risk of request/response tampering, credential exposure, or other client-side compromise depending on how the library is used elsewhere in the skill.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

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).

Content

Scanner excerpt · references/planner-api.md (reported line 48)May include surrounding context.

POST /planner/plans GET /planner/plans/{id} PATCH /planner/plans/{id} DELETE /planner/plans/{id}

text

### Buckets

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

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).

Content

Scanner excerpt · references/planner-api.md (reported line 56)May include surrounding context.

GET /planner/buckets POST /planner/buckets GET /planner/buckets/{id} DELETE /planner/buckets/{id}

text

### Tasks

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

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).

Content

Scanner excerpt · references/planner-api.md (reported line 65)May include surrounding context.

POST /planner/tasks GET /planner/tasks/{id} PATCH /planner/tasks/{id} DELETE /planner/tasks/{id}

text

## Required Permissions

Scope Creep

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documented Graph permissions (Group.ReadWrite.All and Tasks.ReadWrite) appear broader or inconsistent with the skill metadata, which states Group.Read.All and Tasks.ReadWrite.All. Overstating required permissions can cause tenants to grant excessive application access, increasing blast radius if the app or secret is compromised.

Content

No source excerpt is available for this finding.