birthday
The birthday management skill contains undeclared network access (webhook, SMTP email) and shell execution (JS sendmail), with sensitive personal data capable of external transmission.
Why this conclusion was reached
1/4 dimensions flagged2 undeclared or violating capabilities were inferred.
No obvious high-risk egress or execution signals were found.
There is no explicit malicious chain in the report.
Dependencies are present but no obvious high-risk issue stands out.
What drove the risk score up
SMTP email via smtplib and webhook via urllib.request not declared in SKILL.md
child_process.spawnSync for 'which sendmail' and 'sendmail' not declared in SKILL.md
Birthday records with names, birthdates, and masked ID cards can be sent to user-configured webhook URLs
Script reads SMTP credentials from environment variables (BIRTHDAY_SMTP_*), but only for legitimate config purposes
Most important evidence
Undeclared email notification channel
SKILL.md only documents 'agent' notification channel but Python implementation includes full SMTP email support via smtplib.SMTP. Email channel requires BIRTHDAY_SMTP_HOST, BIRTHDAY_SMTP_PORT, BIRTHDAY_SMTP_USERNAME, BIRTHDAY_SMTP_PASSWORD environment variables.
scripts/birthday_manager.py:309 Undeclared webhook notification channel
Python implementation includes webhook support via urllib.request that POSTs notification data to user-configured URLs. This is not documented in SKILL.md.
scripts/birthday_manager.py:316 Undeclared shell command execution (JS)
JavaScript implementation uses child_process.spawnSync to execute 'which sendmail' and sendmail binary for email notifications. This shell:WRITE capability is not declared in SKILL.md.
scripts/birthday_manager.js:290 Environment variable access for credentials
Both scripts read SMTP credentials from environment variables (BIRTHDAY_SMTP_HOST, BIRTHDAY_SMTP_PASSWORD, etc.) via resolveConfigValue() function. This is legitimate for notification configuration but not documented.
scripts/birthday_manager.py:201 Declared capability vs actual capability
Both scripts read/write birthdays.json for data persistence - documented Python: smtplib.SMTP, urllib.request (webhook); JS: none; SKILL.md only declares agent channel JS: child_process.spawnSync for 'which sendmail' and sendmail binary execution - not declared Scripts read SMTP config from env vars (BIRTHDAY_SMTP_*), but only for notification channel Suspicious artifacts and egress
No obvious IOC was extracted.
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| None (pure stdlib) | N/A | Python stdlib + Node.js stdlib | No | No npm dependencies in package.json, no pip requirements.txt - all code uses standard library only |
File composition
scripts/birthday_manager.py scripts/birthday_manager.js