insa-check-core 0.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 (258) hide show
  1. package/LICENSE +24 -0
  2. package/dist/annex-b.d.ts +6 -0
  3. package/dist/annex-b.d.ts.map +1 -0
  4. package/dist/annex-b.js +152 -0
  5. package/dist/annex-b.js.map +1 -0
  6. package/dist/checks/content/page.d.ts +7 -0
  7. package/dist/checks/content/page.d.ts.map +1 -0
  8. package/dist/checks/content/page.js +133 -0
  9. package/dist/checks/content/page.js.map +1 -0
  10. package/dist/checks/cookies/cookie-flags.d.ts +3 -0
  11. package/dist/checks/cookies/cookie-flags.d.ts.map +1 -0
  12. package/dist/checks/cookies/cookie-flags.js +41 -0
  13. package/dist/checks/cookies/cookie-flags.js.map +1 -0
  14. package/dist/checks/cookies/cookie-scope.d.ts +6 -0
  15. package/dist/checks/cookies/cookie-scope.d.ts.map +1 -0
  16. package/dist/checks/cookies/cookie-scope.js +60 -0
  17. package/dist/checks/cookies/cookie-scope.js.map +1 -0
  18. package/dist/checks/deployment/server-banner.d.ts +4 -0
  19. package/dist/checks/deployment/server-banner.d.ts.map +1 -0
  20. package/dist/checks/deployment/server-banner.js +60 -0
  21. package/dist/checks/deployment/server-banner.js.map +1 -0
  22. package/dist/checks/deployment/trace.d.ts +3 -0
  23. package/dist/checks/deployment/trace.d.ts.map +1 -0
  24. package/dist/checks/deployment/trace.js +30 -0
  25. package/dist/checks/deployment/trace.js.map +1 -0
  26. package/dist/checks/headers/clickjacking.d.ts +5 -0
  27. package/dist/checks/headers/clickjacking.d.ts.map +1 -0
  28. package/dist/checks/headers/clickjacking.js +57 -0
  29. package/dist/checks/headers/clickjacking.js.map +1 -0
  30. package/dist/checks/headers/content-type-options.d.ts +3 -0
  31. package/dist/checks/headers/content-type-options.d.ts.map +1 -0
  32. package/dist/checks/headers/content-type-options.js +17 -0
  33. package/dist/checks/headers/content-type-options.js.map +1 -0
  34. package/dist/checks/headers/cors.d.ts +4 -0
  35. package/dist/checks/headers/cors.d.ts.map +1 -0
  36. package/dist/checks/headers/cors.js +38 -0
  37. package/dist/checks/headers/cors.js.map +1 -0
  38. package/dist/checks/html.d.ts +11 -0
  39. package/dist/checks/html.d.ts.map +1 -0
  40. package/dist/checks/html.js +30 -0
  41. package/dist/checks/html.js.map +1 -0
  42. package/dist/checks/index.d.ts +7 -0
  43. package/dist/checks/index.d.ts.map +1 -0
  44. package/dist/checks/index.js +48 -0
  45. package/dist/checks/index.js.map +1 -0
  46. package/dist/checks/info-disclosure/directory-listing.d.ts +6 -0
  47. package/dist/checks/info-disclosure/directory-listing.d.ts.map +1 -0
  48. package/dist/checks/info-disclosure/directory-listing.js +60 -0
  49. package/dist/checks/info-disclosure/directory-listing.js.map +1 -0
  50. package/dist/checks/info-disclosure/exposed-files.d.ts +4 -0
  51. package/dist/checks/info-disclosure/exposed-files.d.ts.map +1 -0
  52. package/dist/checks/info-disclosure/exposed-files.js +56 -0
  53. package/dist/checks/info-disclosure/exposed-files.js.map +1 -0
  54. package/dist/checks/info-disclosure/more.d.ts +8 -0
  55. package/dist/checks/info-disclosure/more.d.ts.map +1 -0
  56. package/dist/checks/info-disclosure/more.js +186 -0
  57. package/dist/checks/info-disclosure/more.js.map +1 -0
  58. package/dist/checks/tls/certificate.d.ts +3 -0
  59. package/dist/checks/tls/certificate.d.ts.map +1 -0
  60. package/dist/checks/tls/certificate.js +49 -0
  61. package/dist/checks/tls/certificate.js.map +1 -0
  62. package/dist/checks/tls/hsts.d.ts +5 -0
  63. package/dist/checks/tls/hsts.d.ts.map +1 -0
  64. package/dist/checks/tls/hsts.js +35 -0
  65. package/dist/checks/tls/hsts.js.map +1 -0
  66. package/dist/checks/tls/https-redirect.d.ts +3 -0
  67. package/dist/checks/tls/https-redirect.d.ts.map +1 -0
  68. package/dist/checks/tls/https-redirect.js +46 -0
  69. package/dist/checks/tls/https-redirect.js.map +1 -0
  70. package/dist/checks/tls/legacy-protocols.d.ts +3 -0
  71. package/dist/checks/tls/legacy-protocols.d.ts.map +1 -0
  72. package/dist/checks/tls/legacy-protocols.js +27 -0
  73. package/dist/checks/tls/legacy-protocols.js.map +1 -0
  74. package/dist/checks/util.d.ts +22 -0
  75. package/dist/checks/util.d.ts.map +1 -0
  76. package/dist/checks/util.js +63 -0
  77. package/dist/checks/util.js.map +1 -0
  78. package/dist/code/checks/crypto.d.ts +5 -0
  79. package/dist/code/checks/crypto.d.ts.map +1 -0
  80. package/dist/code/checks/crypto.js +100 -0
  81. package/dist/code/checks/crypto.js.map +1 -0
  82. package/dist/code/checks/django.d.ts +14 -0
  83. package/dist/code/checks/django.d.ts.map +1 -0
  84. package/dist/code/checks/django.js +313 -0
  85. package/dist/code/checks/django.js.map +1 -0
  86. package/dist/code/checks/flask.d.ts +6 -0
  87. package/dist/code/checks/flask.d.ts.map +1 -0
  88. package/dist/code/checks/flask.js +100 -0
  89. package/dist/code/checks/flask.js.map +1 -0
  90. package/dist/code/checks/index.d.ts +9 -0
  91. package/dist/code/checks/index.d.ts.map +1 -0
  92. package/dist/code/checks/index.js +126 -0
  93. package/dist/code/checks/index.js.map +1 -0
  94. package/dist/code/checks/injection.d.ts +27 -0
  95. package/dist/code/checks/injection.d.ts.map +1 -0
  96. package/dist/code/checks/injection.js +189 -0
  97. package/dist/code/checks/injection.js.map +1 -0
  98. package/dist/code/checks/javascript-config.d.ts +14 -0
  99. package/dist/code/checks/javascript-config.d.ts.map +1 -0
  100. package/dist/code/checks/javascript-config.js +251 -0
  101. package/dist/code/checks/javascript-config.js.map +1 -0
  102. package/dist/code/checks/javascript.d.ts +34 -0
  103. package/dist/code/checks/javascript.d.ts.map +1 -0
  104. package/dist/code/checks/javascript.js +333 -0
  105. package/dist/code/checks/javascript.js.map +1 -0
  106. package/dist/code/checks/php.d.ts +27 -0
  107. package/dist/code/checks/php.d.ts.map +1 -0
  108. package/dist/code/checks/php.js +433 -0
  109. package/dist/code/checks/php.js.map +1 -0
  110. package/dist/code/checks/secrets.d.ts +10 -0
  111. package/dist/code/checks/secrets.d.ts.map +1 -0
  112. package/dist/code/checks/secrets.js +140 -0
  113. package/dist/code/checks/secrets.js.map +1 -0
  114. package/dist/code/checks/shared.d.ts +25 -0
  115. package/dist/code/checks/shared.d.ts.map +1 -0
  116. package/dist/code/checks/shared.js +57 -0
  117. package/dist/code/checks/shared.js.map +1 -0
  118. package/dist/code/checks/treesitter.d.ts +15 -0
  119. package/dist/code/checks/treesitter.d.ts.map +1 -0
  120. package/dist/code/checks/treesitter.js +322 -0
  121. package/dist/code/checks/treesitter.js.map +1 -0
  122. package/dist/code/checks/xml.d.ts +9 -0
  123. package/dist/code/checks/xml.d.ts.map +1 -0
  124. package/dist/code/checks/xml.js +78 -0
  125. package/dist/code/checks/xml.js.map +1 -0
  126. package/dist/code/context.d.ts +6 -0
  127. package/dist/code/context.d.ts.map +1 -0
  128. package/dist/code/context.js +92 -0
  129. package/dist/code/context.js.map +1 -0
  130. package/dist/code/detect.d.ts +3 -0
  131. package/dist/code/detect.d.ts.map +1 -0
  132. package/dist/code/detect.js +118 -0
  133. package/dist/code/detect.js.map +1 -0
  134. package/dist/code/django/settings.d.ts +46 -0
  135. package/dist/code/django/settings.d.ts.map +1 -0
  136. package/dist/code/django/settings.js +154 -0
  137. package/dist/code/django/settings.js.map +1 -0
  138. package/dist/code/findings.d.ts +18 -0
  139. package/dist/code/findings.d.ts.map +1 -0
  140. package/dist/code/findings.js +63 -0
  141. package/dist/code/findings.js.map +1 -0
  142. package/dist/code/javascript/ast.d.ts +46 -0
  143. package/dist/code/javascript/ast.d.ts.map +1 -0
  144. package/dist/code/javascript/ast.js +166 -0
  145. package/dist/code/javascript/ast.js.map +1 -0
  146. package/dist/code/javascript/index.d.ts +3 -0
  147. package/dist/code/javascript/index.d.ts.map +1 -0
  148. package/dist/code/javascript/index.js +3 -0
  149. package/dist/code/javascript/index.js.map +1 -0
  150. package/dist/code/javascript/module.d.ts +59 -0
  151. package/dist/code/javascript/module.d.ts.map +1 -0
  152. package/dist/code/javascript/module.js +250 -0
  153. package/dist/code/javascript/module.js.map +1 -0
  154. package/dist/code/php/index.d.ts +92 -0
  155. package/dist/code/php/index.d.ts.map +1 -0
  156. package/dist/code/php/index.js +316 -0
  157. package/dist/code/php/index.js.map +1 -0
  158. package/dist/code/project.d.ts +13 -0
  159. package/dist/code/project.d.ts.map +1 -0
  160. package/dist/code/project.js +69 -0
  161. package/dist/code/project.js.map +1 -0
  162. package/dist/code/python/ast.d.ts +47 -0
  163. package/dist/code/python/ast.d.ts.map +1 -0
  164. package/dist/code/python/ast.js +193 -0
  165. package/dist/code/python/ast.js.map +1 -0
  166. package/dist/code/python/index.d.ts +3 -0
  167. package/dist/code/python/index.d.ts.map +1 -0
  168. package/dist/code/python/index.js +3 -0
  169. package/dist/code/python/index.js.map +1 -0
  170. package/dist/code/python/module.d.ts +55 -0
  171. package/dist/code/python/module.d.ts.map +1 -0
  172. package/dist/code/python/module.js +215 -0
  173. package/dist/code/python/module.js.map +1 -0
  174. package/dist/code/scan.d.ts +24 -0
  175. package/dist/code/scan.d.ts.map +1 -0
  176. package/dist/code/scan.js +159 -0
  177. package/dist/code/scan.js.map +1 -0
  178. package/dist/code/treesitter/index.d.ts +83 -0
  179. package/dist/code/treesitter/index.d.ts.map +1 -0
  180. package/dist/code/treesitter/index.js +243 -0
  181. package/dist/code/treesitter/index.js.map +1 -0
  182. package/dist/code/types.d.ts +48 -0
  183. package/dist/code/types.d.ts.map +1 -0
  184. package/dist/code/types.js +2 -0
  185. package/dist/code/types.js.map +1 -0
  186. package/dist/content/en.d.ts +3 -0
  187. package/dist/content/en.d.ts.map +1 -0
  188. package/dist/content/en.js +722 -0
  189. package/dist/content/en.js.map +1 -0
  190. package/dist/content/index.d.ts +15 -0
  191. package/dist/content/index.d.ts.map +1 -0
  192. package/dist/content/index.js +21 -0
  193. package/dist/content/index.js.map +1 -0
  194. package/dist/content/types.d.ts +87 -0
  195. package/dist/content/types.d.ts.map +1 -0
  196. package/dist/content/types.js +2 -0
  197. package/dist/content/types.js.map +1 -0
  198. package/dist/engine.d.ts +52 -0
  199. package/dist/engine.d.ts.map +1 -0
  200. package/dist/engine.js +120 -0
  201. package/dist/engine.js.map +1 -0
  202. package/dist/index.d.ts +12 -0
  203. package/dist/index.d.ts.map +1 -0
  204. package/dist/index.js +11 -0
  205. package/dist/index.js.map +1 -0
  206. package/dist/meta.d.ts +4 -0
  207. package/dist/meta.d.ts.map +1 -0
  208. package/dist/meta.js +4 -0
  209. package/dist/meta.js.map +1 -0
  210. package/dist/net/context.d.ts +9 -0
  211. package/dist/net/context.d.ts.map +1 -0
  212. package/dist/net/context.js +62 -0
  213. package/dist/net/context.js.map +1 -0
  214. package/dist/net/guard.d.ts +16 -0
  215. package/dist/net/guard.d.ts.map +1 -0
  216. package/dist/net/guard.js +70 -0
  217. package/dist/net/guard.js.map +1 -0
  218. package/dist/net/http.d.ts +22 -0
  219. package/dist/net/http.d.ts.map +1 -0
  220. package/dist/net/http.js +114 -0
  221. package/dist/net/http.js.map +1 -0
  222. package/dist/net/tls.d.ts +15 -0
  223. package/dist/net/tls.d.ts.map +1 -0
  224. package/dist/net/tls.js +103 -0
  225. package/dist/net/tls.js.map +1 -0
  226. package/dist/report/html.d.ts +14 -0
  227. package/dist/report/html.d.ts.map +1 -0
  228. package/dist/report/html.js +210 -0
  229. package/dist/report/html.js.map +1 -0
  230. package/dist/report/index.d.ts +10 -0
  231. package/dist/report/index.d.ts.map +1 -0
  232. package/dist/report/index.js +10 -0
  233. package/dist/report/index.js.map +1 -0
  234. package/dist/report/manual.d.ts +62 -0
  235. package/dist/report/manual.d.ts.map +1 -0
  236. package/dist/report/manual.js +190 -0
  237. package/dist/report/manual.js.map +1 -0
  238. package/dist/report/merge.d.ts +8 -0
  239. package/dist/report/merge.d.ts.map +1 -0
  240. package/dist/report/merge.js +135 -0
  241. package/dist/report/merge.js.map +1 -0
  242. package/dist/report/summary.d.ts +10 -0
  243. package/dist/report/summary.d.ts.map +1 -0
  244. package/dist/report/summary.js +27 -0
  245. package/dist/report/summary.js.map +1 -0
  246. package/dist/report/validate.d.ts +3 -0
  247. package/dist/report/validate.d.ts.map +1 -0
  248. package/dist/report/validate.js +78 -0
  249. package/dist/report/validate.js.map +1 -0
  250. package/dist/types.d.ts +244 -0
  251. package/dist/types.d.ts.map +1 -0
  252. package/dist/types.js +2 -0
  253. package/dist/types.js.map +1 -0
  254. package/dist/validate.d.ts +4 -0
  255. package/dist/validate.d.ts.map +1 -0
  256. package/dist/validate.js +24 -0
  257. package/dist/validate.js.map +1 -0
  258. package/package.json +40 -0
@@ -0,0 +1,333 @@
1
+ import { jsFinding, NO_PATTERN, outcomeFromFindings, snippetOf } from "../findings.js";
2
+ import { isJsDynamicString, isJsFalse, isJsLiteral, isJsTrue, jsArgs, jsDotted, jsIdentifiers, jsString, objectProp, unwrap, walkJs, } from "../javascript/index.js";
3
+ import { looksSecret, SECRET_ASSIGN, SECRET_DICT_KEY } from "./secrets.js";
4
+ import { codeCheck, PASSWORD_IDENT, SECRET_IDENT, SECURITY_CONTEXT } from "./shared.js";
5
+ /** Pattern rules for any JavaScript / TypeScript code (Node servers and front-end code alike). */
6
+ const LANG = "JavaScript/TypeScript";
7
+ export function jsPatternCheck(key, find, what) {
8
+ return codeCheck(key, ["javascript"], async (ctx) => {
9
+ const index = await ctx.javascript();
10
+ return outcomeFromFindings(await find(index, ctx), NO_PATTERN(what, index.modules.length, LANG));
11
+ });
12
+ }
13
+ /**
14
+ * How risky is passing `arg` to a sink?
15
+ * high - contains request data directly, or is a string built from it
16
+ * medium - built dynamically (template literal, +), or derived from request data via local variables
17
+ * low - some other non-literal value (origin unknown)
18
+ */
19
+ export function jsArgRisk(site, arg, opts = {}) {
20
+ const a = unwrap(arg);
21
+ if (!a || isJsLiteral(a))
22
+ return undefined;
23
+ const scope = site.module.scope(site.fn);
24
+ if (site.module.isRequestDerived(a))
25
+ return "high";
26
+ const derived = site.module.isRequestDerived(a, scope);
27
+ if (opts.requestOnly && !derived)
28
+ return undefined;
29
+ if (isJsDynamicString(a))
30
+ return derived ? "high" : "medium";
31
+ if (derived)
32
+ return "medium";
33
+ if (a.type === "Identifier" && scope?.dynamicStrings.has(a["name"]))
34
+ return "medium";
35
+ return opts.unknownIsLow === false ? undefined : "low";
36
+ }
37
+ function sinkFindings(sites, match, rule, why, opts = {}) {
38
+ const out = [];
39
+ for (const site of sites) {
40
+ const m = match(site);
41
+ if (!m)
42
+ continue;
43
+ const risks = (Array.isArray(m) ? m : [m]).map((a) => jsArgRisk(site, a, opts)).filter((r) => !!r);
44
+ if (risks.length === 0)
45
+ continue;
46
+ const confidence = risks.includes("high") ? "high" : risks.includes("medium") ? "medium" : "low";
47
+ out.push(jsFinding(site.module, site.node, rule, confidence, why));
48
+ }
49
+ return out;
50
+ }
51
+ const first = (s) => jsArgs(s.node)[0];
52
+ const receiver = (s) => {
53
+ const callee = unwrap(s.node["callee"]);
54
+ return callee && /MemberExpression$/.test(callee.type) ? (jsDotted(callee["object"]) ?? "") : "";
55
+ };
56
+ const allNodes = function* (index) {
57
+ for (const module of index.modules)
58
+ for (const node of walkJs(module.tree))
59
+ yield { module, node };
60
+ };
61
+ const propName = (p) => {
62
+ const k = p["key"];
63
+ return k.type === "Identifier" ? k["name"] : jsString(k);
64
+ };
65
+ // --- #6 Hard-coded secrets ------------------------------------------------------
66
+ const SECRET_WHY = "Credentials in source code leak through repositories, backups and builds; load them from the environment or a secret store.";
67
+ export const jsHardcodedSecrets = jsPatternCheck("js-hardcoded-secrets", (index) => {
68
+ const out = [];
69
+ for (const { module, node } of allNodes(index)) {
70
+ if (node.type === "VariableDeclarator") {
71
+ const id = node["id"];
72
+ if (id.type === "Identifier" && SECRET_ASSIGN.test(id["name"]) && looksSecret(jsString(node["init"]))) {
73
+ out.push(jsFinding(module, node, "js-hardcoded-secret", "medium", SECRET_WHY));
74
+ }
75
+ }
76
+ else if (node.type === "AssignmentExpression") {
77
+ const name = jsDotted(node["left"])?.split(".").pop() ?? "";
78
+ if (SECRET_ASSIGN.test(name) && looksSecret(jsString(node["right"])))
79
+ out.push(jsFinding(module, node, "js-hardcoded-secret", "medium", SECRET_WHY));
80
+ }
81
+ else if (node.type === "ObjectProperty") {
82
+ if (SECRET_DICT_KEY.test(propName(node) ?? "") && looksSecret(jsString(node["value"]))) {
83
+ out.push(jsFinding(module, node, "js-hardcoded-secret", "medium", SECRET_WHY));
84
+ }
85
+ }
86
+ }
87
+ for (const s of index.calls()) {
88
+ // jwt.sign(payload, "literal") / jwt.verify(token, "literal")
89
+ if (/^jsonwebtoken\.(sign|verify)$/.test(s.name ?? "") && looksSecret(jsString(jsArgs(s.node)[1]))) {
90
+ out.push(jsFinding(s.module, s.node, "js-hardcoded-jwt-secret", "high", "A hard-coded JWT secret lets anyone with the source forge valid tokens."));
91
+ }
92
+ }
93
+ return out;
94
+ }, "hard-coded credentials or signing secrets");
95
+ // --- #19 / #20 Cryptography -------------------------------------------------------
96
+ export const jsWeakCrypto = jsPatternCheck("js-weak-crypto", (index) => {
97
+ const out = [];
98
+ for (const s of index.calls()) {
99
+ const alg = jsString(first(s))?.toLowerCase() ?? "";
100
+ if (s.name === "crypto.createHash" && (alg === "md5" || alg === "sha1")) {
101
+ const security = SECURITY_CONTEXT.test(s.module.line(s.module.lineOf(s.node)));
102
+ out.push(jsFinding(s.module, s.node, "js-weak-hash", security ? "high" : "low", security ? "MD5/SHA-1 are broken for security purposes (collisions, fast brute force)." : "MD5/SHA-1 in use; acceptable only for non-security checksums. Confirm how it is used."));
103
+ }
104
+ else if (s.name === "crypto.createCipher" || s.name === "crypto.createDecipher") {
105
+ out.push(jsFinding(s.module, s.node, "js-createcipher", "high", "crypto.createCipher derives the key without a salt and uses no IV; it is deprecated. Use createCipheriv with a random IV."));
106
+ }
107
+ else if (/^crypto\.create(De)?cipheriv$/.test(s.name ?? "") && /(^|-)(des|des3|des-ede3?|rc4|rc2|bf|blowfish)(-|$)/.test(alg)) {
108
+ out.push(jsFinding(s.module, s.node, "js-weak-cipher", "high", "DES/3DES/RC4/Blowfish-class ciphers are deprecated and breakable."));
109
+ }
110
+ else if (/^(md5|sha1|blueimp-md5|js-md5|js-sha1)$/.test(s.name ?? "")) {
111
+ const security = SECURITY_CONTEXT.test(s.module.line(s.module.lineOf(s.node)));
112
+ out.push(jsFinding(s.module, s.node, "js-weak-hash", security ? "high" : "low", "MD5/SHA-1 are broken for security purposes; fine only for non-security checksums."));
113
+ }
114
+ }
115
+ return out;
116
+ }, "use of weak hashes or ciphers");
117
+ export const jsCryptoMisuse = jsPatternCheck("js-crypto-misuse", (index) => {
118
+ const out = [];
119
+ for (const s of index.calls()) {
120
+ const line = s.module.line(s.module.lineOf(s.node));
121
+ if (s.name === "Math.random" && SECURITY_CONTEXT.test(line)) {
122
+ out.push(jsFinding(s.module, s.node, "js-insecure-random", "medium", "Math.random() is predictable; use crypto.randomBytes / crypto.randomUUID for tokens, passwords and keys."));
123
+ }
124
+ else if (/^crypto\.create(De)?cipheriv$/.test(s.name ?? "") && /-ecb$/i.test(jsString(first(s)) ?? "")) {
125
+ out.push(jsFinding(s.module, s.node, "js-ecb-mode", "high", "ECB mode leaks plaintext patterns; use an authenticated mode such as GCM."));
126
+ }
127
+ else if (s.method === "update" && /createHash\(\)$/.test(receiver(s)) && jsArgs(s.node).some((a) => jsIdentifiers(a).some((i) => PASSWORD_IDENT.test(i)))) {
128
+ out.push(jsFinding(s.module, s.node, "js-fast-password-hash", "high", "Passwords hashed with a fast, unsalted hash can be brute-forced; use bcrypt, scrypt or Argon2."));
129
+ }
130
+ }
131
+ for (const { module, node } of allNodes(index)) {
132
+ if (node.type === "ObjectProperty" && propName(node) === "rejectUnauthorized" && isJsFalse(node["value"])) {
133
+ out.push(jsFinding(module, node, "js-tls-reject-unauthorized", "high", "rejectUnauthorized: false disables TLS certificate verification, allowing man-in-the-middle attacks."));
134
+ }
135
+ else if (node.type === "AssignmentExpression" && jsDotted(node["left"]) === "process.env.NODE_TLS_REJECT_UNAUTHORIZED") {
136
+ out.push(jsFinding(module, node, "js-tls-env-disable", "high", "NODE_TLS_REJECT_UNAUTHORIZED=0 disables TLS certificate verification for the whole process."));
137
+ }
138
+ else if (node.type === "ObjectProperty" && propName(node) === "algorithms" && module.text(node["value"]).toLowerCase().includes("none")) {
139
+ out.push(jsFinding(module, node, "js-jwt-none", "high", "Accepting the JWT \"none\" algorithm lets anyone forge tokens."));
140
+ }
141
+ }
142
+ return out;
143
+ }, "cryptographic misuse (insecure randomness, ECB, fast password hashes, disabled TLS verification)");
144
+ // --- #34 Plaintext passwords -------------------------------------------------------
145
+ const HASHING = /hash|bcrypt|argon|scrypt|pbkdf2|encrypt|digest/i;
146
+ export const jsPlaintextPasswords = jsPatternCheck("js-plaintext-passwords", (index) => {
147
+ const out = [];
148
+ for (const { module, node } of allNodes(index)) {
149
+ if (node.type === "AssignmentExpression") {
150
+ const left = unwrap(node["left"]);
151
+ const right = unwrap(node["right"]);
152
+ if (!left || !right || !/MemberExpression$/.test(left.type) || isJsLiteral(right))
153
+ continue;
154
+ const name = jsDotted(left)?.split(".").pop() ?? "";
155
+ if (!PASSWORD_IDENT.test(name) || /hash|digest|salt/i.test(name) || HASHING.test(module.text(right)))
156
+ continue;
157
+ out.push(jsFinding(module, node, "js-plaintext-password-assign", module.isRequestDerived(right) ? "high" : "medium", "Assigning a raw value to a password field stores it unhashed; hash it first (bcrypt, scrypt, Argon2)."));
158
+ }
159
+ else if (node.type === "ObjectProperty") {
160
+ const name = propName(node) ?? "";
161
+ const value = node["value"];
162
+ if (PASSWORD_IDENT.test(name) && !/hash|digest|salt/i.test(name) && module.isRequestDerived(value) && !HASHING.test(module.text(value))) {
163
+ // Only inside calls that persist data.
164
+ out.push(jsFinding(module, node, "js-plaintext-password-stored", "medium", "A request password is passed on unhashed; if this object is saved, the password is stored in plaintext."));
165
+ }
166
+ }
167
+ else if (node.type === "BinaryExpression" && ["===", "==", "!==", "!="].includes(node["operator"])) {
168
+ const side = (x) => (jsDotted(x)?.split(".").pop() ?? "");
169
+ const l = unwrap(node["left"]);
170
+ const r = unwrap(node["right"]);
171
+ if (!l || !r || isJsLiteral(l) || isJsLiteral(r))
172
+ continue;
173
+ if (PASSWORD_IDENT.test(side(l)) && PASSWORD_IDENT.test(side(r)) && !/hash|digest|confirm|repeat|again/i.test(module.text(node))) {
174
+ out.push(jsFinding(module, node, "js-plaintext-password-compare", "medium", "Comparing passwords directly implies they are stored in plaintext; compare hashes with bcrypt.compare or similar."));
175
+ }
176
+ }
177
+ }
178
+ return out;
179
+ }, "plaintext password storage or comparison");
180
+ // --- #41 SQL injection ---------------------------------------------------------------
181
+ const SQL_ALWAYS = /^(query|execute|raw|\$queryRawUnsafe|\$executeRawUnsafe)$/;
182
+ const SQL_ON_DB = /^(all|get|run|prepare|exec|each)$/;
183
+ const DB_RECEIVER = /(^|\.)(db|database|sqlite|conn|connection|pool|client|knex|sequelize|pg|mysql)(\(\))?$/i;
184
+ const SQL_TEXT = /\b(select|insert|update|delete|where|from|values|drop|alter)\b/i;
185
+ export const jsSqlInjection = jsPatternCheck("js-sql-injection", (index) => sinkFindings(index.calls(), (s) => {
186
+ const m = s.method ?? "";
187
+ const onDb = DB_RECEIVER.test(receiver(s));
188
+ if (!(SQL_ALWAYS.test(m) || (SQL_ON_DB.test(m) && onDb)))
189
+ return undefined;
190
+ const arg = unwrap(first(s));
191
+ if (!arg)
192
+ return undefined;
193
+ // Dynamic strings must look like SQL; other values only count on a database-like receiver.
194
+ if (isJsDynamicString(arg))
195
+ return SQL_TEXT.test(s.module.text(arg)) ? arg : undefined;
196
+ return onDb ? arg : undefined;
197
+ }, "js-sql-string-building", "SQL built from strings can be manipulated by user input; use placeholders and pass values separately."), "SQL built by string concatenation or template literals");
198
+ // --- #44 OS command injection ---------------------------------------------------------
199
+ export const jsCommandInjection = jsPatternCheck("js-command-injection", (index) => {
200
+ const calls = index.calls();
201
+ return [
202
+ ...sinkFindings(calls, (s) => (/^(child_process\.(exec|execSync)|shelljs\.exec|execa\.command(Sync)?)$/.test(s.name ?? "") ? first(s) : undefined), "js-shell-command", "Running a shell command built from variables allows command injection; use execFile/spawn with an argument array."),
203
+ ...sinkFindings(calls, (s) => {
204
+ if (!/^child_process\.(spawn|spawnSync|execFile|execFileSync)$/.test(s.name ?? ""))
205
+ return undefined;
206
+ const args = jsArgs(s.node);
207
+ return args.some((a) => isJsTrue(objectProp(a, "shell"))) ? [args[0], args[1]] : undefined;
208
+ }, "js-spawn-shell", "shell: true with variable input allows command injection; drop the shell option and pass arguments as an array."),
209
+ ];
210
+ }, "OS command execution with variable input");
211
+ // --- #54 Dynamic code execution -------------------------------------------------------
212
+ export const jsCodeInjection = jsPatternCheck("js-code-injection", (index) => {
213
+ const calls = index.calls();
214
+ return [
215
+ ...sinkFindings(calls, (s) => (s.name === "eval" ? first(s) : undefined), "js-eval", "eval() of non-constant input runs arbitrary code."),
216
+ ...sinkFindings(calls, (s) => (s.isNew && s.name === "Function" ? jsArgs(s.node).at(-1) : undefined), "js-new-function", "new Function() with non-constant input runs arbitrary code."),
217
+ ...sinkFindings(calls, (s) => (/^vm\.(runInNewContext|runInThisContext|runInContext|Script|compileFunction)$/.test(s.name ?? "") ? first(s) : undefined), "js-vm-run", "The vm module is not a security sandbox; running variable input executes arbitrary code."),
218
+ ...sinkFindings(calls, (s) => {
219
+ const a = first(s);
220
+ return /^(setTimeout|setInterval)$/.test(s.name ?? "") && a && isJsDynamicString(a) ? a : undefined;
221
+ }, "js-timer-string", "Passing a built string to setTimeout/setInterval evaluates it as code."),
222
+ ...sinkFindings(calls, (s) => (s.name === "require" || /(^|\.)unserialize$/.test(s.name ?? "") ? first(s) : undefined), "js-dynamic-require-or-unserialize", "Loading modules or deserialising objects chosen by request data can execute attacker-controlled code.", { requestOnly: true }),
223
+ ];
224
+ }, "eval, new Function, vm execution or unsafe deserialisation of variable input");
225
+ // --- #42 Path traversal ----------------------------------------------------------------
226
+ const FS_SINK = /^(fs|fs\.promises|fs\/promises|fs-extra)\.(readFile|readFileSync|createReadStream|writeFile|writeFileSync|createWriteStream|appendFile|appendFileSync|unlink|unlinkSync|rm|rmSync|readdir|readdirSync|stat|statSync|access|open|openSync|copyFile|rename)$|^path\.(join|resolve)$/;
227
+ export const jsPathTraversal = jsPatternCheck("js-path-traversal", (index) => sinkFindings(index.calls(), (s) => (FS_SINK.test(s.name ?? "") || (/^(sendFile|download)$/.test(s.method ?? "") && /(^|\.)res(ponse)?$/.test(receiver(s))) ? jsArgs(s.node) : undefined), "js-path-from-request", "File paths built from request data allow ../ traversal; normalise and confine paths to an allowed directory.", { requestOnly: true }), "file paths built from request data");
228
+ // --- #43 Cross-site scripting -----------------------------------------------------------
229
+ export const jsXss = jsPatternCheck("js-xss", async (index, ctx) => {
230
+ const out = sinkFindings(index.calls(), (s) => {
231
+ const a = first(s);
232
+ if (!a || !/^(send|write|end)$/.test(s.method ?? "") || !/(^|\.)res(ponse)?$/.test(receiver(s)))
233
+ return undefined;
234
+ return isJsDynamicString(a) ? a : undefined;
235
+ }, "js-response-interpolation", "Writing request data into an HTML response without escaping enables reflected XSS.", { requestOnly: true });
236
+ for (const { module, node } of allNodes(index)) {
237
+ if (node.type === "JSXAttribute" && node["name"]["name"] === "dangerouslySetInnerHTML") {
238
+ out.push(jsFinding(module, node, "react-dangerously-set-inner-html", "low", "dangerouslySetInnerHTML renders raw HTML; safe only if the value can never contain user input or is sanitised."));
239
+ }
240
+ else if (node.type === "AssignmentExpression") {
241
+ const prop = jsDotted(node["left"])?.split(".").pop();
242
+ if ((prop === "innerHTML" || prop === "outerHTML") && !isJsLiteral(node["right"])) {
243
+ out.push(jsFinding(module, node, "js-inner-html", "low", "Assigning non-constant content to innerHTML can inject script; use textContent or sanitise."));
244
+ }
245
+ }
246
+ }
247
+ for (const s of index.calls()) {
248
+ if (s.name === "document.write" && first(s) && !isJsLiteral(first(s))) {
249
+ out.push(jsFinding(s.module, s.node, "js-document-write", "low", "document.write with non-constant content can inject script."));
250
+ }
251
+ }
252
+ // EJS templates are not JavaScript modules; regex is the only option (higher false-positive rate, flagged in output).
253
+ for (const f of ctx.files.filter((x) => x.path.endsWith(".ejs"))) {
254
+ (await ctx.read(f.path)).split(/\r?\n/).forEach((line, i) => {
255
+ if (/<%-(?!\s*include\b)/.test(line)) {
256
+ out.push({ file: f.path, line: i + 1, snippet: snippetOf(line), why: "<%- outputs a value without HTML-escaping; safe only if it can never contain user input.", confidence: "low", method: "regex", rule: "ejs-unescaped-output" });
257
+ }
258
+ });
259
+ }
260
+ return out;
261
+ }, "unescaped output (interpolated responses, innerHTML, dangerouslySetInnerHTML, unescaped templates)");
262
+ // --- #55 Regex / #58 template injection / #56 mass assignment ---------------------------
263
+ export const jsRegexInjection = jsPatternCheck("js-regex-injection", (index) => sinkFindings(index.calls(), (s) => (s.name === "RegExp" ? first(s) : undefined), "js-regex-from-request", "Regular expressions built from request data allow ReDoS and pattern manipulation; escape the input.", { requestOnly: true }), "regular expressions built from request data");
264
+ export const jsTemplateInjection = jsPatternCheck("js-template-injection", (index) => sinkFindings(index.calls(), (s) => (/^(ejs\.render|pug\.(render|compile)|handlebars\.compile|nunjucks\.renderString|mustache\.render|lodash\.template|_\.template|dot\.template)$/i.test(s.name ?? "") ? first(s) : undefined), "js-template-from-input", "Compiling templates from request data enables server-side template injection.", { requestOnly: true }), "templates compiled from request data");
265
+ const PERSIST = /^(create|update|updateOne|updateMany|findByIdAndUpdate|findOneAndUpdate|insert|insertOne|insertMany|upsert|save|build|assign|merge|set)$/;
266
+ const BODY = /^(?:(?:req|request)\.body|ctx\.request\.body)$/;
267
+ export const jsMassAssignment = jsPatternCheck("js-mass-assignment", (index) => {
268
+ const out = [];
269
+ const isBody = (a) => {
270
+ const n = unwrap(a);
271
+ if (!n)
272
+ return false;
273
+ if (BODY.test(jsDotted(n) ?? ""))
274
+ return true;
275
+ return n.type === "ObjectExpression" && n["properties"].some((p) => p.type === "SpreadElement" && BODY.test(jsDotted(p["argument"]) ?? ""));
276
+ };
277
+ for (const s of index.calls()) {
278
+ if ((s.isNew || PERSIST.test(s.method ?? "")) && jsArgs(s.node).some(isBody)) {
279
+ out.push(jsFinding(s.module, s.node, "js-body-to-model", "medium", "Passing the whole request body to a model lets clients set any field (e.g. role, isAdmin); pick allowed fields explicitly."));
280
+ }
281
+ }
282
+ return out;
283
+ }, "mass-assignment patterns (whole request body passed to a model)");
284
+ // --- #60 / #97 Open redirect -------------------------------------------------------------
285
+ export const jsOpenRedirect = jsPatternCheck("js-open-redirect", (index) => {
286
+ const out = [];
287
+ for (const s of index.calls()) {
288
+ if (s.method !== "redirect" || !/(^|\.)(res(ponse)?|reply|ctx)$/.test(receiver(s)))
289
+ continue;
290
+ const target = jsArgs(s.node).at(-1);
291
+ if (!target || !s.module.isRequestDerived(target, s.module.scope(s.fn)))
292
+ continue;
293
+ out.push(jsFinding(s.module, s.node, "js-open-redirect", s.module.isRequestDerived(target) ? "high" : "medium", "Redirecting to a URL taken from the request lets attackers send users to malicious sites; allow only relative paths or known hosts."));
294
+ }
295
+ return out;
296
+ }, "redirects to request-controlled URLs");
297
+ // --- #77 Secrets in logs -------------------------------------------------------------------
298
+ const LOG_CALL = /^(console\.(log|info|warn|error|debug|trace)|(.*\.)?(logger|log|winston|pino|bunyan)\.(log|info|warn|warning|error|debug|trace|fatal|verbose))$/i;
299
+ const REQUEST_DUMP = /^(?:req|request)\.(body|headers|cookies|session)$/;
300
+ export const jsSecretsInLogs = jsPatternCheck("js-secrets-in-logs", (index) => {
301
+ const out = [];
302
+ for (const s of index.calls()) {
303
+ if (!LOG_CALL.test(s.name ?? ""))
304
+ continue;
305
+ for (const arg of jsArgs(s.node)) {
306
+ const a = unwrap(arg);
307
+ if (!a || isJsLiteral(a))
308
+ continue;
309
+ const secret = jsIdentifiers(a).find((i) => SECRET_IDENT.test(i));
310
+ const inner = a.type === "CallExpression" ? unwrap(jsArgs(a)[0]) : a;
311
+ const dump = REQUEST_DUMP.test(jsDotted(inner) ?? "");
312
+ if (secret || dump) {
313
+ out.push(jsFinding(s.module, s.node, "js-secret-logged", "medium", dump ? "Logging raw request data can write passwords, tokens and session IDs to logs." : `Logs a value named "${secret}", which may be a credential or token.`));
314
+ break;
315
+ }
316
+ }
317
+ }
318
+ return out;
319
+ }, "logging of passwords, tokens or raw request data");
320
+ // --- #86 / #87 XML ---------------------------------------------------------------------------
321
+ const xmlOption = (index, option, rule, why) => {
322
+ const out = [];
323
+ for (const { module, node } of allNodes(index)) {
324
+ if (node.type === "ObjectProperty" && propName(node) === option && isJsTrue(node["value"]))
325
+ out.push(jsFinding(module, node, rule, "high", why));
326
+ }
327
+ return out;
328
+ };
329
+ export const jsXxe = jsPatternCheck("js-xml-xxe", (index) => (index.imports("libxmljs") || index.imports("libxmljs2") ? xmlOption(index, "noent", "libxml-noent", "noent: true makes libxml expand external entities (XXE): file disclosure and SSRF.") : []), "XML parser options that expand external entities");
330
+ export const jsExternalDtd = jsPatternCheck("js-xml-dtd", (index) => index.imports("libxmljs") || index.imports("libxmljs2")
331
+ ? [...xmlOption(index, "dtdload", "libxml-dtdload", "dtdload: true lets documents pull external DTDs."), ...xmlOption(index, "dtdvalid", "libxml-dtdvalid", "dtdvalid: true loads and validates against external DTDs.")]
332
+ : [], "XML parser options that load external DTDs");
333
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/code/checks/javascript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { CodeCheck } from "../types.js";
2
+ export declare const phpHardcodedSecrets: CodeCheck;
3
+ export declare const phpWeakCrypto: CodeCheck;
4
+ export declare const phpCryptoMisuse: CodeCheck;
5
+ export declare const phpPlaintextPasswords: CodeCheck;
6
+ export declare const phpSqlInjection: CodeCheck;
7
+ export declare const phpCommandInjection: CodeCheck;
8
+ export declare const phpCodeInjection: CodeCheck;
9
+ export declare const phpPathTraversal: CodeCheck;
10
+ export declare const phpXss: CodeCheck;
11
+ export declare const phpRegexInjection: CodeCheck;
12
+ export declare const phpMassAssignment: CodeCheck;
13
+ export declare const phpOpenRedirect: CodeCheck;
14
+ export declare const phpSecretsInLogs: CodeCheck;
15
+ export declare const phpXxe: CodeCheck;
16
+ export declare const phpExternalDtd: CodeCheck;
17
+ export declare const laravelDebug: CodeCheck;
18
+ export declare const laravelSessionSecure: CodeCheck;
19
+ export declare const laravelSessionHttpOnly: CodeCheck;
20
+ export declare const laravelSessionExpiry: CodeCheck;
21
+ export declare const laravelCsrf: CodeCheck;
22
+ export declare const laravelAuthRateLimit: CodeCheck;
23
+ export declare const laravelLoginRotation: CodeCheck;
24
+ export declare const phpUploadPath: CodeCheck;
25
+ export declare const phpUploadSize: CodeCheck;
26
+ export declare const phpUploadType: CodeCheck;
27
+ //# sourceMappingURL=php.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/code/checks/php.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAmE1D,eAAO,MAAM,mBAAmB,WA0B/B,CAAC;AAGF,eAAO,MAAM,aAAa,WAoBzB,CAAC;AAEF,eAAO,MAAM,eAAe,WA6B3B,CAAC;AAKF,eAAO,MAAM,qBAAqB,WA+BjC,CAAC;AAQF,eAAO,MAAM,eAAe,WAqB3B,CAAC;AAGF,eAAO,MAAM,mBAAmB,WAM/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAiB5B,CAAC;AAKF,eAAO,MAAM,gBAAgB,WAM5B,CAAC;AAKF,eAAO,MAAM,MAAM,WAwBlB,CAAC;AAGF,eAAO,MAAM,iBAAiB,WAM7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAmB7B,CAAC;AAEF,eAAO,MAAM,eAAe,WAgB3B,CAAC;AAIF,eAAO,MAAM,gBAAgB,WAoB5B,CAAC;AAWF,eAAO,MAAM,MAAM,WASlB,CAAC;AAEF,eAAO,MAAM,cAAc,WAI1B,CAAC;AA6BF,eAAO,MAAM,YAAY,WAavB,CAAC;AAgBH,eAAO,MAAM,oBAAoB,WAAsJ,CAAC;AACxL,eAAO,MAAM,sBAAsB,WAAyJ,CAAC;AAI7L,eAAO,MAAM,oBAAoB,WAW/B,CAAC;AAEH,eAAO,MAAM,WAAW,WAUtB,CAAC;AAEH,eAAO,MAAM,oBAAoB,WAK/B,CAAC;AAEH,eAAO,MAAM,oBAAoB,WAQ/B,CAAC;AAKH,eAAO,MAAM,aAAa,WAaxB,CAAC;AAEH,eAAO,MAAM,aAAa,WAKxB,CAAC;AAEH,eAAO,MAAM,aAAa,WAOxB,CAAC"}