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,38 +1,38 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: MD5 used for password hashing
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
import psycopg2
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def get_db():
|
|
12
|
-
return psycopg2.connect(host="localhost", dbname="app", user="app", password="app")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def hash_password(password: str) -> str:
|
|
16
|
-
# MD5 is cryptographically broken — must not be used for passwords
|
|
17
|
-
return hashlib.md5(password.encode()).hexdigest()
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def register_user(email: str, password: str) -> None:
|
|
21
|
-
conn = get_db()
|
|
22
|
-
cur = conn.cursor()
|
|
23
|
-
pw_hash = hash_password(password)
|
|
24
|
-
cur.execute("INSERT INTO users (email, password_hash) VALUES (%s, %s)", (email, pw_hash))
|
|
25
|
-
conn.commit()
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def login_user(email: str, password: str) -> bool:
|
|
29
|
-
conn = get_db()
|
|
30
|
-
cur = conn.cursor()
|
|
31
|
-
pw_hash = hash_password(password)
|
|
32
|
-
cur.execute("SELECT id FROM users WHERE email = %s AND password_hash = %s", (email, pw_hash))
|
|
33
|
-
return cur.fetchone() is not None
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def hash_file(file_path: str) -> str:
|
|
37
|
-
with open(file_path, "rb") as f:
|
|
38
|
-
return hashlib.md5(f.read()).hexdigest()
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: MD5 used for password hashing
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import psycopg2
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_db():
|
|
12
|
+
return psycopg2.connect(host="localhost", dbname="app", user="app", password="app")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def hash_password(password: str) -> str:
|
|
16
|
+
# MD5 is cryptographically broken — must not be used for passwords
|
|
17
|
+
return hashlib.md5(password.encode()).hexdigest()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def register_user(email: str, password: str) -> None:
|
|
21
|
+
conn = get_db()
|
|
22
|
+
cur = conn.cursor()
|
|
23
|
+
pw_hash = hash_password(password)
|
|
24
|
+
cur.execute("INSERT INTO users (email, password_hash) VALUES (%s, %s)", (email, pw_hash))
|
|
25
|
+
conn.commit()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def login_user(email: str, password: str) -> bool:
|
|
29
|
+
conn = get_db()
|
|
30
|
+
cur = conn.cursor()
|
|
31
|
+
pw_hash = hash_password(password)
|
|
32
|
+
cur.execute("SELECT id FROM users WHERE email = %s AND password_hash = %s", (email, pw_hash))
|
|
33
|
+
return cur.fetchone() is not None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def hash_file(file_path: str) -> str:
|
|
37
|
+
with open(file_path, "rb") as f:
|
|
38
|
+
return hashlib.md5(f.read()).hexdigest()
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: SHA1 used for password hashing and random.random() for token generation
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
import random
|
|
9
|
-
import time
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def hash_password(password: str, salt: str = "") -> str:
|
|
13
|
-
# SHA-1 is deprecated for security-sensitive hashing
|
|
14
|
-
return hashlib.sha1((salt + password).encode()).hexdigest()
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def generate_session_token() -> str:
|
|
18
|
-
# random.random() is not cryptographically secure
|
|
19
|
-
return hex(int(random.random() * 10**18))[2:]
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def generate_reset_token(user_id: int) -> str:
|
|
23
|
-
# Predictable — only uses timestamp and non-secure random
|
|
24
|
-
return hashlib.sha1(f"{user_id}-{time.time()}-{random.randint(0, 999999)}".encode()).hexdigest()
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def create_api_key(user_id: str) -> str:
|
|
28
|
-
# Weak entropy source — easily guessable
|
|
29
|
-
rand = random.getrandbits(32)
|
|
30
|
-
return hashlib.md5(f"{user_id}{rand}".encode()).hexdigest()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def generate_otp() -> str:
|
|
34
|
-
# random.randint is predictable — use secrets.randbelow instead
|
|
35
|
-
return str(random.randint(100000, 999999))
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: SHA1 used for password hashing and random.random() for token generation
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import random
|
|
9
|
+
import time
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def hash_password(password: str, salt: str = "") -> str:
|
|
13
|
+
# SHA-1 is deprecated for security-sensitive hashing
|
|
14
|
+
return hashlib.sha1((salt + password).encode()).hexdigest()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def generate_session_token() -> str:
|
|
18
|
+
# random.random() is not cryptographically secure
|
|
19
|
+
return hex(int(random.random() * 10**18))[2:]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def generate_reset_token(user_id: int) -> str:
|
|
23
|
+
# Predictable — only uses timestamp and non-secure random
|
|
24
|
+
return hashlib.sha1(f"{user_id}-{time.time()}-{random.randint(0, 999999)}".encode()).hexdigest()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def create_api_key(user_id: str) -> str:
|
|
28
|
+
# Weak entropy source — easily guessable
|
|
29
|
+
rand = random.getrandbits(32)
|
|
30
|
+
return hashlib.md5(f"{user_id}{rand}".encode()).hexdigest()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def generate_otp() -> str:
|
|
34
|
+
# random.randint is predictable — use secrets.randbelow instead
|
|
35
|
+
return str(random.randint(100000, 999999))
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: DES cipher usage and AES-ECB mode with static key
|
|
6
|
-
|
|
7
|
-
from Crypto.Cipher import DES, AES
|
|
8
|
-
import base64
|
|
9
|
-
|
|
10
|
-
DES_KEY = b"weakkey!" # 8 bytes — DES is broken
|
|
11
|
-
AES_KEY = b"0123456789abcdef" # 16 bytes
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def des_encrypt(data: str) -> str:
|
|
15
|
-
# DES has only 56-bit effective key length — trivially brute-forced
|
|
16
|
-
padded = data + " " * (8 - len(data) % 8)
|
|
17
|
-
cipher = DES.new(DES_KEY, DES.MODE_ECB)
|
|
18
|
-
return base64.b64encode(cipher.encrypt(padded.encode())).decode()
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def aes_ecb_encrypt(data: str) -> str:
|
|
22
|
-
# ECB mode: identical plaintext blocks produce identical ciphertext blocks
|
|
23
|
-
pad_len = 16 - len(data) % 16
|
|
24
|
-
padded = (data + chr(pad_len) * pad_len).encode()
|
|
25
|
-
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
26
|
-
return base64.b64encode(cipher.encrypt(padded)).decode()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def aes_ecb_decrypt(ciphertext: str) -> str:
|
|
30
|
-
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
31
|
-
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
|
|
32
|
-
pad_len = decrypted[-1]
|
|
33
|
-
return decrypted[:-pad_len].decode()
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: DES cipher usage and AES-ECB mode with static key
|
|
6
|
+
|
|
7
|
+
from Crypto.Cipher import DES, AES
|
|
8
|
+
import base64
|
|
9
|
+
|
|
10
|
+
DES_KEY = b"weakkey!" # 8 bytes — DES is broken
|
|
11
|
+
AES_KEY = b"0123456789abcdef" # 16 bytes
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def des_encrypt(data: str) -> str:
|
|
15
|
+
# DES has only 56-bit effective key length — trivially brute-forced
|
|
16
|
+
padded = data + " " * (8 - len(data) % 8)
|
|
17
|
+
cipher = DES.new(DES_KEY, DES.MODE_ECB)
|
|
18
|
+
return base64.b64encode(cipher.encrypt(padded.encode())).decode()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def aes_ecb_encrypt(data: str) -> str:
|
|
22
|
+
# ECB mode: identical plaintext blocks produce identical ciphertext blocks
|
|
23
|
+
pad_len = 16 - len(data) % 16
|
|
24
|
+
padded = (data + chr(pad_len) * pad_len).encode()
|
|
25
|
+
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
26
|
+
return base64.b64encode(cipher.encrypt(padded)).decode()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def aes_ecb_decrypt(ciphertext: str) -> str:
|
|
30
|
+
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
31
|
+
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
|
|
32
|
+
pad_len = decrypted[-1]
|
|
33
|
+
return decrypted[:-pad_len].decode()
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: DES cipher usage and AES-ECB mode with static key
|
|
6
|
-
|
|
7
|
-
from Crypto.Cipher import DES, AES
|
|
8
|
-
import base64
|
|
9
|
-
|
|
10
|
-
DES_KEY = b"weakkey!" # 8 bytes — DES is broken
|
|
11
|
-
AES_KEY = b"0123456789abcdef" # 16 bytes
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def des_encrypt(data: str) -> str:
|
|
15
|
-
# DES has only 56-bit effective key length — trivially brute-forced
|
|
16
|
-
padded = data + " " * (8 - len(data) % 8)
|
|
17
|
-
cipher = DES.new(DES_KEY, DES.MODE_ECB)
|
|
18
|
-
return base64.b64encode(cipher.encrypt(padded.encode())).decode()
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def aes_ecb_encrypt(data: str) -> str:
|
|
22
|
-
# ECB mode: identical plaintext blocks produce identical ciphertext blocks
|
|
23
|
-
pad_len = 16 - len(data) % 16
|
|
24
|
-
padded = (data + chr(pad_len) * pad_len).encode()
|
|
25
|
-
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
26
|
-
return base64.b64encode(cipher.encrypt(padded)).decode()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def aes_ecb_decrypt(ciphertext: str) -> str:
|
|
30
|
-
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
31
|
-
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
|
|
32
|
-
pad_len = decrypted[-1]
|
|
33
|
-
return decrypted[:-pad_len].decode()
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: DES cipher usage and AES-ECB mode with static key
|
|
6
|
+
|
|
7
|
+
from Crypto.Cipher import DES, AES
|
|
8
|
+
import base64
|
|
9
|
+
|
|
10
|
+
DES_KEY = b"weakkey!" # 8 bytes — DES is broken
|
|
11
|
+
AES_KEY = b"0123456789abcdef" # 16 bytes
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def des_encrypt(data: str) -> str:
|
|
15
|
+
# DES has only 56-bit effective key length — trivially brute-forced
|
|
16
|
+
padded = data + " " * (8 - len(data) % 8)
|
|
17
|
+
cipher = DES.new(DES_KEY, DES.MODE_ECB)
|
|
18
|
+
return base64.b64encode(cipher.encrypt(padded.encode())).decode()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def aes_ecb_encrypt(data: str) -> str:
|
|
22
|
+
# ECB mode: identical plaintext blocks produce identical ciphertext blocks
|
|
23
|
+
pad_len = 16 - len(data) % 16
|
|
24
|
+
padded = (data + chr(pad_len) * pad_len).encode()
|
|
25
|
+
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
26
|
+
return base64.b64encode(cipher.encrypt(padded)).decode()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def aes_ecb_decrypt(ciphertext: str) -> str:
|
|
30
|
+
cipher = AES.new(AES_KEY, AES.MODE_ECB)
|
|
31
|
+
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
|
|
32
|
+
pad_len = decrypted[-1]
|
|
33
|
+
return decrypted[:-pad_len].decode()
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: medium
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
|
|
6
|
-
|
|
7
|
-
import hmac
|
|
8
|
-
import hashlib
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
WEBHOOK_SECRET = b"static-webhook-secret-2024"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def compute_signature(payload: bytes) -> str:
|
|
15
|
-
return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def verify_signature(payload: bytes, received_sig: str) -> bool:
|
|
19
|
-
expected = compute_signature(payload)
|
|
20
|
-
# String comparison leaks timing info — use hmac.compare_digest instead
|
|
21
|
-
return expected == received_sig
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def verify_api_key(provided: str, stored: str) -> bool:
|
|
25
|
-
# Direct equality — timing side-channel attack possible
|
|
26
|
-
return provided == stored
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def derive_key(password: str) -> bytes:
|
|
30
|
-
# Only 1000 iterations — far below NIST recommendation of 600,000+
|
|
31
|
-
return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def check_token(token_a: str, token_b: str) -> bool:
|
|
35
|
-
# Char-by-char comparison leaks prefix matches
|
|
36
|
-
if len(token_a) != len(token_b):
|
|
37
|
-
return False
|
|
38
|
-
for a, b in zip(token_a, token_b):
|
|
39
|
-
if a != b:
|
|
40
|
-
return False
|
|
41
|
-
return True
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: medium
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
|
|
6
|
+
|
|
7
|
+
import hmac
|
|
8
|
+
import hashlib
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
WEBHOOK_SECRET = b"static-webhook-secret-2024"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def compute_signature(payload: bytes) -> str:
|
|
15
|
+
return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def verify_signature(payload: bytes, received_sig: str) -> bool:
|
|
19
|
+
expected = compute_signature(payload)
|
|
20
|
+
# String comparison leaks timing info — use hmac.compare_digest instead
|
|
21
|
+
return expected == received_sig
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def verify_api_key(provided: str, stored: str) -> bool:
|
|
25
|
+
# Direct equality — timing side-channel attack possible
|
|
26
|
+
return provided == stored
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def derive_key(password: str) -> bytes:
|
|
30
|
+
# Only 1000 iterations — far below NIST recommendation of 600,000+
|
|
31
|
+
return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def check_token(token_a: str, token_b: str) -> bool:
|
|
35
|
+
# Char-by-char comparison leaks prefix matches
|
|
36
|
+
if len(token_a) != len(token_b):
|
|
37
|
+
return False
|
|
38
|
+
for a, b in zip(token_a, token_b):
|
|
39
|
+
if a != b:
|
|
40
|
+
return False
|
|
41
|
+
return True
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: medium
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
|
|
6
|
-
|
|
7
|
-
import hmac
|
|
8
|
-
import hashlib
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
WEBHOOK_SECRET = b"static-webhook-secret-2024"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def compute_signature(payload: bytes) -> str:
|
|
15
|
-
return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def verify_signature(payload: bytes, received_sig: str) -> bool:
|
|
19
|
-
expected = compute_signature(payload)
|
|
20
|
-
# String comparison leaks timing info — use hmac.compare_digest instead
|
|
21
|
-
return expected == received_sig
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def verify_api_key(provided: str, stored: str) -> bool:
|
|
25
|
-
# Direct equality — timing side-channel attack possible
|
|
26
|
-
return provided == stored
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def derive_key(password: str) -> bytes:
|
|
30
|
-
# Only 1000 iterations — far below NIST recommendation of 600,000+
|
|
31
|
-
return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def check_token(token_a: str, token_b: str) -> bool:
|
|
35
|
-
# Char-by-char comparison leaks prefix matches
|
|
36
|
-
if len(token_a) != len(token_b):
|
|
37
|
-
return False
|
|
38
|
-
for a, b in zip(token_a, token_b):
|
|
39
|
-
if a != b:
|
|
40
|
-
return False
|
|
41
|
-
return True
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: medium
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
|
|
6
|
+
|
|
7
|
+
import hmac
|
|
8
|
+
import hashlib
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
WEBHOOK_SECRET = b"static-webhook-secret-2024"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def compute_signature(payload: bytes) -> str:
|
|
15
|
+
return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def verify_signature(payload: bytes, received_sig: str) -> bool:
|
|
19
|
+
expected = compute_signature(payload)
|
|
20
|
+
# String comparison leaks timing info — use hmac.compare_digest instead
|
|
21
|
+
return expected == received_sig
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def verify_api_key(provided: str, stored: str) -> bool:
|
|
25
|
+
# Direct equality — timing side-channel attack possible
|
|
26
|
+
return provided == stored
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def derive_key(password: str) -> bytes:
|
|
30
|
+
# Only 1000 iterations — far below NIST recommendation of 600,000+
|
|
31
|
+
return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def check_token(token_a: str, token_b: str) -> bool:
|
|
35
|
+
# Char-by-char comparison leaks prefix matches
|
|
36
|
+
if len(token_a) != len(token_b):
|
|
37
|
+
return False
|
|
38
|
+
for a, b in zip(token_a, token_b):
|
|
39
|
+
if a != b:
|
|
40
|
+
return False
|
|
41
|
+
return True
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: MD5 used for file integrity and RSA with insufficient key size
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
from Crypto.PublicKey import RSA
|
|
9
|
-
from Crypto.Signature import pkcs1_15
|
|
10
|
-
from Crypto.Hash import MD5
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def checksum_file(filepath: str) -> str:
|
|
14
|
-
# MD5 is collision-prone — not suitable for integrity verification
|
|
15
|
-
with open(filepath, "rb") as f:
|
|
16
|
-
return hashlib.md5(f.read()).hexdigest()
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def verify_file_integrity(filepath: str, expected_md5: str) -> bool:
|
|
20
|
-
return checksum_file(filepath) == expected_md5
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def generate_rsa_keypair():
|
|
24
|
-
# 512-bit RSA key — trivially factorable in seconds
|
|
25
|
-
key = RSA.generate(512)
|
|
26
|
-
return key.export_key().decode(), key.publickey().export_key().decode()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def sign_with_md5(private_key_pem: str, message: bytes) -> bytes:
|
|
30
|
-
key = RSA.import_key(private_key_pem)
|
|
31
|
-
# MD5 with RSA — known-weak combination
|
|
32
|
-
h = MD5.new(message)
|
|
33
|
-
return pkcs1_15.new(key).sign(h)
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: MD5 used for file integrity and RSA with insufficient key size
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
from Crypto.PublicKey import RSA
|
|
9
|
+
from Crypto.Signature import pkcs1_15
|
|
10
|
+
from Crypto.Hash import MD5
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def checksum_file(filepath: str) -> str:
|
|
14
|
+
# MD5 is collision-prone — not suitable for integrity verification
|
|
15
|
+
with open(filepath, "rb") as f:
|
|
16
|
+
return hashlib.md5(f.read()).hexdigest()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def verify_file_integrity(filepath: str, expected_md5: str) -> bool:
|
|
20
|
+
return checksum_file(filepath) == expected_md5
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def generate_rsa_keypair():
|
|
24
|
+
# 512-bit RSA key — trivially factorable in seconds
|
|
25
|
+
key = RSA.generate(512)
|
|
26
|
+
return key.export_key().decode(), key.publickey().export_key().decode()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def sign_with_md5(private_key_pem: str, message: bytes) -> bytes:
|
|
30
|
+
key = RSA.import_key(private_key_pem)
|
|
31
|
+
# MD5 with RSA — known-weak combination
|
|
32
|
+
h = MD5.new(message)
|
|
33
|
+
return pkcs1_15.new(key).sign(h)
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: insecure_crypto
|
|
3
|
-
# severity: high
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: MD5 used for file integrity and RSA with insufficient key size
|
|
6
|
-
|
|
7
|
-
import hashlib
|
|
8
|
-
from Crypto.PublicKey import RSA
|
|
9
|
-
from Crypto.Signature import pkcs1_15
|
|
10
|
-
from Crypto.Hash import MD5
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def checksum_file(filepath: str) -> str:
|
|
14
|
-
# MD5 is collision-prone — not suitable for integrity verification
|
|
15
|
-
with open(filepath, "rb") as f:
|
|
16
|
-
return hashlib.md5(f.read()).hexdigest()
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def verify_file_integrity(filepath: str, expected_md5: str) -> bool:
|
|
20
|
-
return checksum_file(filepath) == expected_md5
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def generate_rsa_keypair():
|
|
24
|
-
# 512-bit RSA key — trivially factorable in seconds
|
|
25
|
-
key = RSA.generate(512)
|
|
26
|
-
return key.export_key().decode(), key.publickey().export_key().decode()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def sign_with_md5(private_key_pem: str, message: bytes) -> bytes:
|
|
30
|
-
key = RSA.import_key(private_key_pem)
|
|
31
|
-
# MD5 with RSA — known-weak combination
|
|
32
|
-
h = MD5.new(message)
|
|
33
|
-
return pkcs1_15.new(key).sign(h)
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: insecure_crypto
|
|
3
|
+
# severity: high
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: MD5 used for file integrity and RSA with insufficient key size
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
from Crypto.PublicKey import RSA
|
|
9
|
+
from Crypto.Signature import pkcs1_15
|
|
10
|
+
from Crypto.Hash import MD5
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def checksum_file(filepath: str) -> str:
|
|
14
|
+
# MD5 is collision-prone — not suitable for integrity verification
|
|
15
|
+
with open(filepath, "rb") as f:
|
|
16
|
+
return hashlib.md5(f.read()).hexdigest()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def verify_file_integrity(filepath: str, expected_md5: str) -> bool:
|
|
20
|
+
return checksum_file(filepath) == expected_md5
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def generate_rsa_keypair():
|
|
24
|
+
# 512-bit RSA key — trivially factorable in seconds
|
|
25
|
+
key = RSA.generate(512)
|
|
26
|
+
return key.export_key().decode(), key.publickey().export_key().decode()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def sign_with_md5(private_key_pem: str, message: bytes) -> bytes:
|
|
30
|
+
key = RSA.import_key(private_key_pem)
|
|
31
|
+
# MD5 with RSA — known-weak combination
|
|
32
|
+
h = MD5.new(message)
|
|
33
|
+
return pkcs1_15.new(key).sign(h)
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# [CRUCIBLE-SEED]
|
|
2
|
-
# category: eval_abuse
|
|
3
|
-
# severity: critical
|
|
4
|
-
# language: python
|
|
5
|
-
# expected: eval() called with user-controlled expression string
|
|
6
|
-
|
|
7
|
-
from flask import Flask, request, jsonify
|
|
8
|
-
|
|
9
|
-
app = Flask(__name__)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@app.route("/calculate", methods=["POST"])
|
|
13
|
-
def calculate():
|
|
14
|
-
data = request.get_json()
|
|
15
|
-
expression = data.get("expression", "")
|
|
16
|
-
try:
|
|
17
|
-
# Attacker sends: "__import__('os').system('id')"
|
|
18
|
-
result = eval(expression)
|
|
19
|
-
return jsonify({"result": result})
|
|
20
|
-
except Exception as e:
|
|
21
|
-
return jsonify({"error": str(e)}), 400
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@app.route("/filter", methods=["POST"])
|
|
25
|
-
def filter_data():
|
|
26
|
-
data = request.get_json()
|
|
27
|
-
records = data.get("records", [])
|
|
28
|
-
condition = data.get("condition", "True")
|
|
29
|
-
# Attacker sends: "True or __import__('subprocess').check_output(['id'])"
|
|
30
|
-
filtered = [r for r in records if eval(condition, {"r": r})]
|
|
31
|
-
return jsonify({"results": filtered})
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
@app.route("/transform", methods=["POST"])
|
|
35
|
-
def transform():
|
|
36
|
-
expr = request.get_json().get("expr", "x")
|
|
37
|
-
items = request.get_json().get("items", [1, 2, 3])
|
|
38
|
-
result = list(map(lambda x: eval(expr), items))
|
|
39
|
-
return jsonify({"result": result})
|
|
1
|
+
# [CRUCIBLE-SEED]
|
|
2
|
+
# category: eval_abuse
|
|
3
|
+
# severity: critical
|
|
4
|
+
# language: python
|
|
5
|
+
# expected: eval() called with user-controlled expression string
|
|
6
|
+
|
|
7
|
+
from flask import Flask, request, jsonify
|
|
8
|
+
|
|
9
|
+
app = Flask(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@app.route("/calculate", methods=["POST"])
|
|
13
|
+
def calculate():
|
|
14
|
+
data = request.get_json()
|
|
15
|
+
expression = data.get("expression", "")
|
|
16
|
+
try:
|
|
17
|
+
# Attacker sends: "__import__('os').system('id')"
|
|
18
|
+
result = eval(expression)
|
|
19
|
+
return jsonify({"result": result})
|
|
20
|
+
except Exception as e:
|
|
21
|
+
return jsonify({"error": str(e)}), 400
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@app.route("/filter", methods=["POST"])
|
|
25
|
+
def filter_data():
|
|
26
|
+
data = request.get_json()
|
|
27
|
+
records = data.get("records", [])
|
|
28
|
+
condition = data.get("condition", "True")
|
|
29
|
+
# Attacker sends: "True or __import__('subprocess').check_output(['id'])"
|
|
30
|
+
filtered = [r for r in records if eval(condition, {"r": r})]
|
|
31
|
+
return jsonify({"results": filtered})
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@app.route("/transform", methods=["POST"])
|
|
35
|
+
def transform():
|
|
36
|
+
expr = request.get_json().get("expr", "x")
|
|
37
|
+
items = request.get_json().get("items", [1, 2, 3])
|
|
38
|
+
result = list(map(lambda x: eval(expr), items))
|
|
39
|
+
return jsonify({"result": result})
|