thuban 0.4.3 → 0.4.6
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.
- package/LICENSE +21 -21
- package/README.md +437 -187
- package/dist/LICENSE +21 -21
- package/dist/README.md +437 -187
- package/dist/cli.js +1 -1
- package/dist/package.json +64 -63
- package/dist/packages/crucible/.golden/golden-master.json +413 -413
- package/dist/packages/crucible/mutation-engine.js +1 -1
- package/dist/packages/crucible/pattern-learner.js +1 -1
- package/dist/packages/crucible/rule-loader.js +1 -1
- package/dist/packages/crucible/rules/code-scanner-core.json +281 -147
- package/dist/packages/crucible/rules/command-injection.json +411 -411
- package/dist/packages/crucible/rules/crypto-misuse.json +35 -35
- package/dist/packages/crucible/rules/deserialization.json +152 -152
- package/dist/packages/crucible/rules/env-injection.json +46 -46
- package/dist/packages/crucible/rules/eval-abuse.json +104 -104
- package/dist/packages/crucible/rules/file-upload.json +46 -46
- package/dist/packages/crucible/rules/hallucination.json +22 -22
- package/dist/packages/crucible/rules/hardcoded-secret.json +397 -397
- package/dist/packages/crucible/rules/hardcoded-url.json +13 -13
- package/dist/packages/crucible/rules/insecure-crypto.json +302 -302
- package/dist/packages/crucible/rules/integer-overflow.json +35 -35
- package/dist/packages/crucible/rules/log-injection.json +33 -33
- package/dist/packages/crucible/rules/mass-assignment.json +112 -112
- package/dist/packages/crucible/rules/open-redirect.json +196 -196
- package/dist/packages/crucible/rules/path-traversal.json +422 -422
- package/dist/packages/crucible/rules/prototype-pollution.json +22 -22
- package/dist/packages/crucible/rules/sql-injection.json +619 -619
- package/dist/packages/crucible/rules/ssrf.json +557 -557
- package/dist/packages/crucible/rules/timing-attack.json +55 -55
- package/dist/packages/crucible/rules/unsafe-block.json +24 -24
- package/dist/packages/crucible/rules/xss.json +663 -663
- package/dist/packages/crucible/rules/xxe.json +66 -66
- package/dist/packages/crucible/rules/yaml-deserialization.json +22 -22
- package/dist/packages/crucible/rules/yaml-injection.json +22 -22
- package/dist/packages/crucible/seeding-engine.js +1 -1
- package/dist/packages/crucible/seeds/csharp/seed-001.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-002.cs +24 -24
- package/dist/packages/crucible/seeds/csharp/seed-003.cs +30 -30
- package/dist/packages/crucible/seeds/csharp/seed-004.cs +31 -31
- package/dist/packages/crucible/seeds/csharp/seed-005.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-006.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-007.cs +34 -34
- package/dist/packages/crucible/seeds/csharp/seed-008.cs +23 -23
- package/dist/packages/crucible/seeds/csharp/seed-009.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-010.cs +29 -29
- package/dist/packages/crucible/seeds/csharp/seed-011.cs +32 -32
- package/dist/packages/crucible/seeds/csharp/seed-012.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-013.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-014.cs +26 -26
- package/dist/packages/crucible/seeds/csharp/seed-015.cs +33 -33
- package/dist/packages/crucible/seeds/csharp/seed-016.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-017.cs +22 -22
- package/dist/packages/crucible/seeds/csharp/seed-018.cs +26 -26
- package/dist/packages/crucible/seeds/csharp/seed-019.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-020.cs +22 -22
- package/dist/packages/crucible/seeds/csharp/seed-021.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-022.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-023.cs +33 -33
- package/dist/packages/crucible/seeds/csharp/seed-024.cs +31 -31
- package/dist/packages/crucible/seeds/csharp/seed-025.cs +31 -31
- package/dist/packages/crucible/seeds/csharp/seed-026.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-027.cs +29 -29
- package/dist/packages/crucible/seeds/csharp/seed-028.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-029.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-030.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-031.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-032.cs +30 -30
- package/dist/packages/crucible/seeds/csharp/seed-033.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-034.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-035.cs +32 -32
- package/dist/packages/crucible/seeds/csharp/seed-036.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-037.cs +29 -29
- package/dist/packages/crucible/seeds/csharp/seed-038.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-039.cs +29 -29
- package/dist/packages/crucible/seeds/csharp/seed-040.cs +28 -28
- package/dist/packages/crucible/seeds/csharp/seed-041.cs +33 -33
- package/dist/packages/crucible/seeds/csharp/seed-042.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-043.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-044.cs +25 -25
- package/dist/packages/crucible/seeds/csharp/seed-045.cs +30 -30
- package/dist/packages/crucible/seeds/csharp/seed-046.cs +29 -29
- package/dist/packages/crucible/seeds/csharp/seed-047.cs +26 -26
- package/dist/packages/crucible/seeds/csharp/seed-048.cs +31 -31
- package/dist/packages/crucible/seeds/csharp/seed-049.cs +27 -27
- package/dist/packages/crucible/seeds/csharp/seed-050.cs +30 -30
- package/dist/packages/crucible/seeds/csharp/seed-051.cs +34 -34
- package/dist/packages/crucible/seeds/csharp/seed-052.cs +36 -36
- package/dist/packages/crucible/seeds/go/seed-001.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-002.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-003.go +31 -31
- package/dist/packages/crucible/seeds/go/seed-004.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-005.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-006.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-007.go +24 -24
- package/dist/packages/crucible/seeds/go/seed-008.go +25 -25
- package/dist/packages/crucible/seeds/go/seed-009.go +30 -30
- package/dist/packages/crucible/seeds/go/seed-010.go +35 -35
- package/dist/packages/crucible/seeds/go/seed-011.go +24 -24
- package/dist/packages/crucible/seeds/go/seed-012.go +24 -24
- package/dist/packages/crucible/seeds/go/seed-013.go +31 -31
- package/dist/packages/crucible/seeds/go/seed-014.go +35 -35
- package/dist/packages/crucible/seeds/go/seed-015.go +25 -25
- package/dist/packages/crucible/seeds/go/seed-016.go +19 -19
- package/dist/packages/crucible/seeds/go/seed-017.go +23 -23
- package/dist/packages/crucible/seeds/go/seed-018.go +23 -23
- package/dist/packages/crucible/seeds/go/seed-019.go +22 -22
- package/dist/packages/crucible/seeds/go/seed-020.go +31 -31
- package/dist/packages/crucible/seeds/go/seed-021.go +22 -22
- package/dist/packages/crucible/seeds/go/seed-022.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-023.go +26 -26
- package/dist/packages/crucible/seeds/go/seed-024.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-025.go +23 -23
- package/dist/packages/crucible/seeds/go/seed-026.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-027.go +26 -26
- package/dist/packages/crucible/seeds/go/seed-028.go +23 -23
- package/dist/packages/crucible/seeds/go/seed-029.go +28 -28
- package/dist/packages/crucible/seeds/go/seed-030.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-031.go +28 -28
- package/dist/packages/crucible/seeds/go/seed-032.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-033.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-034.go +22 -22
- package/dist/packages/crucible/seeds/go/seed-035.go +32 -32
- package/dist/packages/crucible/seeds/go/seed-036.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-037.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-038.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-039.go +26 -26
- package/dist/packages/crucible/seeds/go/seed-040.go +37 -37
- package/dist/packages/crucible/seeds/go/seed-041.go +23 -23
- package/dist/packages/crucible/seeds/go/seed-042.go +32 -32
- package/dist/packages/crucible/seeds/go/seed-043.go +35 -35
- package/dist/packages/crucible/seeds/go/seed-044.go +25 -25
- package/dist/packages/crucible/seeds/go/seed-045.go +26 -26
- package/dist/packages/crucible/seeds/go/seed-046.go +34 -34
- package/dist/packages/crucible/seeds/go/seed-047.go +26 -26
- package/dist/packages/crucible/seeds/go/seed-048.go +29 -29
- package/dist/packages/crucible/seeds/go/seed-049.go +24 -24
- package/dist/packages/crucible/seeds/go/seed-050.go +27 -27
- package/dist/packages/crucible/seeds/go/seed-051.go +38 -38
- package/dist/packages/crucible/seeds/go/seed-052.go +27 -27
- package/dist/packages/crucible/seeds/java/seed-001.java +23 -23
- package/dist/packages/crucible/seeds/java/seed-002.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-003.java +28 -28
- package/dist/packages/crucible/seeds/java/seed-004.java +26 -26
- package/dist/packages/crucible/seeds/java/seed-005.java +33 -33
- package/dist/packages/crucible/seeds/java/seed-006.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-007.java +21 -21
- package/dist/packages/crucible/seeds/java/seed-008.java +29 -29
- package/dist/packages/crucible/seeds/java/seed-009.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-010.java +30 -30
- package/dist/packages/crucible/seeds/java/seed-011.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-012.java +20 -20
- package/dist/packages/crucible/seeds/java/seed-013.java +26 -26
- package/dist/packages/crucible/seeds/java/seed-014.java +23 -23
- package/dist/packages/crucible/seeds/java/seed-015.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-016.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-017.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-018.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-019.java +38 -38
- package/dist/packages/crucible/seeds/java/seed-020.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-021.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-022.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-023.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-024.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-025.java +27 -27
- package/dist/packages/crucible/seeds/java/seed-026.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-027.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-028.java +21 -21
- package/dist/packages/crucible/seeds/java/seed-029.java +28 -28
- package/dist/packages/crucible/seeds/java/seed-030.java +27 -27
- package/dist/packages/crucible/seeds/java/seed-031.java +23 -23
- package/dist/packages/crucible/seeds/java/seed-032.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-033.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-034.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-035.java +29 -29
- package/dist/packages/crucible/seeds/java/seed-036.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-037.java +30 -30
- package/dist/packages/crucible/seeds/java/seed-038.java +29 -29
- package/dist/packages/crucible/seeds/java/seed-039.java +26 -26
- package/dist/packages/crucible/seeds/java/seed-040.java +31 -31
- package/dist/packages/crucible/seeds/java/seed-041.java +20 -20
- package/dist/packages/crucible/seeds/java/seed-042.java +26 -26
- package/dist/packages/crucible/seeds/java/seed-043.java +31 -31
- package/dist/packages/crucible/seeds/java/seed-044.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-045.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-046.java +22 -22
- package/dist/packages/crucible/seeds/java/seed-047.java +26 -26
- package/dist/packages/crucible/seeds/java/seed-048.java +24 -24
- package/dist/packages/crucible/seeds/java/seed-049.java +28 -28
- package/dist/packages/crucible/seeds/java/seed-050.java +29 -29
- package/dist/packages/crucible/seeds/java/seed-051.java +25 -25
- package/dist/packages/crucible/seeds/java/seed-052.java +32 -32
- package/dist/packages/crucible/seeds/js/seed-001.js +27 -27
- package/dist/packages/crucible/seeds/js/seed-002.js +28 -28
- package/dist/packages/crucible/seeds/js/seed-003.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-004.js +28 -28
- package/dist/packages/crucible/seeds/js/seed-005.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-006.js +28 -28
- package/dist/packages/crucible/seeds/js/seed-007.js +26 -26
- package/dist/packages/crucible/seeds/js/seed-008.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-009.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-010.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-011.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-012.js +32 -32
- package/dist/packages/crucible/seeds/js/seed-013.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-014.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-015.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-016.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-017.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-018.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-019.js +32 -32
- package/dist/packages/crucible/seeds/js/seed-020.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-021.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-022.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-023.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-024.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-025.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-026.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-027.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-028.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-029.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-030.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-031.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-032.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-033.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-034.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-035.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-036.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-037.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-038.js +31 -31
- package/dist/packages/crucible/seeds/js/seed-039.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-040.js +35 -35
- package/dist/packages/crucible/seeds/js/seed-041.js +32 -32
- package/dist/packages/crucible/seeds/js/seed-042.js +32 -32
- package/dist/packages/crucible/seeds/js/seed-043.js +27 -27
- package/dist/packages/crucible/seeds/js/seed-044.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-045.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-046.js +33 -33
- package/dist/packages/crucible/seeds/js/seed-047.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-048.js +29 -29
- package/dist/packages/crucible/seeds/js/seed-049.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-050.js +34 -34
- package/dist/packages/crucible/seeds/js/seed-051.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-052.js +30 -30
- package/dist/packages/crucible/seeds/js/seed-053.js +26 -26
- package/dist/packages/crucible/seeds/js/seed-054.js +35 -35
- package/dist/packages/crucible/seeds/js/seed-055.js +33 -33
- package/dist/packages/crucible/seeds/kotlin/seed-001.kt +24 -24
- package/dist/packages/crucible/seeds/kotlin/seed-002.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-003.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-004.kt +24 -24
- package/dist/packages/crucible/seeds/kotlin/seed-005.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-006.kt +21 -21
- package/dist/packages/crucible/seeds/kotlin/seed-007.kt +23 -23
- package/dist/packages/crucible/seeds/kotlin/seed-008.kt +25 -25
- package/dist/packages/crucible/seeds/kotlin/seed-009.kt +21 -21
- package/dist/packages/crucible/seeds/kotlin/seed-010.kt +28 -28
- package/dist/packages/crucible/seeds/kotlin/seed-011.kt +22 -22
- package/dist/packages/crucible/seeds/kotlin/seed-012.kt +25 -25
- package/dist/packages/crucible/seeds/kotlin/seed-013.kt +30 -30
- package/dist/packages/crucible/seeds/kotlin/seed-014.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-015.kt +24 -24
- package/dist/packages/crucible/seeds/kotlin/seed-016.kt +28 -28
- package/dist/packages/crucible/seeds/kotlin/seed-017.kt +33 -33
- package/dist/packages/crucible/seeds/kotlin/seed-018.kt +31 -31
- package/dist/packages/crucible/seeds/kotlin/seed-019.kt +28 -28
- package/dist/packages/crucible/seeds/kotlin/seed-020.kt +31 -31
- package/dist/packages/crucible/seeds/kotlin/seed-021.kt +34 -34
- package/dist/packages/crucible/seeds/kotlin/seed-022.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-023.kt +20 -20
- package/dist/packages/crucible/seeds/kotlin/seed-024.kt +23 -23
- package/dist/packages/crucible/seeds/kotlin/seed-025.kt +23 -23
- package/dist/packages/crucible/seeds/kotlin/seed-026.kt +26 -26
- package/dist/packages/crucible/seeds/kotlin/seed-027.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-028.kt +24 -24
- package/dist/packages/crucible/seeds/kotlin/seed-029.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-030.kt +26 -26
- package/dist/packages/crucible/seeds/kotlin/seed-031.kt +28 -28
- package/dist/packages/crucible/seeds/kotlin/seed-032.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-033.kt +30 -30
- package/dist/packages/crucible/seeds/kotlin/seed-034.kt +26 -26
- package/dist/packages/crucible/seeds/kotlin/seed-035.kt +33 -33
- package/dist/packages/crucible/seeds/kotlin/seed-036.kt +25 -25
- package/dist/packages/crucible/seeds/kotlin/seed-037.kt +26 -26
- package/dist/packages/crucible/seeds/kotlin/seed-038.kt +25 -25
- package/dist/packages/crucible/seeds/kotlin/seed-039.kt +29 -29
- package/dist/packages/crucible/seeds/kotlin/seed-040.kt +28 -28
- package/dist/packages/crucible/seeds/kotlin/seed-041.kt +31 -31
- package/dist/packages/crucible/seeds/kotlin/seed-042.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-043.kt +26 -26
- package/dist/packages/crucible/seeds/kotlin/seed-044.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-045.kt +27 -27
- package/dist/packages/crucible/seeds/kotlin/seed-046.kt +33 -33
- package/dist/packages/crucible/seeds/kotlin/seed-047.kt +32 -32
- package/dist/packages/crucible/seeds/kotlin/seed-048.kt +20 -20
- package/dist/packages/crucible/seeds/kotlin/seed-049.kt +23 -23
- package/dist/packages/crucible/seeds/kotlin/seed-050.kt +19 -19
- package/dist/packages/crucible/seeds/php/seed-001.php +23 -23
- package/dist/packages/crucible/seeds/php/seed-002.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-003.php +25 -25
- package/dist/packages/crucible/seeds/php/seed-004.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-005.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-006.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-007.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-008.php +19 -19
- package/dist/packages/crucible/seeds/php/seed-009.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-010.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-011.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-012.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-013.php +23 -23
- package/dist/packages/crucible/seeds/php/seed-014.php +20 -20
- package/dist/packages/crucible/seeds/php/seed-015.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-016.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-017.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-018.php +17 -17
- package/dist/packages/crucible/seeds/php/seed-019.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-020.php +19 -19
- package/dist/packages/crucible/seeds/php/seed-021.php +22 -22
- package/dist/packages/crucible/seeds/php/seed-022.php +15 -15
- package/dist/packages/crucible/seeds/php/seed-023.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-024.php +22 -22
- package/dist/packages/crucible/seeds/php/seed-025.php +20 -20
- package/dist/packages/crucible/seeds/php/seed-026.php +22 -22
- package/dist/packages/crucible/seeds/php/seed-027.php +15 -15
- package/dist/packages/crucible/seeds/php/seed-028.php +15 -15
- package/dist/packages/crucible/seeds/php/seed-029.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-030.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-031.php +23 -23
- package/dist/packages/crucible/seeds/php/seed-032.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-033.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-034.php +24 -24
- package/dist/packages/crucible/seeds/php/seed-035.php +22 -22
- package/dist/packages/crucible/seeds/php/seed-036.php +17 -17
- package/dist/packages/crucible/seeds/php/seed-037.php +19 -19
- package/dist/packages/crucible/seeds/php/seed-038.php +20 -20
- package/dist/packages/crucible/seeds/php/seed-039.php +15 -15
- package/dist/packages/crucible/seeds/php/seed-040.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-041.php +20 -20
- package/dist/packages/crucible/seeds/php/seed-042.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-043.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-044.php +25 -25
- package/dist/packages/crucible/seeds/php/seed-045.php +25 -25
- package/dist/packages/crucible/seeds/php/seed-046.php +20 -20
- package/dist/packages/crucible/seeds/php/seed-047.php +21 -21
- package/dist/packages/crucible/seeds/php/seed-048.php +19 -19
- package/dist/packages/crucible/seeds/php/seed-049.php +18 -18
- package/dist/packages/crucible/seeds/php/seed-050.php +20 -20
- package/dist/packages/crucible/seeds/python/seed-001.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-002.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-003.py +31 -31
- package/dist/packages/crucible/seeds/python/seed-004.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-005.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-006.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-007.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-008.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-009.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-010.py +42 -42
- package/dist/packages/crucible/seeds/python/seed-011.py +30 -30
- package/dist/packages/crucible/seeds/python/seed-012.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-013.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-014.py +40 -40
- package/dist/packages/crucible/seeds/python/seed-015.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-016.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-017.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-018.py +30 -30
- package/dist/packages/crucible/seeds/python/seed-019.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-020.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-021 2.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-021.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-022 2.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-022.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-023 2.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-023.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-024 2.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-024.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-025 2.py +40 -40
- package/dist/packages/crucible/seeds/python/seed-025.py +40 -40
- package/dist/packages/crucible/seeds/python/seed-026 2.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-026.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-027 2.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-027.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-028 2.py +42 -42
- package/dist/packages/crucible/seeds/python/seed-028.py +42 -42
- package/dist/packages/crucible/seeds/python/seed-029.py +42 -42
- package/dist/packages/crucible/seeds/python/seed-030 2.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-030.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-031 2.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-031.py +34 -34
- package/dist/packages/crucible/seeds/python/seed-032.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-033.py +32 -32
- package/dist/packages/crucible/seeds/python/seed-034.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-035.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-036 2.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-036.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-037 2.py +41 -41
- package/dist/packages/crucible/seeds/python/seed-037.py +41 -41
- package/dist/packages/crucible/seeds/python/seed-038 2.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-038.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-039 2.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-039.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-040 2.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-040.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-041 2.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-041.py +37 -37
- package/dist/packages/crucible/seeds/python/seed-042 2.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-042.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-043 2.py +32 -32
- package/dist/packages/crucible/seeds/python/seed-043.py +32 -32
- package/dist/packages/crucible/seeds/python/seed-044 2.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-044.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-045 2.py +36 -36
- package/dist/packages/crucible/seeds/python/seed-045.py +36 -36
- package/dist/packages/crucible/seeds/python/seed-046 2.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-046.py +33 -33
- package/dist/packages/crucible/seeds/python/seed-047 2.py +44 -44
- package/dist/packages/crucible/seeds/python/seed-047.py +44 -44
- package/dist/packages/crucible/seeds/python/seed-048 2.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-048.py +35 -35
- package/dist/packages/crucible/seeds/python/seed-049 2.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-049.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-050 2.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-050.py +39 -39
- package/dist/packages/crucible/seeds/python/seed-051 2.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-051.py +38 -38
- package/dist/packages/crucible/seeds/python/seed-052 2.py +41 -41
- package/dist/packages/crucible/seeds/python/seed-052.py +41 -41
- package/dist/packages/crucible/seeds/ruby/seed-001 2.rb +15 -15
- package/dist/packages/crucible/seeds/ruby/seed-001.rb +15 -15
- package/dist/packages/crucible/seeds/ruby/seed-002 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-002.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-003 2.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-003.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-004 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-004.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-005 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-005.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-006 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-006.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-007 2.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-007.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-008 2.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-008.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-009 2.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-009.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-010 2.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-010.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-011 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-011.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-012 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-012.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-013 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-013.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-014 2.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-014.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-015 2.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-015.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-016 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-016.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-017 2.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-017.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-018 2.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-018.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-019 2.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-019.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-020 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-020.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-021 2.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-021.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-022 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-022.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-023 2.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-023.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-024 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-024.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-025 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-025.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-026 2.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-026.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-027 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-027.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-028 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-028.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-029 2.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-029.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-030 2.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-030.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-031 2.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-031.rb +17 -17
- package/dist/packages/crucible/seeds/ruby/seed-032 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-032.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-033 2.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-033.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-034 2.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-034.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-035 2.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-035.rb +19 -19
- package/dist/packages/crucible/seeds/ruby/seed-036 2.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-036.rb +18 -18
- package/dist/packages/crucible/seeds/ruby/seed-037 2.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-037.rb +21 -21
- package/dist/packages/crucible/seeds/ruby/seed-038 2.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-038.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-039 2.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-039.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-040 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-040.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-041 2.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-041.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-042 2.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-042.rb +25 -25
- package/dist/packages/crucible/seeds/ruby/seed-043 2.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-043.rb +23 -23
- package/dist/packages/crucible/seeds/ruby/seed-044 2.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-044.rb +16 -16
- package/dist/packages/crucible/seeds/ruby/seed-045 2.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-045.rb +22 -22
- package/dist/packages/crucible/seeds/ruby/seed-046 2.rb +27 -27
- package/dist/packages/crucible/seeds/ruby/seed-046.rb +27 -27
- package/dist/packages/crucible/seeds/ruby/seed-047 2.rb +26 -26
- package/dist/packages/crucible/seeds/ruby/seed-047.rb +26 -26
- package/dist/packages/crucible/seeds/ruby/seed-048 2.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-048.rb +24 -24
- package/dist/packages/crucible/seeds/ruby/seed-049 2.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-049.rb +20 -20
- package/dist/packages/crucible/seeds/ruby/seed-050 2.rb +27 -27
- package/dist/packages/crucible/seeds/ruby/seed-050.rb +27 -27
- package/dist/packages/crucible/seeds/rust/seed-001 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-001.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-002 2.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-002.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-003 2.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-003.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-004 2.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-004.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-005 2.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-005.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-006 2.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-006.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-007 2.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-007.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-008 2.rs +19 -19
- package/dist/packages/crucible/seeds/rust/seed-008.rs +19 -19
- package/dist/packages/crucible/seeds/rust/seed-009 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-009.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-010 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-010.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-011 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-011.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-012 2.rs +31 -31
- package/dist/packages/crucible/seeds/rust/seed-012.rs +31 -31
- package/dist/packages/crucible/seeds/rust/seed-013 2.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-013.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-014 2.rs +30 -30
- package/dist/packages/crucible/seeds/rust/seed-014.rs +30 -30
- package/dist/packages/crucible/seeds/rust/seed-015 2.rs +33 -33
- package/dist/packages/crucible/seeds/rust/seed-015.rs +33 -33
- package/dist/packages/crucible/seeds/rust/seed-016 2.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-016.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-017 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-017.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-018 2.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-018.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-019 2.rs +36 -36
- package/dist/packages/crucible/seeds/rust/seed-019.rs +36 -36
- package/dist/packages/crucible/seeds/rust/seed-020 2.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-020.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-021 2.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-021.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-022 2.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-022.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-023 2.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-023.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-024 2.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-024.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-025 2.rs +29 -29
- package/dist/packages/crucible/seeds/rust/seed-025.rs +29 -29
- package/dist/packages/crucible/seeds/rust/seed-026 2.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-026.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-027 2.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-027.rs +24 -24
- package/dist/packages/crucible/seeds/rust/seed-028 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-028.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-029 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-029.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-030 2.rs +30 -30
- package/dist/packages/crucible/seeds/rust/seed-030.rs +30 -30
- package/dist/packages/crucible/seeds/rust/seed-031 2.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-031.rs +22 -22
- package/dist/packages/crucible/seeds/rust/seed-032 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-032.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-033 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-033.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-034 2.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-034.rs +20 -20
- package/dist/packages/crucible/seeds/rust/seed-035 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-035.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-036 2.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-036.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-037 2.rs +31 -31
- package/dist/packages/crucible/seeds/rust/seed-037.rs +31 -31
- package/dist/packages/crucible/seeds/rust/seed-038 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-038.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-039 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-039.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-040 2.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-040.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-041 2.rs +32 -32
- package/dist/packages/crucible/seeds/rust/seed-041.rs +32 -32
- package/dist/packages/crucible/seeds/rust/seed-042 2.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-042.rs +27 -27
- package/dist/packages/crucible/seeds/rust/seed-043 2.rs +29 -29
- package/dist/packages/crucible/seeds/rust/seed-043.rs +29 -29
- package/dist/packages/crucible/seeds/rust/seed-044 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-044.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-045 2.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-045.rs +28 -28
- package/dist/packages/crucible/seeds/rust/seed-046 2.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-046.rs +25 -25
- package/dist/packages/crucible/seeds/rust/seed-047 2.rs +34 -34
- package/dist/packages/crucible/seeds/rust/seed-047.rs +34 -34
- package/dist/packages/crucible/seeds/rust/seed-048 2.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-048.rs +21 -21
- package/dist/packages/crucible/seeds/rust/seed-049 2.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-049.rs +26 -26
- package/dist/packages/crucible/seeds/rust/seed-050 2.rs +23 -23
- package/dist/packages/crucible/seeds/rust/seed-050.rs +23 -23
- package/dist/packages/crucible/seeds/ts/seed-001 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-001.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-002 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-002.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-003 2.ts +28 -28
- package/dist/packages/crucible/seeds/ts/seed-003.ts +28 -28
- package/dist/packages/crucible/seeds/ts/seed-004 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-004.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-005 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-005.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-006 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-006.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-007 2.ts +28 -28
- package/dist/packages/crucible/seeds/ts/seed-007.ts +28 -28
- package/dist/packages/crucible/seeds/ts/seed-008 2.ts +40 -40
- package/dist/packages/crucible/seeds/ts/seed-008.ts +40 -40
- package/dist/packages/crucible/seeds/ts/seed-009 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-009.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-010 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-010.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-011 2.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-011.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-012 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-012.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-013 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-013.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-014 2.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-014.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-015 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-015.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-016 2.ts +37 -37
- package/dist/packages/crucible/seeds/ts/seed-016.ts +37 -37
- package/dist/packages/crucible/seeds/ts/seed-017 2.ts +44 -44
- package/dist/packages/crucible/seeds/ts/seed-017.ts +44 -44
- package/dist/packages/crucible/seeds/ts/seed-018 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-018.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-019 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-019.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-020 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-020.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-021 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-021.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-022 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-022.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-023 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-023.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-024 2.ts +35 -35
- package/dist/packages/crucible/seeds/ts/seed-024.ts +35 -35
- package/dist/packages/crucible/seeds/ts/seed-025 2.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-025.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-026 2.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-026.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-027 2.ts +30 -30
- package/dist/packages/crucible/seeds/ts/seed-027.ts +30 -30
- package/dist/packages/crucible/seeds/ts/seed-028 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-028.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-029 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-029.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-030 2.ts +37 -37
- package/dist/packages/crucible/seeds/ts/seed-030.ts +37 -37
- package/dist/packages/crucible/seeds/ts/seed-031 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-031.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-032 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-032.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-033 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-033.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-034 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-034.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-035 2.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-035.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-036 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-036.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-037 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-037.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-038 2.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-038.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-039 2.ts +35 -35
- package/dist/packages/crucible/seeds/ts/seed-039.ts +35 -35
- package/dist/packages/crucible/seeds/ts/seed-040 2.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-040.ts +31 -31
- package/dist/packages/crucible/seeds/ts/seed-041 2.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-041.ts +29 -29
- package/dist/packages/crucible/seeds/ts/seed-042 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-042.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-043 2.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-043.ts +32 -32
- package/dist/packages/crucible/seeds/ts/seed-044 2.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-044.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-045 2.ts +39 -39
- package/dist/packages/crucible/seeds/ts/seed-045.ts +39 -39
- package/dist/packages/crucible/seeds/ts/seed-046 2.ts +41 -41
- package/dist/packages/crucible/seeds/ts/seed-046.ts +41 -41
- package/dist/packages/crucible/seeds/ts/seed-047 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-047.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-048 2.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-048.ts +33 -33
- package/dist/packages/crucible/seeds/ts/seed-049 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-049.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-050 2.ts +41 -41
- package/dist/packages/crucible/seeds/ts/seed-050.ts +41 -41
- package/dist/packages/crucible/seeds/ts/seed-051 2.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-051.ts +34 -34
- package/dist/packages/crucible/seeds/ts/seed-052 2.ts +36 -36
- package/dist/packages/crucible/seeds/ts/seed-052.ts +36 -36
- package/dist/packages/scanner/ai-confidence-scorer.js +1 -1
- package/dist/packages/scanner/baseline-manager.js +1 -1
- package/dist/packages/scanner/code-scanner.js +1 -1
- package/dist/packages/scanner/codebase-passport.js +1 -1
- package/dist/packages/scanner/copy-paste-detector.js +1 -1
- package/dist/packages/scanner/dependency-graph.js +1 -1
- package/dist/packages/scanner/drift-detector.js +1 -1
- package/dist/packages/scanner/export-verifier.js +1 -1
- package/dist/packages/scanner/file-collector.js +1 -1
- package/dist/packages/scanner/ghost-code-detector.js +1 -1
- package/dist/packages/scanner/hallucination-detector.js +1 -1
- package/dist/packages/scanner/license-manager.js +1 -1
- package/dist/packages/scanner/pre-commit-gate.js +1 -1
- package/dist/packages/scanner/read-file.js +1 -0
- package/dist/packages/scanner/taint-tracker.js +1 -1
- package/dist/packages/scanner/tech-debt-analyzer.js +1 -1
- package/package.json +64 -63
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: insecure_crypto
|
|
3
|
-
// severity: medium
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: timing attack via string comparison of HMAC signatures
|
|
6
|
-
|
|
7
|
-
import * as crypto from 'crypto';
|
|
8
|
-
|
|
9
|
-
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET ?? 'fallback-secret';
|
|
10
|
-
|
|
11
|
-
export function computeSignature(payload: string): string {
|
|
12
|
-
return crypto.createHmac('sha256', WEBHOOK_SECRET).update(payload).digest('hex');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function verifyWebhookSignature(payload: string, receivedSig: string): boolean {
|
|
16
|
-
const expectedSig = computeSignature(payload);
|
|
17
|
-
// Timing attack: early exit on first mismatch leaks signature length/prefix
|
|
18
|
-
return expectedSig === receivedSig;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function verifyApiKey(providedKey: string, storedKey: string): boolean {
|
|
22
|
-
// Direct string comparison — vulnerable to timing oracle attack
|
|
23
|
-
return providedKey === storedKey;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function checkTokenMatch(a: string, b: string): boolean {
|
|
27
|
-
if (a.length !== b.length) return false;
|
|
28
|
-
// Character-by-character comparison — timing side-channel
|
|
29
|
-
for (let i = 0; i < a.length; i++) {
|
|
30
|
-
if (a[i] !== b[i]) return false;
|
|
31
|
-
}
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: timing attack via string comparison of HMAC signatures
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET ?? 'fallback-secret';
|
|
10
|
+
|
|
11
|
+
export function computeSignature(payload: string): string {
|
|
12
|
+
return crypto.createHmac('sha256', WEBHOOK_SECRET).update(payload).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function verifyWebhookSignature(payload: string, receivedSig: string): boolean {
|
|
16
|
+
const expectedSig = computeSignature(payload);
|
|
17
|
+
// Timing attack: early exit on first mismatch leaks signature length/prefix
|
|
18
|
+
return expectedSig === receivedSig;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function verifyApiKey(providedKey: string, storedKey: string): boolean {
|
|
22
|
+
// Direct string comparison — vulnerable to timing oracle attack
|
|
23
|
+
return providedKey === storedKey;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function checkTokenMatch(a: string, b: string): boolean {
|
|
27
|
+
if (a.length !== b.length) return false;
|
|
28
|
+
// Character-by-character comparison — timing side-channel
|
|
29
|
+
for (let i = 0; i < a.length; i++) {
|
|
30
|
+
if (a[i] !== b[i]) return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: insecure_crypto
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
-
|
|
7
|
-
import * as crypto from 'crypto';
|
|
8
|
-
|
|
9
|
-
interface DerivedKey {
|
|
10
|
-
key: Buffer;
|
|
11
|
-
salt: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
-
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
-
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
-
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
-
return { key, salt };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function checksumFile(data: Buffer): string {
|
|
22
|
-
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
-
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
-
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
-
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
-
}
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
interface DerivedKey {
|
|
10
|
+
key: Buffer;
|
|
11
|
+
salt: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
+
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
+
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
+
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
+
return { key, salt };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function checksumFile(data: Buffer): string {
|
|
22
|
+
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
+
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
+
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: insecure_crypto
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
-
|
|
7
|
-
import * as crypto from 'crypto';
|
|
8
|
-
|
|
9
|
-
interface DerivedKey {
|
|
10
|
-
key: Buffer;
|
|
11
|
-
salt: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
-
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
-
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
-
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
-
return { key, salt };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function checksumFile(data: Buffer): string {
|
|
22
|
-
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
-
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
-
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
-
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
-
}
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
interface DerivedKey {
|
|
10
|
+
key: Buffer;
|
|
11
|
+
salt: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
+
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
+
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
+
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
+
return { key, salt };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function checksumFile(data: Buffer): string {
|
|
22
|
+
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
+
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
+
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
-
|
|
7
|
-
interface DeepObject {
|
|
8
|
-
[key: string]: unknown;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
-
for (const key of Object.keys(source)) {
|
|
13
|
-
const srcVal = source[key];
|
|
14
|
-
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
-
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
-
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
-
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
-
} else {
|
|
19
|
-
(target as DeepObject)[key] = srcVal;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return target;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
import { Request, Response, Router } from 'express';
|
|
26
|
-
const router = Router();
|
|
27
|
-
|
|
28
|
-
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
-
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
-
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
-
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
-
res.json({ settings: merged });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
+
|
|
7
|
+
interface DeepObject {
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
+
for (const key of Object.keys(source)) {
|
|
13
|
+
const srcVal = source[key];
|
|
14
|
+
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
+
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
+
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
+
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
+
} else {
|
|
19
|
+
(target as DeepObject)[key] = srcVal;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
import { Request, Response, Router } from 'express';
|
|
26
|
+
const router = Router();
|
|
27
|
+
|
|
28
|
+
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
+
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
+
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
+
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
+
res.json({ settings: merged });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default router;
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
-
|
|
7
|
-
interface DeepObject {
|
|
8
|
-
[key: string]: unknown;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
-
for (const key of Object.keys(source)) {
|
|
13
|
-
const srcVal = source[key];
|
|
14
|
-
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
-
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
-
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
-
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
-
} else {
|
|
19
|
-
(target as DeepObject)[key] = srcVal;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return target;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
import { Request, Response, Router } from 'express';
|
|
26
|
-
const router = Router();
|
|
27
|
-
|
|
28
|
-
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
-
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
-
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
-
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
-
res.json({ settings: merged });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
+
|
|
7
|
+
interface DeepObject {
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
+
for (const key of Object.keys(source)) {
|
|
13
|
+
const srcVal = source[key];
|
|
14
|
+
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
+
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
+
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
+
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
+
} else {
|
|
19
|
+
(target as DeepObject)[key] = srcVal;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
import { Request, Response, Router } from 'express';
|
|
26
|
+
const router = Router();
|
|
27
|
+
|
|
28
|
+
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
+
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
+
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
+
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
+
res.json({ settings: merged });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default router;
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via bracket-notation assignment with user-controlled key path
|
|
6
|
-
|
|
7
|
-
import { Request, Response, Router } from 'express';
|
|
8
|
-
|
|
9
|
-
const router = Router();
|
|
10
|
-
|
|
11
|
-
function setProperty(obj: Record<string, unknown>, keyPath: string, value: unknown): void {
|
|
12
|
-
const parts = keyPath.split('.');
|
|
13
|
-
let cursor: Record<string, unknown> = obj;
|
|
14
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
15
|
-
const part = parts[i];
|
|
16
|
-
// Allows "__proto__" or "constructor" as path segment
|
|
17
|
-
if (typeof cursor[part] !== 'object') cursor[part] = {};
|
|
18
|
-
cursor = cursor[part] as Record<string, unknown>;
|
|
19
|
-
}
|
|
20
|
-
cursor[parts[parts.length - 1]] = value;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
router.patch('/user/preference', (req: Request, res: Response) => {
|
|
24
|
-
const { key, value } = req.body as { key: string; value: unknown };
|
|
25
|
-
const userPrefs: Record<string, unknown> = {};
|
|
26
|
-
// key = "__proto__.admin" → Object.prototype.admin = value
|
|
27
|
-
setProperty(userPrefs, key, value);
|
|
28
|
-
res.json({ updated: true });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via bracket-notation assignment with user-controlled key path
|
|
6
|
+
|
|
7
|
+
import { Request, Response, Router } from 'express';
|
|
8
|
+
|
|
9
|
+
const router = Router();
|
|
10
|
+
|
|
11
|
+
function setProperty(obj: Record<string, unknown>, keyPath: string, value: unknown): void {
|
|
12
|
+
const parts = keyPath.split('.');
|
|
13
|
+
let cursor: Record<string, unknown> = obj;
|
|
14
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
15
|
+
const part = parts[i];
|
|
16
|
+
// Allows "__proto__" or "constructor" as path segment
|
|
17
|
+
if (typeof cursor[part] !== 'object') cursor[part] = {};
|
|
18
|
+
cursor = cursor[part] as Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
cursor[parts[parts.length - 1]] = value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
router.patch('/user/preference', (req: Request, res: Response) => {
|
|
24
|
+
const { key, value } = req.body as { key: string; value: unknown };
|
|
25
|
+
const userPrefs: Record<string, unknown> = {};
|
|
26
|
+
// key = "__proto__.admin" → Object.prototype.admin = value
|
|
27
|
+
setProperty(userPrefs, key, value);
|
|
28
|
+
res.json({ updated: true });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default router;
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via bracket-notation assignment with user-controlled key path
|
|
6
|
-
|
|
7
|
-
import { Request, Response, Router } from 'express';
|
|
8
|
-
|
|
9
|
-
const router = Router();
|
|
10
|
-
|
|
11
|
-
function setProperty(obj: Record<string, unknown>, keyPath: string, value: unknown): void {
|
|
12
|
-
const parts = keyPath.split('.');
|
|
13
|
-
let cursor: Record<string, unknown> = obj;
|
|
14
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
15
|
-
const part = parts[i];
|
|
16
|
-
// Allows "__proto__" or "constructor" as path segment
|
|
17
|
-
if (typeof cursor[part] !== 'object') cursor[part] = {};
|
|
18
|
-
cursor = cursor[part] as Record<string, unknown>;
|
|
19
|
-
}
|
|
20
|
-
cursor[parts[parts.length - 1]] = value;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
router.patch('/user/preference', (req: Request, res: Response) => {
|
|
24
|
-
const { key, value } = req.body as { key: string; value: unknown };
|
|
25
|
-
const userPrefs: Record<string, unknown> = {};
|
|
26
|
-
// key = "__proto__.admin" → Object.prototype.admin = value
|
|
27
|
-
setProperty(userPrefs, key, value);
|
|
28
|
-
res.json({ updated: true });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via bracket-notation assignment with user-controlled key path
|
|
6
|
+
|
|
7
|
+
import { Request, Response, Router } from 'express';
|
|
8
|
+
|
|
9
|
+
const router = Router();
|
|
10
|
+
|
|
11
|
+
function setProperty(obj: Record<string, unknown>, keyPath: string, value: unknown): void {
|
|
12
|
+
const parts = keyPath.split('.');
|
|
13
|
+
let cursor: Record<string, unknown> = obj;
|
|
14
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
15
|
+
const part = parts[i];
|
|
16
|
+
// Allows "__proto__" or "constructor" as path segment
|
|
17
|
+
if (typeof cursor[part] !== 'object') cursor[part] = {};
|
|
18
|
+
cursor = cursor[part] as Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
cursor[parts[parts.length - 1]] = value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
router.patch('/user/preference', (req: Request, res: Response) => {
|
|
24
|
+
const { key, value } = req.body as { key: string; value: unknown };
|
|
25
|
+
const userPrefs: Record<string, unknown> = {};
|
|
26
|
+
// key = "__proto__.admin" → Object.prototype.admin = value
|
|
27
|
+
setProperty(userPrefs, key, value);
|
|
28
|
+
res.json({ updated: true });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default router;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via lodash _.merge or _.set with user-controlled path
|
|
6
|
-
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { Request, Response, Router } from 'express';
|
|
9
|
-
|
|
10
|
-
const router = Router();
|
|
11
|
-
const globalAppConfig: Record<string, unknown> = {};
|
|
12
|
-
|
|
13
|
-
router.post('/admin/config/set', (req: Request, res: Response) => {
|
|
14
|
-
const { path, value } = req.body as { path: string; value: unknown };
|
|
15
|
-
// _.set with user-controlled path — vulnerable to prototype pollution
|
|
16
|
-
// e.g. path = "__proto__.isAdmin", value = true
|
|
17
|
-
_.set(globalAppConfig, path, value);
|
|
18
|
-
res.json({ ok: true });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
router.post('/ui/theme', (req: Request, res: Response) => {
|
|
22
|
-
const userTheme = req.body as Record<string, unknown>;
|
|
23
|
-
const defaultTheme = { primary: '#007bff', background: '#fff', text: '#333' };
|
|
24
|
-
// _.merge pollutes prototype when userTheme contains __proto__
|
|
25
|
-
const merged = _.merge({}, defaultTheme, userTheme);
|
|
26
|
-
res.json({ theme: merged });
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via lodash _.merge or _.set with user-controlled path
|
|
6
|
+
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import { Request, Response, Router } from 'express';
|
|
9
|
+
|
|
10
|
+
const router = Router();
|
|
11
|
+
const globalAppConfig: Record<string, unknown> = {};
|
|
12
|
+
|
|
13
|
+
router.post('/admin/config/set', (req: Request, res: Response) => {
|
|
14
|
+
const { path, value } = req.body as { path: string; value: unknown };
|
|
15
|
+
// _.set with user-controlled path — vulnerable to prototype pollution
|
|
16
|
+
// e.g. path = "__proto__.isAdmin", value = true
|
|
17
|
+
_.set(globalAppConfig, path, value);
|
|
18
|
+
res.json({ ok: true });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
router.post('/ui/theme', (req: Request, res: Response) => {
|
|
22
|
+
const userTheme = req.body as Record<string, unknown>;
|
|
23
|
+
const defaultTheme = { primary: '#007bff', background: '#fff', text: '#333' };
|
|
24
|
+
// _.merge pollutes prototype when userTheme contains __proto__
|
|
25
|
+
const merged = _.merge({}, defaultTheme, userTheme);
|
|
26
|
+
res.json({ theme: merged });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export default router;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: high
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via lodash _.merge or _.set with user-controlled path
|
|
6
|
-
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { Request, Response, Router } from 'express';
|
|
9
|
-
|
|
10
|
-
const router = Router();
|
|
11
|
-
const globalAppConfig: Record<string, unknown> = {};
|
|
12
|
-
|
|
13
|
-
router.post('/admin/config/set', (req: Request, res: Response) => {
|
|
14
|
-
const { path, value } = req.body as { path: string; value: unknown };
|
|
15
|
-
// _.set with user-controlled path — vulnerable to prototype pollution
|
|
16
|
-
// e.g. path = "__proto__.isAdmin", value = true
|
|
17
|
-
_.set(globalAppConfig, path, value);
|
|
18
|
-
res.json({ ok: true });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
router.post('/ui/theme', (req: Request, res: Response) => {
|
|
22
|
-
const userTheme = req.body as Record<string, unknown>;
|
|
23
|
-
const defaultTheme = { primary: '#007bff', background: '#fff', text: '#333' };
|
|
24
|
-
// _.merge pollutes prototype when userTheme contains __proto__
|
|
25
|
-
const merged = _.merge({}, defaultTheme, userTheme);
|
|
26
|
-
res.json({ theme: merged });
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via lodash _.merge or _.set with user-controlled path
|
|
6
|
+
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import { Request, Response, Router } from 'express';
|
|
9
|
+
|
|
10
|
+
const router = Router();
|
|
11
|
+
const globalAppConfig: Record<string, unknown> = {};
|
|
12
|
+
|
|
13
|
+
router.post('/admin/config/set', (req: Request, res: Response) => {
|
|
14
|
+
const { path, value } = req.body as { path: string; value: unknown };
|
|
15
|
+
// _.set with user-controlled path — vulnerable to prototype pollution
|
|
16
|
+
// e.g. path = "__proto__.isAdmin", value = true
|
|
17
|
+
_.set(globalAppConfig, path, value);
|
|
18
|
+
res.json({ ok: true });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
router.post('/ui/theme', (req: Request, res: Response) => {
|
|
22
|
+
const userTheme = req.body as Record<string, unknown>;
|
|
23
|
+
const defaultTheme = { primary: '#007bff', background: '#fff', text: '#333' };
|
|
24
|
+
// _.merge pollutes prototype when userTheme contains __proto__
|
|
25
|
+
const merged = _.merge({}, defaultTheme, userTheme);
|
|
26
|
+
res.json({ theme: merged });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export default router;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
// [CRUCIBLE-SEED]
|
|
2
|
-
// category: prototype_pollution
|
|
3
|
-
// severity: medium
|
|
4
|
-
// language: typescript
|
|
5
|
-
// expected: prototype pollution via constructor.prototype path in Object.assign chain
|
|
6
|
-
|
|
7
|
-
import { Request, Response, Router } from 'express';
|
|
8
|
-
|
|
9
|
-
const router = Router();
|
|
10
|
-
|
|
11
|
-
interface PluginConfig {
|
|
12
|
-
[key: string]: unknown;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function applyPluginOptions(baseOptions: PluginConfig, userOptions: PluginConfig): PluginConfig {
|
|
16
|
-
// Object.assign shallow-merges — __proto__ key from JSON payload pollutes Object.prototype
|
|
17
|
-
return Object.assign({}, baseOptions, userOptions);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
router.post('/plugins/:id/configure', (req: Request, res: Response) => {
|
|
21
|
-
const base: PluginConfig = { enabled: true, maxRetries: 3, timeout: 5000 };
|
|
22
|
-
// req.body passed directly — {"__proto__": {"polluted": true}}
|
|
23
|
-
const config = applyPluginOptions(base, req.body as PluginConfig);
|
|
24
|
-
res.json({ configured: true, config });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
router.patch('/plugins/:id/update', (req: Request, res: Response) => {
|
|
28
|
-
// Spread operator with user body — same pollution vector
|
|
29
|
-
const updated = { ...{}, ...req.body };
|
|
30
|
-
res.json({ updated });
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
export default router;
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via constructor.prototype path in Object.assign chain
|
|
6
|
+
|
|
7
|
+
import { Request, Response, Router } from 'express';
|
|
8
|
+
|
|
9
|
+
const router = Router();
|
|
10
|
+
|
|
11
|
+
interface PluginConfig {
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function applyPluginOptions(baseOptions: PluginConfig, userOptions: PluginConfig): PluginConfig {
|
|
16
|
+
// Object.assign shallow-merges — __proto__ key from JSON payload pollutes Object.prototype
|
|
17
|
+
return Object.assign({}, baseOptions, userOptions);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
router.post('/plugins/:id/configure', (req: Request, res: Response) => {
|
|
21
|
+
const base: PluginConfig = { enabled: true, maxRetries: 3, timeout: 5000 };
|
|
22
|
+
// req.body passed directly — {"__proto__": {"polluted": true}}
|
|
23
|
+
const config = applyPluginOptions(base, req.body as PluginConfig);
|
|
24
|
+
res.json({ configured: true, config });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
router.patch('/plugins/:id/update', (req: Request, res: Response) => {
|
|
28
|
+
// Spread operator with user body — same pollution vector
|
|
29
|
+
const updated = { ...{}, ...req.body };
|
|
30
|
+
res.json({ updated });
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export default router;
|