Back to skill

Security audit

NPM for N8N Nodes

Security checks for vulnerabilities and agentic risk

Overview

This is a documentation-only skill for building n8n community nodes, with expected credential, HTTP, testing, and publishing guidance, but users should avoid copying unsafe debug logging and should tighten dependency versions.

Install is reasonable for n8n community-node development. Before copying examples into a real project, remove full credential/object logging, avoid logging workflow data, use bounded dependency versions and lockfiles, and review any generated node code before publishing to npm or connecting production credentials.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
references/templates/local-testing.md:145
Finding

Debugging Template Logs Credentials and Sensitive Workflow Data in Plaintext

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/templates/project-files.md:63
Finding

Wildcard Dependency Versions Permit Unreviewed Package Resolution

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (49)

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 · references/examples/credentials/oauth2-patterns.md (reported line 45)May include surrounding context.

md
required: true,
    },
    {
      displayName: 'Access Token URL',
      name: 'accessTokenUrl',
      type: 'hidden',
      default: 'https://auth.myservice.com/oauth/token',

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 · references/examples/credentials/oauth2-patterns.md (reported line 91)May include surrounding context.

md
required: true,
    },
    {
      displayName: 'Access Token URL',
      name: 'accessTokenUrl',
      type: 'hidden',
      default: 'https://auth.myservice.com/oauth/token',

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 · references/examples/credentials/oauth2-patterns.md (reported line 139)May include surrounding context.

md
required: true,
    },
    {
      displayName: 'Access Token URL',
      name: 'accessTokenUrl',
      type: 'hidden',
      default: 'https://auth.myservice.com/oauth/token',

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 · references/examples/credentials/oauth2-patterns.md (reported line 175)May include surrounding context.

md
required: true,
    },
    {
      displayName: 'Access Token URL',
      name: 'accessTokenUrl',
      type: 'hidden',
      default: 'https://auth.myservice.com/oauth/token',

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 · references/examples/credentials/oauth2-patterns.md (reported line 228)May include surrounding context.

md
required: true,
    },
    {
      displayName: 'Access Token URL',
      name: 'accessTokenUrl',
      type: 'hidden',
      default: 'https://auth.myservice.com/oauth/token',

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 · references/examples/credentials/oauth2-patterns.md (reported line 198)May include surrounding context.

typescript
const credentials = await this.getCredentials('myServiceOAuth2Api');

// Access token (after automatic refresh if needed)
const tokenData = credentials.oauthTokenData as {
  access_token: string;
  token_type: string;

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 · references/examples/credentials/oauth2-patterns.md (reported line 216)May include surrounding context.

});

text

> ⚠️ Do not cache the access token across executions — always read from `getCredentials()` to ensure you get the refreshed token.

---

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · references/examples/nodes/trigger-node.md (reported line 170)May include surrounding context.

state.lastRun = new Date().toISOString();

// Reset (useful for testing) delete state.cursor;

text

> ⚠️ `getWorkflowStaticData('global')` is shared across all nodes in the workflow. `getWorkflowStaticData('node')` is scoped to this node instance — use 'node' unless you specifically need cross-node sharing.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · references/templates/project-files.md (reported line 210)May include surrounding context.

node_modules/ dist/ *.js.map .env

text

> Note: Some projects commit `dist/` so users can install from GitHub without building. Either approach is fine — just be consistent.

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 · references/templates/publishing.md (reported line 107)May include surrounding context.

md
### Option B: NPM Token (traditional)

1. Go to npmjs.com → Access Tokens → Generate New Token → Granular Access Token
2. Give it publish access to your package
3. Copy the token
4. In GitHub: repo Settings → Secrets → Actions → New repository secret

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 · references/templates/publishing.md (reported line 107)May include surrounding context.

md
### Option B: NPM Token (traditional)

1. Go to npmjs.com → Access Tokens → Generate New Token → Granular Access Token
2. Give it publish access to your package
3. Copy the token
4. In GitHub: repo Settings → Secrets → Actions → New repository secret

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The activation description is very broad and includes many generic terms and full-lifecycle triggers, which can cause the skill to activate in contexts that are only loosely related to building n8n community nodes. Over-triggering can route unrelated user requests into a powerful packaging/publishing skill, increasing the chance of inappropriate guidance, accidental misuse, or prompt-scope confusion.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/data-and-pairing.md (reported line 47)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/data-and-pairing.md (reported line 73)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 21)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 74)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 84)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 105)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 115)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 125)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 139)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 165)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 209)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 241)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/concepts/http-and-binary.md (reported line 260)May include surrounding context.

md
const response = await this.helpers.httpRequest({
  // ── Required ─────────────────────────────────────────────────
  method: 'POST',                        // GET | POST | PUT | PATCH | DELETE | HEAD
  url: 'https://api.example.com/items',  // full URL, OR use baseURL + url separately

  // ── Optional ─────────────────────────────────────────────────
  baseURL: 'https://api.example.com',    // if using relative url below

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/examples/credentials/oauth2-patterns.md:206