Back to skill

Security audit

还活着么监测服务

Security checks for vulnerabilities and agentic risk

Overview

This skill handles sensitive welfare-check data, but its published artifacts expose credentials, lack access controls, contradict privacy claims, and may fail to deliver emergency alerts.

Do not deploy this skill for real users without review and fixes. Require authentication and per-user authorization, remove and rotate the exposed SkillPay key, correct the emergency-alert notification code, encrypt or otherwise protect stored data, narrow CORS, document consent and retention, and update flagged dependencies.

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 (4)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/index.js:43
Finding
Unauthenticated Access to Sensitive User Data and Safety-Critical Operations<![CDATA[ ## Vulnerability Details **File Location**: `src/index.js:43-52, 62-84, 88-110, 114-150, 155-173` **Vulnerability Type**: Missing authentication and object-level authorization **Risk Level**: Critical ### Vulnerable Code ```javascript setupMiddleware() { this.app.use(express.json()); this.app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); next(); }); this.app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`); next(); }); } ``` The following sensitive routes are registered without authentication or authorization middleware: ```javascript // Register user this.app.post('/register', async (req, res) => { try { const { userId, name, phone, emergencyContacts } = req.body; if (!userId || !name) { return res.status(400).json({ error: 'Missing required fields' }); } const user = this.userManager.registerUser(userId, { name, phone, emergencyContacts }); res.json({ success: true, message: 'Registration successful', user }); } catch (error) { console.error('Registration failed:', error); res.status(500).json({ error: error.message }); } }); // User check-in this.app.post('/checkin', async (req, res) => { try { const { userId, message, mood, location } = req.body; if (!userId) { return res.status(400).json({ error: 'Missing userId' }); } const result = this.userManager.checkin(userId, { message, mood, location }); res.json({ success: true, message: 'Check-in successful', data: result }); } catch (error) { console.error('Check-in failed:', error); res.status(500).json({ error: error.message }); } }); // Query status this.app.get('/status/:userId', (req, res) => { try { const { userId } = req.params; const status = this.userManager.getUserStatus(userId); if (!status) { ...[truncated 3870 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require authentication for every endpoint except a minimal health-check endpoint. 2. Derive the acting user identity from a verified session or token rather than trusting `userId` from request bodies. 3. Add object-level authorization checks so ordinary users can access and modify only their own records. 4. Require stronger authorization and reauthentication for emergency-contact changes. 5. Reject duplicate registration rather than overwriting existing users. 6. Use cryptographically random internal identifiers and avoid exposing predictable IDs. 7. Return data-transfer objects containing only fields required by each endpoint; do not return the complete stored user object. 8. Restrict CORS to explicitly trusted application origins and configure allowed methods and headers. 9. Add rate limiting, audit logging, request validation, and alerts for repeated identifier enumeration. 10. Add automated tests confirming that anonymous and cross-user requests receive `401 Unauthorized` or `403 Forbidden`. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/utils/userManager.js:54
Finding
Sensitive Personal and Location Data Stored in Plaintext Files<![CDATA[ ## Vulnerability Details **File Location**: `src/utils/userManager.js:54-70, 75-90, 102-110` **Vulnerability Type**: Unencrypted sensitive-data storage with unspecified file permissions **Risk Level**: High ### Vulnerable Code ```javascript /** * Save user data */ saveUsers() { try { fs.writeFileSync(this.usersFile, JSON.stringify(this.users, null, 2)); } catch (error) { console.error('Failed to save user data:', error.message); } } /** * Save check-in records */ saveCheckins() { try { fs.writeFileSync(this.checkinsFile, JSON.stringify(this.checkins, null, 2)); } catch (error) { console.error('Failed to save check-in records:', error.message); } } ``` The stored records contain sensitive fields: ```javascript this.users[userId] = { userId, name: userData.name, phone: userData.phone, emergencyContacts: userData.emergencyContacts || [], createdAt: new Date().toISOString(), lastCheckin: null, status: 'Not checked in', consecutiveDays: 0 }; ``` ```javascript const checkin = { timestamp: now.toISOString(), message: checkinData.message || 'Still alive today!', mood: checkinData.mood || '😊', location: checkinData.location || 'Unknown' }; ``` ### Technical Analysis The application serializes user records and check-in history directly into `src/data/users.json` and `src/data/checkins.json`. No encryption is applied, and `writeFileSync()` is called without an explicit restrictive `mode`. The records may contain names, telephone numbers, emergency-contact relationships, Telegram identifiers, email addresses, mood information, free-form messages, check-in timestamps, and location data. These fields can reveal a person's routines, welfare status, social contacts, and whereabouts. This implementation also contradicts the privacy claim in `README.md:137` that all data is stored in encrypted form. ### Attack Path 1. An attacker obtains filesystem read access through a compromised service account, v ...[truncated 1081 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Store records in a database designed for concurrent and access-controlled operation rather than plaintext files in the source tree. 2. Encrypt sensitive fields at rest with authenticated encryption and keep encryption keys outside the repository and data directory. 3. Use an external secret or key-management service in production. 4. If files remain necessary, create them with owner-only permissions such as `0600` and restrict the parent directory to the service account. 5. Separate application code from persistent data and ensure data volumes and backups have equivalent access controls and encryption. 6. Minimize collection of location, mood, and free-form health-related information. 7. Define and enforce retention and secure-deletion policies. 8. Use atomic writes and integrity protection to reduce corruption and unauthorized modification risks. 9. Correct the documentation so it does not claim encryption until encryption is actually implemented. 10. Perform a privacy and threat assessment appropriate for safety and health-adjacent personal data. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
skill.json:15
Finding
Hard-Coded SkillPay API Credential Distributed with the Project<![CDATA[ ## Vulnerability Details **File Location**: `skill.json:15` and `README.md:83-84` **Vulnerability Type**: Hard-coded secret and credential disclosure **Risk Level**: High ### Vulnerable Code `skill.json` contains a secret-shaped API credential: ```json "apiKey": "sk_e390b52cb259fc4f4aa1489547a48375d72876acdee75de57101d9e0e833fcb7", ``` The same value is published as configuration guidance in `README.md`: ```env # SkillPay API Key (required) SKILLPAY_API_KEY=sk_e390b52cb259fc4f4aa1489547a48375d72876acdee75de57101d9e0e833fcb7 ``` The application uses the configured value as a bearer credential in `src/payment.js`: ```javascript const response = await axios.post( `${this.baseURL}/verify`, { userId, transactionId, amount: this.pricePerCall, currency: 'USDT' }, { headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' } } ); ``` The same authorization pattern is also used by `createPaymentRequest()` and `logUsage()`. ### Technical Analysis The repository distributes a value formatted as a SkillPay secret key in both metadata and documentation. Anyone with access to the project archive or repository can recover it without executing the application. Although the audit did not validate whether the credential is currently active, exposed credentials must be treated as compromised. The payment helper sends the configured value to `https://api.skillpay.me/v1` in the `Authorization` header, confirming that this configuration field is intended to act as a bearer credential. Bearer credentials confer authority based solely on possession. Publishing one removes any meaningful confidentiality boundary and may allow unauthorized use of the associated account or API quota. ### Attack Path 1. An attacker downloads the project or reads its repository. 2. The attacker extracts the key from `skill.json` or `README.md`. 3. The attacker submits the key as a bearer credential to the c ...[truncated 835 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Revoke and rotate the exposed key immediately. 2. Remove the credential from `skill.json`, `README.md`, release archives, package metadata, and repository history. 3. Replace documentation values with unmistakable placeholders such as `SKILLPAY_API_KEY=your_api_key_here`. 4. Require every deployment operator to supply its own credential through environment variables or a secret-management service. 5. Never include real secrets in source control, examples, test fixtures, or distributable metadata. 6. Apply least-privilege scopes, usage limits, and expiration to replacement credentials. 7. Review provider logs for unauthorized activity involving the exposed key. 8. Add pre-commit and continuous-integration secret scanning. 9. Fail startup securely when payment functionality is enabled without a valid operator-provided key. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/utils/alertMonitor.js:137
Finding
Emergency Alert Content Is Silently Discarded by Notification Implementations<![CDATA[ ## Vulnerability Details **File Location**: `src/utils/alertMonitor.js:137-170`; affected implementations at `src/notifiers/telegram.js:35-85`, `src/notifiers/discord.js:39-85`, and `src/notifiers/email.js:54-125` **Vulnerability Type**: Safety-critical notification logic failure **Risk Level**: High ### Vulnerable Code The alert monitor passes the emergency message through an unsupported `title` option: ```javascript async sendNotification(contact, message) { const results = {}; // Telegram if (contact.telegram && this.telegram) { try { results.telegram = await this.telegram.sendTrendingReport( contact.telegram, [], { title: message } ); } catch (error) { console.error('Telegram notification failed:', error.message); } } // Discord if (contact.discord && this.discord) { try { results.discord = await this.discord.sendTrendingReport([], { title: message }); } catch (error) { console.error('Discord notification failed:', error.message); } } // Email if (contact.email && this.email) { try { results.email = await this.email.sendTrendingReport( contact.email, [], { title: message } ); } catch (error) { console.error('Email notification failed:', error.message); } } console.log(`Notified ${contact.name} (${contact.relation})`); return results; } ``` The Telegram formatter ignores `options.title`: ```javascript formatMessage(repos, options = {}) { const { language = 'All', since = 'daily' } = options; const timeLabel = { daily: 'Today', weekly: 'This Week', monthly: 'This Month' }[since] || 'Today'; let message = `🔥 *GitHub Trending - ${timeLabel}*\n`; if (language && language !== 'all') { message += `📚 Language: *${language}*\n`; } message += `📅 ${new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}\n\n`; if (!repos || ...[truncated 3533 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the unrelated `sendTrendingReport()` interface with dedicated methods such as `sendAlert(recipient, message, severity)`. 2. Ensure every channel includes the exact alert text, user identity, elapsed time, last check-in, severity, and recommended action. 3. Remove all GitHub Trending branding and repository-formatting logic from the safety-notification path. 4. Treat a `false` notifier result as a delivery failure rather than logging success. 5. Aggregate channel results and escalate when no channel confirms successful delivery. 6. Add retries with bounded exponential backoff and a dead-letter or operator-alert mechanism. 7. Record delivery attempts, provider response identifiers, timestamps, and final status without logging sensitive message contents unnecessarily. 8. Add unit tests proving that `options.title` or its replacement is present in generated Telegram, Discord, and email payloads. 9. Add integration tests using test providers or mocks that inspect actual outbound request bodies. 10. Conduct an end-to-end alert drill for both warning and high-risk thresholds before production use. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (49)

Missing User Warnings

High
Confidence
98% confidence
Finding
The README includes what appears to be a real SkillPay API key in `.env` example content rather than a placeholder. Exposed secrets can be harvested from repositories, abused for unauthorized API usage, billing fraud, or account compromise, and this is especially dangerous because the service processes sensitive user and emergency-contact data.

Known Vulnerable Dependency: axios==1.13.6 — 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-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding
The lockfile pins axios 1.13.6, and the reported advisories include SSRF-related and prototype-pollution-chain issues. In a monitoring skill that likely performs outbound HTTP checks, axios is directly relevant, so an exploitable dependency bug could materially affect request routing, credential handling, or response trust.

Known Vulnerable Dependency: brace-expansion==5.0.4 — 5 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-45149 (brace-expansion: Large numeric range defeats documented `max` DoS protection) +2 more

High
Category
Supply Chain
Confidence
88% confidence
Finding
brace-expansion 5.0.4 is associated with multiple expansion-based DoS issues. Here it is a dev dependency path through tooling, so the production risk is lower, but it can still affect developer workflows, CI, or any environment where untrusted glob-like input reaches the package.

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
90% confidence
Finding
form-data 4.0.5 is reported vulnerable to CRLF injection through multipart field names/filenames. If this skill builds multipart requests from external input, an attacker may be able to smuggle headers or alter request structure when contacting downstream services.

Known Vulnerable Dependency: lodash==4.17.23 — 2 advisory(ies): CVE-2025-13465 (lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and ); CVE-2021-23337 (lodash vulnerable to Code Injection via `_.template` imports key names)

High
Category
Supply Chain
Confidence
87% confidence
Finding
lodash 4.17.23 is flagged for prototype pollution and template-related code-injection risks. In this lockfile it appears as a transitive dependency of @sapphire/shapeshift rather than obvious direct application logic, which lowers exploit certainty, but pollution vulnerabilities can become serious if attacker-controlled objects are merged or unset paths are processed.

Known Vulnerable Dependency: nodemailer==6.10.1 — 12 advisory(ies): CVE-2026-82661 (Nodemailer: CRLF injection in Nodemailer List-* header comments allows arbitrary); GHSA-2x7j-588g-ccc2 (Nodemailer: Quadratic (O(n²)) time complexity in addressparser allows remote den); GHSA-8m3c-c648-2xjj (Nodemailer: resolveContent() on a MailMessage bypasses disableFileAccess/disable) +9 more

High
Category
Supply Chain
Confidence
95% confidence
Finding
nodemailer 6.10.1 carries multiple advisories including CRLF injection and content-resolution bypasses. This project explicitly includes email notification capability, so a vulnerable mail library is directly in scope and could enable header injection, file/content access bypass, or denial of service if attacker-controlled email fields are used.

Known Vulnerable Dependency: path-to-regexp==0.1.12 — 1 advisory(ies): CVE-2024-45296 (path-to-regexp vulnerable to Regular Expression Denial of Service via multiple r)

High
Category
Supply Chain
Confidence
92% confidence
Finding
path-to-regexp 0.1.12 is flagged for ReDoS and is pulled in by Express routing. If the service exposes routes influenced by attacker-chosen paths, specially crafted requests may trigger excessive regex backtracking and degrade availability.

Known Vulnerable Dependency: picomatch==2.3.1 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
82% confidence
Finding
picomatch 2.3.1 is a dev-tooling dependency associated with method-injection and ReDoS issues. In this project it is only present through development watchers, so it is unlikely to affect deployed runtime behavior unless untrusted glob input reaches local tooling or CI.

Known Vulnerable Dependency: undici==6.21.3 — 13 advisory(ies): CVE-2026-1525 (Undici has an HTTP Request/Response Smuggling issue); CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-1527 (Undici has CRLF Injection in undici via `upgrade` option) +10 more

High
Category
Supply Chain
Confidence
94% confidence
Finding
undici 6.21.3 is flagged for request smuggling, queue poisoning, and CRLF-injection-style issues. This dependency is used by discord.js and related networking components, so the risk is meaningful in a bot/monitoring service that maintains network-facing connections and processes remote protocol traffic.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
93% confidence
Finding
ws 8.19.0 is reported vulnerable to memory disclosure and fragmentation-driven memory exhaustion. This matters in a bot stack using Discord websocket functionality, because remote peers or protocol-adjacent attackers may be able to trigger availability loss or expose process memory under adverse conditions.

Known Vulnerable Dependency: axios==1.13.6 — 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-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Known Vulnerable Dependency: nodemailer==6.10.1 — 12 advisory(ies): CVE-2026-82661 (Nodemailer: CRLF injection in Nodemailer List-* header comments allows arbitrary); GHSA-2x7j-588g-ccc2 (Nodemailer: Quadratic (O(n²)) time complexity in addressparser allows remote den); GHSA-8m3c-c648-2xjj (Nodemailer: resolveContent() on a MailMessage bypasses disableFileAccess/disable) +9 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
README 全文均为中文,未提供其他语言选项,也未说明这是面向特定中文地区用户的限定文档。按照语言/地区政策,若技能强制单一语言而不给用户选择或合理限定,可能构成自然语言层面的政策问题。

External Transmission

Medium
Category
Data Exfiltration
Content
### 注册用户

```bash
curl -X POST http://localhost:3000/register \
  -H "Content-Type: application/json" \
  -d '{
    "userId": "user123",
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The README describes automatic escalation to emergency contacts, including high-risk labeling and suggesting in-person checks, but does not clearly warn about consent, false positives, or privacy consequences. In this skill's context, those omissions matter because the system handles sensitive welfare-status signals and could trigger harmful disclosures or interventions if misconfigured or inaccurate.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The README makes a concrete security/privacy assurance that 'all data is encrypted in storage' without any supporting implementation, configuration, or qualification. Unsupported security claims can mislead operators and users into trusting the system with sensitive health/contact data under false assumptions, resulting in insecure deployment and compliance risk.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill describes collecting highly sensitive personal and behavioral data, including identity, phone numbers, location, health-adjacent wellness signals, and emergency contacts, then automatically sharing alerts with third parties. Because the description does not clearly disclose retention, consent, access controls, or the exact circumstances of data sharing, users may unknowingly expose private information and contacts to monitoring and escalation flows.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The text explicitly lists '中文界面' as a feature, indicating the skill is designed around a fixed language. Under the policy, forcing a specific language without offering a user choice or documenting a justified locale constraint is a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The package description is written only in Chinese ("独居人群每日签到监测服务,关爱独居安全"), which indicates a fixed language/locale presentation in the skill metadata. There is no accompanying indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking region for compliance or other justified reasons.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The description is high-level and does not define clear activation boundaries, excluded use cases, or safety/privacy constraints for a service handling welfare check-ins and emergency contacts. In this context, ambiguous scope can lead to overbroad collection or use of sensitive personal and relationship data, and may cause the agent or integrator to invoke the skill in situations the user did not intend.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The application initializes Telegram, Discord, and email notification integrations using external-service credentials, indicating user data may be transmitted off-platform during alerts. Because this file provides no disclosure, consent, or controls around third-party sharing, sensitive user or emergency-contact information could be sent to external processors without users understanding where their data goes.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The service accepts sensitive personal data including phone numbers, emergency contacts, mood, messages, and location through API endpoints, but this file shows no consent flow, privacy notice, access control, or data-minimization safeguards. In a wellness/safety monitoring context, collecting and likely storing this data without clear disclosure increases privacy and compliance risk, especially if downstream modules persist or forward it.

External Transmission

Medium
Category
Data Exfiltration
Content
class SkillPayment {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseURL = 'https://api.skillpay.me/v1';
    this.pricePerCall = 0.001; // USDT
  }
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The class-level documentation presents this module as a generic "SkillPay Payment Integration," and the createPaymentRequest docstring describes only creating a payment request. However, the implementation hard-codes the description 'GitHub Trending Monitor - API Call', tying the payment flow to a specific unrelated skill identity. This is an active documentation/intent mismatch because the code embeds a narrower, different purpose than the documented abstraction suggests.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The code sends user identifiers and activity data to a third-party endpoint for analytics/usage logging without any visible consent, minimization, or privacy controls. Even if intended for billing or telemetry, transmitting identifiable usage data to an external service can create privacy, compliance, and data-handling risks if users are not informed or if the service is compromised.

Static analysis

No suspicious patterns detected.