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,9 @@
1
+ import type { CodeCheck } from "../types.js";
2
+ /**
3
+ * All static-analysis checks, keyed by CodeCheck.key. Annex B items opt in via AnnexItem.checks.code.
4
+ * "python" / "javascript" checks run on any project with that language; framework checks
5
+ * (Django, Node server frameworks) need the framework to be detected.
6
+ * Rule sets for other languages plug in here with their own appliesTo.
7
+ */
8
+ export declare const CODE_CHECKS: ReadonlyMap<string, CodeCheck>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/code/checks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2G7C;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CA8GtD,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { cryptoMisuse, weakCrypto } from "./crypto.js";
2
+ import { djangoAuthRateLimit, djangoCsrf, djangoDebug, djangoLoginRotation, djangoMediaRoot, djangoSessionDomain, djangoSessionExpiry, djangoSessionHttpOnly, djangoSessionPath, djangoSessionSecure, djangoUploadPath, djangoUploadSize, djangoUploadType, } from "./django.js";
3
+ import { flaskAuthRateLimit, flaskCsrf, flaskDebug, flaskSessionHttpOnly, flaskSessionSecure } from "./flask.js";
4
+ import { codeInjection, commandInjection, ldapInjection, massAssignment, openRedirect, pathTraversal, regexInjection, sqlInjection, templateInjection, xpathInjection, xss, } from "./injection.js";
5
+ import { jsAuthRateLimit, jsCsrf, jsDebug, jsLoginRotation, jsSessionDomain, jsSessionExpiry, jsSessionHttpOnly, jsSessionPath, jsSessionSecure, jsUploadPath, jsUploadSize, jsUploadType, } from "./javascript-config.js";
6
+ import { jsCodeInjection, jsCommandInjection, jsCryptoMisuse, jsExternalDtd, jsHardcodedSecrets, jsMassAssignment, jsOpenRedirect, jsPathTraversal, jsPlaintextPasswords, jsRegexInjection, jsSecretsInLogs, jsSqlInjection, jsTemplateInjection, jsWeakCrypto, jsXss, jsXxe, } from "./javascript.js";
7
+ import { laravelAuthRateLimit, laravelCsrf, laravelDebug, laravelLoginRotation, laravelSessionExpiry, laravelSessionHttpOnly, laravelSessionSecure, phpCodeInjection, phpCommandInjection, phpCryptoMisuse, phpExternalDtd, phpHardcodedSecrets, phpMassAssignment, phpOpenRedirect, phpPathTraversal, phpPlaintextPasswords, phpRegexInjection, phpSecretsInLogs, phpSqlInjection, phpUploadPath, phpUploadSize, phpUploadType, phpWeakCrypto, phpXss, phpXxe, } from "./php.js";
8
+ import { hardcodedSecrets, plaintextPasswords, secretsInLogs } from "./secrets.js";
9
+ import { tsCodeInjection, tsCommandInjection, tsCryptoMisuse, tsCsrf, tsHardcodedSecrets, tsOpenRedirect, tsPathTraversal, tsSecretsInLogs, tsSqlInjection, tsWeakCrypto, tsXss, tsXxe, } from "./treesitter.js";
10
+ import { entityExpansion, externalDtd, xmlExtensions, xxe } from "./xml.js";
11
+ /**
12
+ * All static-analysis checks, keyed by CodeCheck.key. Annex B items opt in via AnnexItem.checks.code.
13
+ * "python" / "javascript" checks run on any project with that language; framework checks
14
+ * (Django, Node server frameworks) need the framework to be detected.
15
+ * Rule sets for other languages plug in here with their own appliesTo.
16
+ */
17
+ export const CODE_CHECKS = new Map([
18
+ weakCrypto,
19
+ cryptoMisuse,
20
+ hardcodedSecrets,
21
+ plaintextPasswords,
22
+ secretsInLogs,
23
+ sqlInjection,
24
+ commandInjection,
25
+ codeInjection,
26
+ xss,
27
+ pathTraversal,
28
+ xpathInjection,
29
+ ldapInjection,
30
+ regexInjection,
31
+ templateInjection,
32
+ massAssignment,
33
+ openRedirect,
34
+ xxe,
35
+ externalDtd,
36
+ xmlExtensions,
37
+ entityExpansion,
38
+ djangoDebug,
39
+ djangoCsrf,
40
+ djangoSessionSecure,
41
+ djangoSessionHttpOnly,
42
+ djangoSessionDomain,
43
+ djangoSessionPath,
44
+ djangoSessionExpiry,
45
+ djangoMediaRoot,
46
+ djangoLoginRotation,
47
+ djangoAuthRateLimit,
48
+ djangoUploadPath,
49
+ djangoUploadSize,
50
+ djangoUploadType,
51
+ // Flask / FastAPI
52
+ flaskDebug,
53
+ flaskCsrf,
54
+ flaskSessionSecure,
55
+ flaskSessionHttpOnly,
56
+ flaskAuthRateLimit,
57
+ // JavaScript / TypeScript
58
+ jsHardcodedSecrets,
59
+ jsWeakCrypto,
60
+ jsCryptoMisuse,
61
+ jsPlaintextPasswords,
62
+ jsSqlInjection,
63
+ jsCommandInjection,
64
+ jsCodeInjection,
65
+ jsPathTraversal,
66
+ jsXss,
67
+ jsRegexInjection,
68
+ jsTemplateInjection,
69
+ jsMassAssignment,
70
+ jsOpenRedirect,
71
+ jsSecretsInLogs,
72
+ jsXxe,
73
+ jsExternalDtd,
74
+ jsDebug,
75
+ jsCsrf,
76
+ jsSessionSecure,
77
+ jsSessionHttpOnly,
78
+ jsSessionDomain,
79
+ jsSessionPath,
80
+ jsSessionExpiry,
81
+ jsLoginRotation,
82
+ jsAuthRateLimit,
83
+ jsUploadPath,
84
+ jsUploadSize,
85
+ jsUploadType,
86
+ // PHP / Laravel
87
+ phpHardcodedSecrets,
88
+ phpWeakCrypto,
89
+ phpCryptoMisuse,
90
+ phpPlaintextPasswords,
91
+ phpSqlInjection,
92
+ phpCommandInjection,
93
+ phpCodeInjection,
94
+ phpPathTraversal,
95
+ phpXss,
96
+ phpRegexInjection,
97
+ phpMassAssignment,
98
+ phpOpenRedirect,
99
+ phpSecretsInLogs,
100
+ phpXxe,
101
+ phpExternalDtd,
102
+ phpUploadPath,
103
+ phpUploadSize,
104
+ phpUploadType,
105
+ laravelDebug,
106
+ laravelCsrf,
107
+ laravelSessionSecure,
108
+ laravelSessionHttpOnly,
109
+ laravelSessionExpiry,
110
+ laravelAuthRateLimit,
111
+ laravelLoginRotation,
112
+ // Java / C# / Ruby / Go
113
+ tsHardcodedSecrets,
114
+ tsWeakCrypto,
115
+ tsCryptoMisuse,
116
+ tsSqlInjection,
117
+ tsCommandInjection,
118
+ tsCodeInjection,
119
+ tsPathTraversal,
120
+ tsXss,
121
+ tsOpenRedirect,
122
+ tsSecretsInLogs,
123
+ tsXxe,
124
+ tsCsrf,
125
+ ].map((c) => [c.key, c]));
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/code/checks/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Confidence } from "../../types.js";
2
+ import { type CallSite, type PyNode } from "../python/index.js";
3
+ export interface SinkOptions {
4
+ /** Report values of unknown origin as low confidence (default true). */
5
+ unknownIsLow?: boolean;
6
+ /** Only report when request data reaches the sink (file paths, regexes, templates...). */
7
+ requestOnly?: boolean;
8
+ }
9
+ /**
10
+ * How risky is passing `arg` to a sink?
11
+ * high - contains request data directly, or is a string built from it
12
+ * medium - built dynamically (f-string, %, +, .format), or derived from request data via local variables/URL params
13
+ * low - some other non-literal value (origin unknown)
14
+ */
15
+ export declare function argRisk(site: CallSite, arg: PyNode | undefined, opts?: SinkOptions): Confidence | undefined;
16
+ export declare const sqlInjection: import("../types.js").CodeCheck;
17
+ export declare const commandInjection: import("../types.js").CodeCheck;
18
+ export declare const codeInjection: import("../types.js").CodeCheck;
19
+ export declare const xss: import("../types.js").CodeCheck;
20
+ export declare const pathTraversal: import("../types.js").CodeCheck;
21
+ export declare const xpathInjection: import("../types.js").CodeCheck;
22
+ export declare const ldapInjection: import("../types.js").CodeCheck;
23
+ export declare const regexInjection: import("../types.js").CodeCheck;
24
+ export declare const templateInjection: import("../types.js").CodeCheck;
25
+ export declare const massAssignment: import("../types.js").CodeCheck;
26
+ export declare const openRedirect: import("../types.js").CodeCheck;
27
+ //# sourceMappingURL=injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../../src/code/checks/injection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EASL,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,GAAG,SAAS,CAW/G;AAwBD,eAAO,MAAM,YAAY,iCAoBxB,CAAC;AAOF,eAAO,MAAM,gBAAgB,iCAe5B,CAAC;AAKF,eAAO,MAAM,aAAa,iCA0BzB,CAAC;AAKF,eAAO,MAAM,GAAG,iCAqCf,CAAC;AAKF,eAAO,MAAM,aAAa,iCAOzB,CAAC;AAGF,eAAO,MAAM,cAAc,iCAO1B,CAAC;AAEF,eAAO,MAAM,aAAa,iCAYzB,CAAC;AAEF,eAAO,MAAM,cAAc,iCAU1B,CAAC;AAIF,eAAO,MAAM,iBAAiB,iCAO7B,CAAC;AAGF,eAAO,MAAM,cAAc,iCAuB1B,CAAC;AAMF,eAAO,MAAM,YAAY,iCAkBxB,CAAC"}
@@ -0,0 +1,189 @@
1
+ import { NO_PATTERN, pyFinding, snippetOf } from "../findings.js";
2
+ import { callArgs, dotted, isDynamicString, isNode, isTrue, kwarg, starKwargs, strConst, } from "../python/index.js";
3
+ import { bases, classDefs, patternCheck, walkStatements } from "./shared.js";
4
+ /**
5
+ * How risky is passing `arg` to a sink?
6
+ * high - contains request data directly, or is a string built from it
7
+ * medium - built dynamically (f-string, %, +, .format), or derived from request data via local variables/URL params
8
+ * low - some other non-literal value (origin unknown)
9
+ */
10
+ export function argRisk(site, arg, opts = {}) {
11
+ if (!arg || strConst(arg) !== undefined || arg._t === "Constant")
12
+ return undefined;
13
+ if (arg._t === "JoinedStr" && !isDynamicString(arg))
14
+ return undefined;
15
+ const scope = site.module.scope(site.fn);
16
+ if (site.module.isRequestDerived(arg))
17
+ return "high";
18
+ const derived = site.module.isRequestDerived(arg, scope);
19
+ if (opts.requestOnly && !derived)
20
+ return undefined;
21
+ if (isDynamicString(arg))
22
+ return derived ? "high" : "medium";
23
+ if (derived)
24
+ return "medium";
25
+ if (arg._t === "Name" && scope?.dynamicStrings.has(arg["id"]))
26
+ return "medium";
27
+ return opts.unknownIsLow === false ? undefined : "low";
28
+ }
29
+ function sinkFindings(sites, match, rule, why, opts = {}) {
30
+ const out = [];
31
+ for (const site of sites) {
32
+ const m = match(site);
33
+ if (!m)
34
+ continue;
35
+ const risks = (Array.isArray(m) ? m : [m]).map((a) => argRisk(site, a, opts)).filter((r) => !!r);
36
+ if (risks.length === 0)
37
+ continue;
38
+ const confidence = risks.includes("high") ? "high" : risks.includes("medium") ? "medium" : "low";
39
+ out.push(pyFinding(site.module, site.node, rule, confidence, why));
40
+ }
41
+ return out;
42
+ }
43
+ const first = (s) => callArgs(s.node)[0];
44
+ // --- #41 SQL injection --------------------------------------------------------
45
+ export const sqlInjection = patternCheck("py-sql-injection", ["python"], (index) => {
46
+ const calls = index.calls();
47
+ return [
48
+ ...sinkFindings(calls, (s) => (["execute", "executemany", "executescript"].includes(s.method ?? "") ? first(s) : undefined), "py-sql-string-building", "SQL built from strings can be manipulated by user input; pass parameters separately (cursor.execute(sql, params))."),
49
+ ...sinkFindings(calls, (s) => (s.method === "raw" && /objects/.test(dotted(s.node["func"]) ?? "") ? first(s) : undefined), "django-raw-sql", "Manager.raw() with an interpolated query is injectable; use params=[...]."),
50
+ ...sinkFindings(calls, (s) => (/(^|\.)RawSQL$/.test(s.name ?? "") || s.name === "sqlalchemy.text" ? first(s) : undefined), "py-raw-sql-expression", "Raw SQL expressions built from strings are injectable; use bound parameters."),
51
+ ...sinkFindings(calls, (s) => {
52
+ if (s.method !== "extra")
53
+ return undefined;
54
+ const parts = ["where", "select", "tables", "order_by"].map((k) => kwarg(s.node, k)).filter(isNode);
55
+ return parts.flatMap((p) => (p._t === "List" || p._t === "Tuple" ? p["elts"] : p._t === "Dict" ? p["values"] : [p]));
56
+ }, "django-extra-sql", "QuerySet.extra() with interpolated SQL is injectable; use params or the ORM.", { unknownIsLow: false }),
57
+ ];
58
+ }, (n) => NO_PATTERN("SQL built by string concatenation or formatting", n));
59
+ // --- #44 OS command injection -------------------------------------------------
60
+ const SHELL_FN = /^(os\.(system|popen|popen2|popen3|popen4)|commands\.getoutput|commands\.getstatusoutput|subprocess\.(getoutput|getstatusoutput))$/;
61
+ const SUBPROCESS_FN = /^subprocess\.(run|call|Popen|check_output|check_call)$/;
62
+ const EXEC_FN = /^os\.(exec\w+|spawn\w+)$/;
63
+ export const commandInjection = patternCheck("py-command-injection", ["python"], (index) => {
64
+ const calls = index.calls();
65
+ return [
66
+ ...sinkFindings(calls, (s) => (SHELL_FN.test(s.name ?? "") ? first(s) : undefined), "py-shell-command", "Running a shell command built from variables allows command injection; use subprocess with an argument list and no shell."),
67
+ ...sinkFindings(calls, (s) => (SUBPROCESS_FN.test(s.name ?? "") && isTrue(kwarg(s.node, "shell")) ? (first(s) ?? kwarg(s.node, "args")) : undefined), "py-subprocess-shell", "shell=True with a variable command allows command injection; pass an argument list without shell=True."),
68
+ ...sinkFindings(calls, (s) => (EXEC_FN.test(s.name ?? "") ? callArgs(s.node) : undefined), "py-exec-spawn", "Executing programs with request-controlled arguments allows command/argument injection.", { unknownIsLow: false }),
69
+ ];
70
+ }, (n) => NO_PATTERN("OS command execution with variable input", n));
71
+ // --- #54 Dynamic scripting / code injection -----------------------------------
72
+ const SAFE_YAML_LOADER = /(Safe|Base)Loader$/;
73
+ export const codeInjection = patternCheck("py-code-injection", ["python"], (index) => {
74
+ const calls = index.calls();
75
+ const out = [
76
+ ...sinkFindings(calls, (s) => (s.name === "eval" || s.name === "exec" || s.name === "builtins.eval" || s.name === "builtins.exec" ? first(s) : undefined), "py-eval", "eval()/exec() of non-constant input runs arbitrary code."),
77
+ ...sinkFindings(calls, (s) => (s.name === "__import__" || s.name === "importlib.import_module" ? first(s) : undefined), "py-dynamic-import", "Importing modules chosen by input can load attacker-chosen code.", { unknownIsLow: false }),
78
+ ...sinkFindings(calls, (s) => (/^(pickle|cPickle|_pickle|dill|marshal|shelve|jsonpickle)\.(loads?|decode|open)$/.test(s.name ?? "") ? first(s) : undefined), "py-unsafe-deserialization", "Unpickling untrusted data executes arbitrary code.", { unknownIsLow: false }),
79
+ ];
80
+ for (const s of calls) {
81
+ if (s.name === "yaml.unsafe_load" || s.name === "yaml.full_load") {
82
+ out.push(pyFinding(s.module, s.node, "py-yaml-unsafe-load", "high", "Unsafe YAML loading can construct arbitrary Python objects; use yaml.safe_load()."));
83
+ }
84
+ else if (s.name === "yaml.load") {
85
+ const loader = kwarg(s.node, "Loader") ?? callArgs(s.node)[1];
86
+ if (!loader || !SAFE_YAML_LOADER.test(dotted(loader) ?? "")) {
87
+ out.push(pyFinding(s.module, s.node, "py-yaml-unsafe-load", loader ? "high" : "medium", "yaml.load() without SafeLoader can construct arbitrary Python objects; use yaml.safe_load()."));
88
+ }
89
+ }
90
+ }
91
+ return out;
92
+ }, (n) => NO_PATTERN("eval/exec, unsafe deserialisation or dynamic imports of variable input", n));
93
+ // --- #43 Cross-site scripting -------------------------------------------------
94
+ const MARK_SAFE = /(^|\.)(mark_safe|SafeString|SafeText|Markup)$/;
95
+ export const xss = patternCheck("py-xss", ["python"], async (index, ctx) => {
96
+ const calls = index.calls();
97
+ const out = [
98
+ ...sinkFindings(calls, (s) => (MARK_SAFE.test(s.name ?? "") ? first(s) : undefined), "django-mark-safe", "mark_safe() on non-constant content disables auto-escaping; use format_html() or escape the input."),
99
+ ...sinkFindings(calls, (s) => (/(^|\.)format_html$/.test(s.name ?? "") && isDynamicString(first(s)) ? first(s) : undefined), "django-format-html-prebuilt", "Pre-formatting the string passed to format_html() bypasses its escaping; pass values as arguments."),
100
+ ...sinkFindings(calls, (s) => {
101
+ const a = first(s);
102
+ return /(^|\.)HttpResponse$/.test(s.name ?? "") && a && isDynamicString(a) ? a : undefined;
103
+ }, "django-httpresponse-interpolation", "Writing request data into an HTML response without escaping enables reflected XSS.", { requestOnly: true }),
104
+ ];
105
+ // Templates are not Python; regex is the only option here (higher false-positive rate, flagged in output).
106
+ for (const f of ctx.files.filter((x) => /(^|\/)templates\/.+\.(html?|txt|jinja2?|j2)$/.test(x.path))) {
107
+ const lines = (await ctx.read(f.path)).split(/\r?\n/);
108
+ lines.forEach((line, i) => {
109
+ const autoescapeOff = /\{%-?\s*autoescape\s+(off|false)\s*-?%\}/i.test(line);
110
+ const safeFilter = /\|\s*safe\b/.test(line);
111
+ if (autoescapeOff || safeFilter) {
112
+ out.push({
113
+ file: f.path,
114
+ line: i + 1,
115
+ snippet: snippetOf(line),
116
+ why: autoescapeOff ? "Turning auto-escaping off renders variables as raw HTML." : "The |safe filter renders a variable as raw HTML; safe only if the value can never contain user input.",
117
+ confidence: autoescapeOff ? "medium" : "low",
118
+ method: "regex",
119
+ rule: autoescapeOff ? "django-template-autoescape-off" : "django-template-safe-filter",
120
+ });
121
+ }
122
+ });
123
+ }
124
+ return out;
125
+ }, (n) => NO_PATTERN("auto-escaping bypasses (mark_safe, |safe, autoescape off, unescaped responses)", n));
126
+ // --- #42 Path traversal / filename injection ----------------------------------
127
+ const PATH_SINK = /^(open|io\.open|codecs\.open|os\.path\.join|pathlib\.Path|os\.(remove|unlink|rename|replace|rmdir|makedirs|mkdir|listdir|scandir|stat)|shutil\.\w+|django\.http\.FileResponse|django\.views\.static\.serve|flask\.send_file|flask\.send_from_directory)$/;
128
+ export const pathTraversal = patternCheck("py-path-traversal", ["python"], (index) => sinkFindings(index.calls(), (s) => (PATH_SINK.test(s.name ?? "") ? callArgs(s.node) : undefined), "py-path-from-request", "File paths built from request data allow ../ traversal; normalise and confine paths to an allowed directory.", { requestOnly: true }), (n) => NO_PATTERN("file paths built from request data", n));
129
+ // --- #46 XPath / #53 LDAP / #55 regex / #58 template injection -----------------
130
+ export const xpathInjection = patternCheck("py-xpath-injection", ["python"], (index) => sinkFindings(index.calls(), (s) => (s.method === "xpath" || /(^|\.)XPath$/.test(s.name ?? "") ? first(s) : undefined), "py-xpath-string-building", "XPath queries built from strings are injectable; use XPath variables (xpath(expr, name=value)).", { unknownIsLow: false }), (n) => NO_PATTERN("XPath queries built from strings", n));
131
+ export const ldapInjection = patternCheck("py-ldap-injection", ["python"], (index) => {
132
+ if (!index.imports("ldap") && !index.imports("ldap3"))
133
+ return [];
134
+ return sinkFindings(index.calls(), (s) => {
135
+ if (!/^search(_s|_st|_ext|_ext_s)?$/.test(s.method ?? ""))
136
+ return undefined;
137
+ const args = callArgs(s.node);
138
+ return kwarg(s.node, "filterstr") ?? kwarg(s.node, "search_filter") ?? (s.method === "search" ? args[1] : args[2]);
139
+ }, "py-ldap-filter-building", "LDAP filters built from input are injectable; escape values with ldap.filter.escape_filter_chars().", { unknownIsLow: false });
140
+ }, (n) => NO_PATTERN("LDAP filters built from strings", n));
141
+ export const regexInjection = patternCheck("py-regex-injection", ["python"], (index) => sinkFindings(index.calls(), (s) => {
142
+ if (!/^re\.(compile|search|match|fullmatch|findall|finditer|sub|subn|split)$/.test(s.name ?? ""))
143
+ return undefined;
144
+ const a = first(s);
145
+ return a && !(a._t === "Call" && dotted(a["func"])?.endsWith("escape")) ? a : undefined;
146
+ }, "py-regex-from-request", "Regular expressions taken from input allow ReDoS and pattern manipulation; use re.escape().", { requestOnly: true }), (n) => NO_PATTERN("regular expressions built from request data", n));
147
+ const TEMPLATE_CTOR = /^(flask\.render_template_string|django\.template\.(Template|engines\[\]\.from_string)|jinja2\.(Template|Environment\(\)\.from_string)|mako\.template\.Template)$|(^|\.)from_string$/;
148
+ export const templateInjection = patternCheck("py-template-injection", ["python"], (index) => sinkFindings(index.calls(), (s) => (TEMPLATE_CTOR.test(s.name ?? "") ? first(s) : undefined), "py-template-from-input", "Compiling templates from variable input enables server-side template injection."), (n) => NO_PATTERN("templates compiled from variable input", n));
149
+ // --- #56 Data property / field injection (mass assignment) ---------------------
150
+ export const massAssignment = patternCheck("py-mass-assignment", ["python"], (index) => {
151
+ const out = [];
152
+ for (const s of index.calls()) {
153
+ if (starKwargs(s.node).some((v) => s.module.isRequestDerived(v, s.module.scope(s.fn)))) {
154
+ out.push(pyFinding(s.module, s.node, "py-kwargs-from-request", "high", "Passing **request data into a model/ORM call lets clients set any field (e.g. is_staff)."));
155
+ }
156
+ }
157
+ for (const { module, node } of classDefs(index)) {
158
+ if (!bases(module, node).some((b) => /(ModelForm|ModelSerializer|HyperlinkedModelSerializer)$/.test(b)))
159
+ continue;
160
+ const meta = node["body"].find((b) => b._t === "ClassDef" && b["name"] === "Meta");
161
+ for (const stmt of meta ? walkStatements(meta) : []) {
162
+ const t = stmt._t === "Assign" ? stmt["targets"][0] : undefined;
163
+ if (t?._t === "Name" && t["id"] === "fields" && strConst(stmt["value"]) === "__all__") {
164
+ out.push(pyFinding(module, stmt, "django-fields-all", "medium", 'fields = "__all__" exposes every model field to client input, including ones added later.'));
165
+ }
166
+ }
167
+ }
168
+ return out;
169
+ }, (n) => NO_PATTERN("mass-assignment patterns (**request data, fields = \"__all__\")", n));
170
+ // --- #60 / #97 Open redirect ----------------------------------------------------
171
+ const REDIRECT = /^(django\.shortcuts\.redirect|django\.http\.(HttpResponseRedirect|HttpResponsePermanentRedirect)|flask\.redirect)$|^(redirect|HttpResponseRedirect|HttpResponsePermanentRedirect)$/;
172
+ const REDIRECT_GUARD = /(url_has_allowed_host_and_scheme|is_safe_url)$/;
173
+ export const openRedirect = patternCheck("py-open-redirect", ["python"], (index) => {
174
+ const out = [];
175
+ for (const s of index.calls()) {
176
+ if (!REDIRECT.test(s.name ?? ""))
177
+ continue;
178
+ const target = first(s) ?? kwarg(s.node, "to");
179
+ const scope = s.module.scope(s.fn);
180
+ if (!target || !s.module.isRequestDerived(target, scope))
181
+ continue;
182
+ if (scope && [...scope.calls].some((c) => REDIRECT_GUARD.test(c)))
183
+ continue; // validated in the same function
184
+ const direct = s.module.isRequestDerived(target);
185
+ out.push(pyFinding(s.module, s.node, "py-open-redirect", direct ? "high" : "medium", "Redirecting to a URL taken from the request lets attackers send users to malicious sites; validate with url_has_allowed_host_and_scheme()."));
186
+ }
187
+ return out;
188
+ }, (n) => NO_PATTERN("redirects to request-controlled URLs without validation", n));
189
+ //# sourceMappingURL=injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection.js","sourceRoot":"","sources":["../../../src/code/checks/injection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CodeCheck } from "../types.js";
2
+ export declare const jsDebug: CodeCheck;
3
+ export declare const jsCsrf: CodeCheck;
4
+ export declare const jsSessionSecure: CodeCheck;
5
+ export declare const jsSessionHttpOnly: CodeCheck;
6
+ export declare const jsSessionDomain: CodeCheck;
7
+ export declare const jsSessionPath: CodeCheck;
8
+ export declare const jsSessionExpiry: CodeCheck;
9
+ export declare const jsLoginRotation: CodeCheck;
10
+ export declare const jsAuthRateLimit: CodeCheck;
11
+ export declare const jsUploadPath: CodeCheck;
12
+ export declare const jsUploadSize: CodeCheck;
13
+ export declare const jsUploadType: CodeCheck;
14
+ //# sourceMappingURL=javascript-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-config.d.ts","sourceRoot":"","sources":["../../../src/code/checks/javascript-config.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,aAAa,CAAC;AA2BvE,eAAO,MAAM,OAAO,WAqBlB,CAAC;AAMH,eAAO,MAAM,MAAM,WAUjB,CAAC;AAoDH,eAAO,MAAM,eAAe,WAAiJ,CAAC;AAC9K,eAAO,MAAM,iBAAiB,WAAkJ,CAAC;AAEjL,eAAO,MAAM,eAAe,WAgB1B,CAAC;AAEH,eAAO,MAAM,aAAa,WAMxB,CAAC;AAIH,eAAO,MAAM,eAAe,WAkB1B,CAAC;AAKH,eAAO,MAAM,eAAe,WAgB1B,CAAC;AAKH,eAAO,MAAM,eAAe,WAI1B,CAAC;AAQH,eAAO,MAAM,YAAY,WAiBvB,CAAC;AAEH,eAAO,MAAM,YAAY,WAYvB,CAAC;AAEH,eAAO,MAAM,YAAY,WAWvB,CAAC"}