cleartoship 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +264 -0
- package/action.yml +154 -0
- package/dist/banner.d.ts +1 -0
- package/dist/banner.js +14 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +103 -0
- package/dist/data/popular.d.ts +17 -0
- package/dist/data/popular.js +103 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/report.d.ts +15 -0
- package/dist/report.js +317 -0
- package/dist/scan.d.ts +24 -0
- package/dist/scan.js +81 -0
- package/dist/scanners/community.d.ts +2 -0
- package/dist/scanners/community.js +155 -0
- package/dist/scanners/dependencies.d.ts +21 -0
- package/dist/scanners/dependencies.js +549 -0
- package/dist/scanners/index.d.ts +8 -0
- package/dist/scanners/index.js +13 -0
- package/dist/scanners/rls.d.ts +7 -0
- package/dist/scanners/rls.js +531 -0
- package/dist/scanners/secrets.d.ts +2 -0
- package/dist/scanners/secrets.js +439 -0
- package/dist/scanners/server-actions.d.ts +2 -0
- package/dist/scanners/server-actions.js +466 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.js +10 -0
- package/dist/utils/ast.d.ts +13 -0
- package/dist/utils/ast.js +107 -0
- package/dist/utils/detect.d.ts +2 -0
- package/dist/utils/detect.js +77 -0
- package/dist/utils/entropy.d.ts +7 -0
- package/dist/utils/entropy.js +19 -0
- package/dist/utils/files.d.ts +13 -0
- package/dist/utils/files.js +154 -0
- package/dist/utils/osv.d.ts +26 -0
- package/dist/utils/osv.js +123 -0
- package/dist/utils/registry.d.ts +44 -0
- package/dist/utils/registry.js +195 -0
- package/dist/utils/sql.d.ts +20 -0
- package/dist/utils/sql.js +157 -0
- package/dist/utils/suppress.d.ts +19 -0
- package/dist/utils/suppress.js +56 -0
- package/dist/utils/traverse.d.ts +2 -0
- package/dist/utils/traverse.js +14 -0
- package/dist/vendor/gitleaks/rules.d.ts +13 -0
- package/dist/vendor/gitleaks/rules.js +1571 -0
- package/dist/vendor/guardvibe/index.d.ts +11 -0
- package/dist/vendor/guardvibe/index.js +60 -0
- package/dist/vendor/guardvibe/rules/advanced-security.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/advanced-security.js +418 -0
- package/dist/vendor/guardvibe/rules/ai-host-security.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/ai-host-security.js +190 -0
- package/dist/vendor/guardvibe/rules/ai-security.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/ai-security.js +413 -0
- package/dist/vendor/guardvibe/rules/ai-tool-runtime.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/ai-tool-runtime.js +194 -0
- package/dist/vendor/guardvibe/rules/api-security.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/api-security.js +154 -0
- package/dist/vendor/guardvibe/rules/auth.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/auth.js +222 -0
- package/dist/vendor/guardvibe/rules/cicd.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/cicd.js +108 -0
- package/dist/vendor/guardvibe/rules/core.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/core.js +484 -0
- package/dist/vendor/guardvibe/rules/cve-versions.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/cve-versions.js +1130 -0
- package/dist/vendor/guardvibe/rules/database.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/database.js +173 -0
- package/dist/vendor/guardvibe/rules/deployment.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/deployment.js +269 -0
- package/dist/vendor/guardvibe/rules/dockerfile.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/dockerfile.js +99 -0
- package/dist/vendor/guardvibe/rules/firebase.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/firebase.js +96 -0
- package/dist/vendor/guardvibe/rules/go.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/go.js +85 -0
- package/dist/vendor/guardvibe/rules/modern-stack.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/modern-stack.js +631 -0
- package/dist/vendor/guardvibe/rules/nextjs.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/nextjs.js +233 -0
- package/dist/vendor/guardvibe/rules/other-services.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/other-services.js +72 -0
- package/dist/vendor/guardvibe/rules/payments.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/payments.js +123 -0
- package/dist/vendor/guardvibe/rules/react-native.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/react-native.js +132 -0
- package/dist/vendor/guardvibe/rules/services.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/services.js +149 -0
- package/dist/vendor/guardvibe/rules/shell.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/shell.js +72 -0
- package/dist/vendor/guardvibe/rules/sql.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/sql.js +60 -0
- package/dist/vendor/guardvibe/rules/supply-chain.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/supply-chain.js +243 -0
- package/dist/vendor/guardvibe/rules/terraform.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/terraform.js +84 -0
- package/dist/vendor/guardvibe/rules/types.d.ts +14 -0
- package/dist/vendor/guardvibe/rules/types.js +11 -0
- package/dist/vendor/guardvibe/rules/web-security.d.ts +2 -0
- package/dist/vendor/guardvibe/rules/web-security.js +258 -0
- package/examples/security.yml +23 -0
- package/package.json +70 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Vendored from GuardVibe — https://github.com/goklab/guardvibe
|
|
3
|
+
* Copyright 2026 GokLab. Licensed under the Apache License, Version 2.0.
|
|
4
|
+
* Full licence: LICENSES/guardvibe-Apache-2.0.txt
|
|
5
|
+
*
|
|
6
|
+
* Modifications by ClearToShip: import paths rewritten for this package
|
|
7
|
+
* layout. Rule content is unchanged; rules that duplicate ClearToShip's own
|
|
8
|
+
* AST checks are disabled at runtime in src/scanners/community.ts rather
|
|
9
|
+
* than deleted here, so this file stays a faithful copy of upstream.
|
|
10
|
+
*/
|
|
11
|
+
export const firebaseRules = [
|
|
12
|
+
{
|
|
13
|
+
id: "VG750",
|
|
14
|
+
name: "Insecure Firestore Rules",
|
|
15
|
+
severity: "critical",
|
|
16
|
+
owasp: "A01:2025 Broken Access Control",
|
|
17
|
+
description: "Firestore security rules allow unrestricted read/write. Anyone can read or modify your entire database.",
|
|
18
|
+
pattern: /(?:allow\s+(?:read|write|get|list|create|update|delete)\s*:\s*if\s+true|match\s+\/\{document=\*\*\}\s*\{[\s\S]{0,100}?allow\s+read\s*,\s*write)/g,
|
|
19
|
+
languages: ["firestore"],
|
|
20
|
+
fix: "Always restrict Firestore rules. Require authentication and validate data.",
|
|
21
|
+
fixCode: 'rules_version = \'2\';\nservice cloud.firestore {\n match /databases/{database}/documents {\n match /users/{userId} {\n allow read, write: if request.auth != null && request.auth.uid == userId;\n }\n }\n}',
|
|
22
|
+
compliance: ["SOC2:CC6.1"],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "VG751",
|
|
26
|
+
name: "Firebase Admin SDK Client Exposure",
|
|
27
|
+
severity: "critical",
|
|
28
|
+
owasp: "A07:2025 Sensitive Data Exposure",
|
|
29
|
+
description: "Firebase Admin SDK or service account credentials exposed in client-side code. Admin SDK has full unrestricted access to all Firebase services.",
|
|
30
|
+
pattern: /["']use client["'][\s\S]{0,500}?(?:firebase-admin|@google-cloud\/firestore|serviceAccountKey|FIREBASE_SERVICE_ACCOUNT|FIREBASE_ADMIN)/g,
|
|
31
|
+
languages: ["javascript", "typescript"],
|
|
32
|
+
fix: "Firebase Admin SDK must only be used server-side. Never import it in client components.",
|
|
33
|
+
fixCode: '// Server-side only (API route or Server Action)\nimport { initializeApp, cert } from "firebase-admin/app";\ninitializeApp({ credential: cert(JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_KEY!)) });',
|
|
34
|
+
compliance: ["SOC2:CC6.1"],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "VG752",
|
|
38
|
+
name: "Firebase Service Account Key Hardcoded",
|
|
39
|
+
severity: "critical",
|
|
40
|
+
owasp: "A07:2025 Sensitive Data Exposure",
|
|
41
|
+
description: "Firebase service account key or credentials JSON hardcoded in source code.",
|
|
42
|
+
pattern: /(?:service_account|serviceAccount|credential|cert)\s*[\(=:]\s*\{[\s\S]{0,500}?(?:"type"\s*:\s*"service_account"|"private_key"\s*:\s*"-----BEGIN)/g,
|
|
43
|
+
languages: ["javascript", "typescript", "json"],
|
|
44
|
+
fix: "Store service account JSON in environment variable and parse at runtime.",
|
|
45
|
+
fixCode: '// Store as env var (base64 or JSON string)\nconst serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_KEY!);\ninitializeApp({ credential: cert(serviceAccount) });',
|
|
46
|
+
compliance: ["SOC2:CC6.1"],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "VG753",
|
|
50
|
+
name: "Insecure Firebase Storage Rules",
|
|
51
|
+
severity: "critical",
|
|
52
|
+
owasp: "A01:2025 Broken Access Control",
|
|
53
|
+
description: "Firebase Storage rules allow unrestricted public access. Anyone can read/write/delete files.",
|
|
54
|
+
pattern: /(?:allow\s+read\s*,\s*write\s*:\s*if\s+true|match\s+\/\{allPaths=\*\*\}\s*\{[\s\S]{0,100}?allow\s+read\s*,\s*write)/g,
|
|
55
|
+
languages: ["firestore"],
|
|
56
|
+
fix: "Restrict Firebase Storage rules. Require authentication and limit file types/sizes.",
|
|
57
|
+
fixCode: 'service firebase.storage {\n match /b/{bucket}/o {\n match /users/{userId}/{allPaths=**} {\n allow read: if request.auth != null;\n allow write: if request.auth != null \n && request.auth.uid == userId\n && request.resource.size < 5 * 1024 * 1024;\n }\n }\n}',
|
|
58
|
+
compliance: ["SOC2:CC6.1"],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "VG754",
|
|
62
|
+
name: "Firebase Config Hardcoded",
|
|
63
|
+
severity: "medium",
|
|
64
|
+
owasp: "A05:2025 Security Misconfiguration",
|
|
65
|
+
description: "Firebase config object hardcoded with all values inline. While Firebase API keys are designed to be public, hardcoding makes it hard to manage across environments.",
|
|
66
|
+
pattern: /(?:firebaseConfig|firebase\.initializeApp)\s*[\(=]\s*\{[\s\S]{0,500}?apiKey\s*:\s*["']AIza[A-Za-z0-9_-]{30,}["']/g,
|
|
67
|
+
languages: ["javascript", "typescript"],
|
|
68
|
+
fix: "Use environment variables for Firebase config to manage different environments.",
|
|
69
|
+
fixCode: 'const firebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,\n};',
|
|
70
|
+
compliance: ["SOC2:CC6.1"],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "VG755",
|
|
74
|
+
name: "NEXT_PUBLIC Firebase Service Account",
|
|
75
|
+
severity: "critical",
|
|
76
|
+
owasp: "A07:2025 Sensitive Data Exposure",
|
|
77
|
+
description: "Firebase service account key or admin credentials exposed via NEXT_PUBLIC_ prefix.",
|
|
78
|
+
pattern: /NEXT_PUBLIC_\w*(?:FIREBASE_SERVICE_ACCOUNT|FIREBASE_ADMIN|FIREBASE_PRIVATE|FIREBASE_SECRET)\w*\s*=/gi,
|
|
79
|
+
languages: ["javascript", "typescript", "shell"],
|
|
80
|
+
fix: "Remove NEXT_PUBLIC_ prefix from Firebase admin/service account credentials. These must be server-side only.",
|
|
81
|
+
fixCode: "# .env.local — WRONG\n# NEXT_PUBLIC_FIREBASE_SERVICE_ACCOUNT=...\n\n# CORRECT — server-side only\nFIREBASE_SERVICE_ACCOUNT=...\n# Use in API routes: admin.initializeApp({ credential: cert(JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT!)) })",
|
|
82
|
+
compliance: ["SOC2:CC6.1"],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "VG756",
|
|
86
|
+
name: "signInWithCustomToken Without Validation",
|
|
87
|
+
severity: "high",
|
|
88
|
+
owasp: "A07:2025 Identification and Authentication Failures",
|
|
89
|
+
description: "signInWithCustomToken used with unvalidated token source. Custom tokens must be generated and verified server-side.",
|
|
90
|
+
pattern: /signInWithCustomToken\s*\(\s*\w*\s*,\s*(?:req\.body|request\.body|params\.|searchParams|query\.|formData|url\.)/gi,
|
|
91
|
+
languages: ["javascript", "typescript"],
|
|
92
|
+
fix: "Generate custom tokens server-side with Firebase Admin SDK. Never accept custom tokens from client input.",
|
|
93
|
+
fixCode: '// Server-side: generate custom token\nimport { getAuth } from "firebase-admin/auth";\nconst customToken = await getAuth().createCustomToken(uid);\n\n// Client-side: only use tokens from your own server\nconst res = await fetch("/api/auth/custom-token");\nconst { token } = await res.json();\nawait signInWithCustomToken(auth, token);',
|
|
94
|
+
compliance: ["SOC2:CC6.1"],
|
|
95
|
+
},
|
|
96
|
+
];
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Vendored from GuardVibe — https://github.com/goklab/guardvibe
|
|
3
|
+
* Copyright 2026 GokLab. Licensed under the Apache License, Version 2.0.
|
|
4
|
+
* Full licence: LICENSES/guardvibe-Apache-2.0.txt
|
|
5
|
+
*
|
|
6
|
+
* Modifications by ClearToShip: import paths rewritten for this package
|
|
7
|
+
* layout. Rule content is unchanged; rules that duplicate ClearToShip's own
|
|
8
|
+
* AST checks are disabled at runtime in src/scanners/community.ts rather
|
|
9
|
+
* than deleted here, so this file stays a faithful copy of upstream.
|
|
10
|
+
*/
|
|
11
|
+
// === Go-specific rules ===
|
|
12
|
+
export const goRules = [
|
|
13
|
+
{
|
|
14
|
+
id: "VG110",
|
|
15
|
+
name: "Go SQL injection via fmt.Sprintf",
|
|
16
|
+
severity: "critical",
|
|
17
|
+
owasp: "A02:2025 Injection",
|
|
18
|
+
description: "Using fmt.Sprintf to build SQL queries allows SQL injection attacks.",
|
|
19
|
+
pattern: /(?:db\.(?:Query|Exec|QueryRow)|\.Query|\.Exec)\s*\(\s*fmt\.Sprintf/gi,
|
|
20
|
+
languages: ["go"],
|
|
21
|
+
fix: "Use parameterized queries: db.Query('SELECT * FROM users WHERE id = $1', id). Never use fmt.Sprintf for SQL.",
|
|
22
|
+
fixCode: "// Use parameterized queries\nrows, err := db.Query(\"SELECT * FROM users WHERE id = $1\", id)",
|
|
23
|
+
compliance: ["SOC2:CC7.1", "PCI-DSS:Req6.5.1"],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "VG111",
|
|
27
|
+
name: "Go command injection via os/exec",
|
|
28
|
+
severity: "critical",
|
|
29
|
+
owasp: "A02:2025 Injection",
|
|
30
|
+
description: "User input passed to os/exec command functions allows arbitrary command execution.",
|
|
31
|
+
pattern: /exec\.Command\s*\(\s*(?:fmt\.Sprintf|[^")\s]+\s*\+|[^")]*\+)/gi,
|
|
32
|
+
languages: ["go"],
|
|
33
|
+
fix: "Validate and sanitize all input before passing to exec.Command. Use an allowlist of permitted commands.",
|
|
34
|
+
fixCode: "// Validate input, use allowlist\ncmd := exec.Command(\"ls\", \"-la\", safeDir)",
|
|
35
|
+
compliance: ["SOC2:CC7.1", "PCI-DSS:Req6.5.1"],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "VG112",
|
|
39
|
+
name: "Go unescaped HTML template",
|
|
40
|
+
severity: "high",
|
|
41
|
+
owasp: "A02:2025 Injection",
|
|
42
|
+
description: "Using template.HTML() bypasses Go's automatic HTML escaping, enabling XSS.",
|
|
43
|
+
pattern: /template\.HTML\s*\(/gi,
|
|
44
|
+
languages: ["go"],
|
|
45
|
+
fix: "Avoid template.HTML() with user input. Use html/template which auto-escapes by default.",
|
|
46
|
+
fixCode: "// Use html/template which auto-escapes\n// Avoid template.HTML() with user input\ntmpl.Execute(w, data) // auto-escaped",
|
|
47
|
+
compliance: ["SOC2:CC7.1", "PCI-DSS:Req6.5.7"],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "VG113",
|
|
51
|
+
name: "Go HTTP handler without auth",
|
|
52
|
+
severity: "high",
|
|
53
|
+
owasp: "A01:2025 Broken Access Control",
|
|
54
|
+
description: "HTTP handler registered without authentication middleware.",
|
|
55
|
+
pattern: /(?:http\.HandleFunc|mux\.HandleFunc|\.HandleFunc)\s*\(\s*['"]\/(?:api|admin|users|account|dashboard)/gi,
|
|
56
|
+
languages: ["go"],
|
|
57
|
+
fix: "Wrap handlers with authentication middleware: http.Handle('/api/', authMiddleware(handler)).",
|
|
58
|
+
fixCode: "// Wrap with auth middleware\nhttp.Handle(\"/api/\", authMiddleware(apiHandler))",
|
|
59
|
+
compliance: ["SOC2:CC6.1", "SOC2:CC6.6"],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "VG114",
|
|
63
|
+
name: "Go weak hashing",
|
|
64
|
+
severity: "critical",
|
|
65
|
+
owasp: "A07:2025 Auth Failures",
|
|
66
|
+
description: "Using md5 or sha1 for hashing. These are cryptographically broken for security purposes.",
|
|
67
|
+
pattern: /(?:md5\.New|sha1\.New|md5\.Sum|sha1\.Sum)\s*\(/gi,
|
|
68
|
+
languages: ["go"],
|
|
69
|
+
fix: "Use crypto/sha256 or golang.org/x/crypto/bcrypt for password hashing.",
|
|
70
|
+
fixCode: "// Use bcrypt for passwords\nimport \"golang.org/x/crypto/bcrypt\"\nhash, _ := bcrypt.GenerateFromPassword([]byte(password), 12)",
|
|
71
|
+
compliance: ["SOC2:CC6.1", "PCI-DSS:Req4.1"],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "VG115",
|
|
75
|
+
name: "Go CORS wildcard",
|
|
76
|
+
severity: "high",
|
|
77
|
+
owasp: "A05:2025 Security Misconfiguration",
|
|
78
|
+
description: "CORS configured with wildcard origin allows any website to access your API.",
|
|
79
|
+
pattern: /(?:Access-Control-Allow-Origin|AllowOrigins|allowOrigins)['"]?\]?\s*[:=,]\s*['"]?\s*\*/gi,
|
|
80
|
+
languages: ["go"],
|
|
81
|
+
fix: "Set specific allowed origins instead of wildcard '*'.",
|
|
82
|
+
fixCode: "// Specify allowed origins\nw.Header().Set(\"Access-Control-Allow-Origin\", \"https://myapp.com\")",
|
|
83
|
+
compliance: ["SOC2:CC6.1"],
|
|
84
|
+
},
|
|
85
|
+
];
|