Package evidence
[email protected]
Install Lifecycle Remote Or Exec: postinstall="node -e \"const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\\nJWT_SECRET=curlbash-change-me\\n');console.log('✓ curlbash → '+h)\""
Trust signals
Why this verdict
PkgRadar discounts a release’s score when public reputation argues against novel malware. The verdict above already reflects these — the panel just explains what was applied.
- Versions published
- 10
- First published
- Jun 2026
- Publisher
- matchlolita
Recommended action
Block this updateStatic evidence trips multiple high-signal indicators. Quarantine the release until the publisher validates the change or you can rule out the indicators below.
Block this release in CIcurl · GitHub Actions
Fail the build when this package version is added or upgraded. Replace $PKGRADAR_TOKEN with a Pro / Team API key from your dashboard.
curl -fsS https://pkgradar.com/gate/npm \
-H "Authorization: Bearer $PKGRADAR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"specs":["[email protected]"],"fail_on":"high"}'GitHub Actions step:
- name: PkgRadar gate
run: |
curl -fsS https://pkgradar.com/gate/npm \
-H "Authorization: Bearer ${{ secrets.PKGRADAR_TOKEN }}" \
-H "Content-Type: application/json" \
-d '{"specs":["[email protected]"],"fail_on":"high"}'Why flagged
What the scanner saw
Install Lifecycle Remote Or Exec: postinstall="node -e \"const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\\nJWT_SECRET=curlbash-change-me\\n');console.log('✓ curlbash → '+h)\""
Not observed: package install, lifecycle script execution, or sandbox execution. PkgRadar only inspects on-disk artifacts.
Availability ledger
available
Status history (1 event)
- new → available · risk high · score 35 · status changed
Evidence
Static findings
3 static · 0 from release diff · showing high-signal first.
| Severity | Kind | Path | Detail | Points |
|---|---|---|---|---|
| high | Install Lifecycle Remote Or Exec | package.json | postinstall="node -e \"const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\\nJWT_SECRET=curlbash-change-me\\n');console.log('✓ curlbash → '+h)\"" | 30 |
| medium | New Account With Lifecycle Hook | package.json | package first published 7 day(s) ago, 10 total version(s), has lifecycle hook | 10 |
Show all 3 findings (low-signal and informational)
| Severity | Kind | Path | Detail | Points |
|---|---|---|---|---|
| high | Install Lifecycle Remote Or Exec | package.json | postinstall="node -e \"const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\\nJWT_SECRET=curlbash-change-me\\n');console.log('✓ curlbash → '+h)\"" | 30 |
| medium | New Account With Lifecycle Hook | package.json | package first published 7 day(s) ago, 10 total version(s), has lifecycle hook | 10 |
| low | Install-time lifecycle script | package.json | postinstall="node -e \"const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\\nJWT_SECRET=curlbash-change-me\\n');console.log('✓ curlbash → '+h)\"" | 5 |
Manifest
Package metadata
Scripts6
buildtscdevtsx watch src/index.tspostinstallnode -e "const{join}=require('path');const{homedir}=require('os');const{mkdirSync,existsSync,copyFileSync,writeFileSync,readdirSync}=require('fs');const h=join(homedir(),'.curlbash');if(!existsSync(h))mkdirSync(h,{recursive:true});['scripts','data'].forEach(d=>{const p=join(h,d);if(!existsSync(p))mkdirSync(p,{recursive:true})});const s=join(__dirname,'scripts');if(existsSync(s))readdirSync(s).filter(f=>f.endsWith('.sh')).forEach(f=>{const t=join(h,'scripts',f);copyFileSync(join(s,f),t)});const e=join(h,'.env');if(!existsSync(e))writeFileSync(e,'PORT=3000\nJWT_SECRET=curlbash-change-me\n');console.log('✓ curlbash → '+h)"prepublishOnlytscseedtsx src/db/seed.tsstartnode dist/index.js
Dependencies8
@fastify/cors^10.0.1@fastify/jwt^9.0.1bcryptjs^2.4.3better-sqlite3^11.6.0dotenv^16.4.5drizzle-orm^0.36.3fastify^5.1.0zod^3.23.8