Close Open Privacy Scan
App Privacy Score
High risk · 1142 finding(s)
Based on: 2 first-party package(s) · 19/20 deps analyzed
Dependency score: 52 (Medium risk)
bar_chart Score Breakdown
list Scan Summary
swap_horiz Confirmed data exfiltration in application code
External domains:
api-staging.n8n.ioapi.github.comapi.n8n.ioapi.npmjs.orgapi.openai.comapps.extensions.modelcontextprotocol.ioassets.anthropic.comauth.openai.comdocs.expo.devdocs.google.comdocs.n8n.ioexpress-rate-limit.github.iofonts.googleapis.comgithub.comhelp.openai.comjson-schema.orgmanagement.azure.commetadata.google.internaln8n-mcp.comn8n.ionpm.implatform.openai.comreact.devreactjs.orgregistry.npmjs.orgwebhook-urlwww.n8n-mcp.comwww.w3.orgydyufsohxdfpopqbubwk.supabase.coyour-api.comyour-n8n-instance.comyour-n8n.com
- 1source
repo/src/services/n8n-api-client.ts:832 - 2sink
repo/src/services/n8n-api-client.ts:845
- 1source
repo/src/triggers/handlers/chat-handler.ts:94 - 2sink
repo/src/triggers/handlers/chat-handler.ts:127
- 1source
repo/src/triggers/handlers/form-handler.ts:272 - 2sink
repo/src/triggers/handlers/form-handler.ts:420
- 1source
repo/src/community/documentation-generator.ts:99 - 2sink
repo/src/community/documentation-generator.ts:359
- 1source
repo/src/http-server-single-session.ts:459 - 2sink
repo/src/http-server-single-session.ts:459
- 1source
repo/src/http-server-single-session.ts:463 - 2sink
repo/src/http-server-single-session.ts:463
- 1source
repo/src/http-server.ts:61 - 2sink
repo/src/http-server.ts:61
- 1source
repo/src/http-server.ts:65 - 2sink
repo/src/http-server.ts:65
hub Dependency data flows (2)
- 1source
pkgs/npm/@[email protected]__reposrc/examples/lazy-auth-server/server.ts:62 - 2sink
pkgs/npm/@[email protected]__reposrc/examples/lazy-auth-server/server.ts:505
- 1source
pkgs/npm/@[email protected]__reposrc/examples/lazy-auth-server/server.ts:62 - 2sink
pkgs/npm/@[email protected]__reposrc/examples/lazy-auth-server/server.ts:582
</> First-Party Code
first-party (npm)
npm first-party const response = await webhookClient.request(config);
User/PII-bearing data flows to an external sink — the classic data-exfiltration shape.
Fix: Confirm no user identifiers reach this sink; redact/hash before sending, or remove the flow.
const response = await axios.request(config);
User/PII-bearing data flows to an external sink — the classic data-exfiltration shape.
Fix: Confirm no user identifiers reach this sink; redact/hash before sending, or remove the flow.
const response = await axios.request(config);
User/PII-bearing data flows to an external sink — the classic data-exfiltration shape.
Fix: Confirm no user identifiers reach this sink; redact/hash before sending, or remove the flow.
const { data: eventData, error: eventError } = await supabase
.from('telemetry_events')
.insert([testEvent])
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { data: workflowData, error: workflowError } = await supabase
.from('telemetry_workflows')
.insert([testWorkflow])
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { data, error } = await supabase
.from('telemetry_events')
.insert([testEvent]);
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { error } = await supabase
.from('telemetry_events')
.insert([testData]); // No .select() here!
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { error: workflowError } = await supabase
.from('telemetry_workflows')
.insert([testWorkflow]); // No .select() here!
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { error: insertError } = await supabase
.from('telemetry_events')
.insert([testData]);
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { data, error } = await supabase
.from('telemetry_events')
.insert([testData])
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
const { data, error } = await supabase
.from('telemetry_workflows')
.insert([testWorkflow]);
A telemetry/analytics SDK is used; event data is sent to a third-party collector.
Fix: Ensure user consent and a lawful basis; strip PII from event payloads.
headers: {
'Content-Type': 'application/json',
...(this.apiKey !== 'not-needed' ? { Authorization: `Bearer ${this.apiKey}` } : {}),
},
A credential (read from the environment/filesystem, or parsed from the request URL) is applied as authorization on the same outbound request. This is intentional authentication to the service the credential belongs to, not unexpected data exfiltration.
Fix: Confirm the destination is the credential's own service; scope the credential and avoid logging it. No action if this is the intended authenticated API call.
logger.info(`Loaded AUTH_TOKEN from file: ${process.env.AUTH_TOKEN_FILE}`);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
console.error(`ERROR: Failed to read AUTH_TOKEN_FILE: ${process.env.AUTH_TOKEN_FILE}`);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
logger.info(`Loaded AUTH_TOKEN from file: ${process.env.AUTH_TOKEN_FILE}`);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
console.error(`ERROR: Failed to read AUTH_TOKEN_FILE: ${process.env.AUTH_TOKEN_FILE}`);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
expand_more 455 low-confidence finding(s)
low env_fs — Filesystem access. 131 locations
low env_fs — Environment-variable access. 279 locations
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 41 locations
low pii_flow — A credential read from the environment/filesystem flows to an external network call in a non-auth-header position (request body). Review what is sent. Non-production path — not application runtime. 2 locations
low egress — Hardcoded external endpoint. Review what data is sent to this destination. 2 locations
first-party (npm): ui-apps
npm first-partyexpand_more 1 low-confidence finding(s)
const appName = process.env.APP_NAME || 'operation-result';
Reads environment variables or the filesystem — an inventory-level capability, not a leak on its own.
Fix: Usually benign; confirm any secret read here is not later sent externally.
</> Dependencies
@modelcontextprotocol/ext-apps
npm dependency console.log(
`[auth] refreshed access token (sid=${refreshClaims.sid}, ttl=${accessTtl}s)`,
);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
console.log(
`[auth] exchanged code → token (client_id=${stored.client_id}, scope=${scope}, sid=${sid}, access_ttl=${accessTtl}s, refresh_ttl=${refreshTtl}s)`,
);
PII-bearing data is written to a log/print sink — it stays in-process and does not leave the application, but logged PII is still a privacy concern.
Fix: Avoid logging user identifiers; redact or omit PII from log/print statements.
expand_more 187 low-confidence finding(s)
low env_fs — Environment-variable access. 94 locations
low env_fs — Filesystem access. 77 locations
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 16 locations
@modelcontextprotocol/sdk
npm dependencyexpand_more 38 low-confidence finding(s)
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 22 locations
const response = await fetch(url);
Data is sent to a hardcoded external endpoint; review what leaves the process.
Fix: Verify the destination and that only non-sensitive data is sent; pin and audit the dependency.
writeFileSync(outputPath, fullContent, 'utf-8');
Reads environment variables or the filesystem — an inventory-level capability, not a leak on its own.
Fix: Usually benign; confirm any secret read here is not later sent externally.
low env_fs — Environment-variable access. 14 locations
@supabase/supabase-js
npm dependencyexpand_more 2 low-confidence finding(s)
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 2 locations
dotenv
npm dependencyexpand_more 18 low-confidence finding(s)
low env_fs — Environment-variable access. 16 locations
low env_fs — Filesystem access. 2 locations
express
npm dependencyexpand_more 1 low-confidence finding(s)
var env = process.env.NODE_ENV || 'development';
Reads environment variables or the filesystem — an inventory-level capability, not a leak on its own.
Fix: Usually benign; confirm any secret read here is not later sent externally.
form-data
npm dependencyexpand_more 3 low-confidence finding(s)
var fs = require('fs');
Reads environment variables or the filesystem — an inventory-level capability, not a leak on its own.
Fix: Usually benign; confirm any secret read here is not later sent externally.
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 2 locations
lru-cache
npm dependencyexpand_more 10 low-confidence finding(s)
low env_fs — Filesystem access. 4 locations
low env_fs — Environment-variable access. 6 locations
n8n-core
npm dependencyexpand_more 1 low-confidence finding(s)
await writeFile(filePath, payload, { encoding: 'utf-8' });
Reads environment variables or the filesystem — an inventory-level capability, not a leak on its own.
Fix: Usually benign; confirm any secret read here is not later sent externally.
openai
npm dependencyexpand_more 369 low-confidence finding(s)
low egress — Hardcoded external endpoint. Review what data is sent to this destination. 6 locations
low env_fs — Environment-variable access. 3 locations
low egress — Outbound request to a variable or assembled URL on a network client. Review what data is sent to this destination. 360 locations
react
npm dependencyexpand_more 14 low-confidence finding(s)
low env_fs — Environment-variable access. 14 locations
react-dom
npm dependencyexpand_more 25 low-confidence finding(s)
low env_fs — Environment-variable access. 25 locations
Skipped dependencies
Production
- n8n-workflow prod — dist-only: no readable source