supasec 1.0.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/.env +1 -0
- package/LICENSE +21 -0
- package/README.md +276 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/scan.d.ts +23 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +235 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/models/finding.d.ts +88 -0
- package/dist/models/finding.d.ts.map +1 -0
- package/dist/models/finding.js +80 -0
- package/dist/models/finding.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +23 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/scan-result.d.ts +103 -0
- package/dist/models/scan-result.d.ts.map +1 -0
- package/dist/models/scan-result.js +168 -0
- package/dist/models/scan-result.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +22 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/terminal.d.ts +20 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +346 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/scanners/index.d.ts +7 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +23 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/rls/analyzer.d.ts +44 -0
- package/dist/scanners/rls/analyzer.d.ts.map +1 -0
- package/dist/scanners/rls/analyzer.js +519 -0
- package/dist/scanners/rls/analyzer.js.map +1 -0
- package/dist/scanners/rls/index.d.ts +6 -0
- package/dist/scanners/rls/index.d.ts.map +1 -0
- package/dist/scanners/rls/index.js +22 -0
- package/dist/scanners/rls/index.js.map +1 -0
- package/dist/scanners/secrets/detector.d.ts +32 -0
- package/dist/scanners/secrets/detector.d.ts.map +1 -0
- package/dist/scanners/secrets/detector.js +251 -0
- package/dist/scanners/secrets/detector.js.map +1 -0
- package/dist/scanners/secrets/index.d.ts +7 -0
- package/dist/scanners/secrets/index.d.ts.map +1 -0
- package/dist/scanners/secrets/index.js +23 -0
- package/dist/scanners/secrets/index.js.map +1 -0
- package/dist/scanners/secrets/patterns.d.ts +57 -0
- package/dist/scanners/secrets/patterns.d.ts.map +1 -0
- package/dist/scanners/secrets/patterns.js +285 -0
- package/dist/scanners/secrets/patterns.js.map +1 -0
- package/npm-publishing-guide.md +38 -0
- package/package.json +69 -0
package/.env
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
NPM_TOKEN=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
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SupaSec Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# š SupaSec
|
|
2
|
+
|
|
3
|
+
A free, open-source CLI tool for comprehensive Supabase security auditing.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/supasec)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## š Quick Start
|
|
9
|
+
|
|
10
|
+
Scan any Supabase-powered website instantly:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx supasec scan https://myapp.com
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## ⨠Features
|
|
17
|
+
|
|
18
|
+
- **š Secret Detection** - Find exposed API keys, service role keys, and credentials
|
|
19
|
+
- **š”ļø RLS Analysis** - Detect missing or misconfigured Row Level Security policies
|
|
20
|
+
- **š Security Grading** - Get an A-F grade with actionable recommendations
|
|
21
|
+
- **š§ Auto-Fix** - Interactive wizard to automatically fix vulnerabilities
|
|
22
|
+
- **š CI/CD Ready** - Integrate with GitHub Actions, GitLab CI, and more
|
|
23
|
+
- **šÆ Free & Open Source** - No paywalls, no subscriptions
|
|
24
|
+
|
|
25
|
+
## š Installation
|
|
26
|
+
|
|
27
|
+
### Using npx (Recommended)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx supasec scan <url>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Global Installation
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install -g supasec
|
|
37
|
+
supasec scan <url>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## š§ Usage
|
|
41
|
+
|
|
42
|
+
### Basic Scan
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Scan a website
|
|
46
|
+
supasec scan https://myapp.com
|
|
47
|
+
|
|
48
|
+
# Scan with authentication
|
|
49
|
+
supasec scan https://myapp.com --project-url https://abc.supabase.co --service-key xxx
|
|
50
|
+
|
|
51
|
+
# Scan local project
|
|
52
|
+
supasec scan --local
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Output Formats
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Terminal output (default)
|
|
59
|
+
supasec scan https://myapp.com
|
|
60
|
+
|
|
61
|
+
# JSON output
|
|
62
|
+
supasec scan https://myapp.com --format json
|
|
63
|
+
|
|
64
|
+
# HTML report
|
|
65
|
+
supasec scan https://myapp.com --format html --output report.html
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### CI/CD Integration
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Fail on critical or high severity issues
|
|
72
|
+
supasec scan https://myapp.com --fail-on critical,high
|
|
73
|
+
|
|
74
|
+
# Quiet mode for CI
|
|
75
|
+
supasec scan https://myapp.com --format json --quiet --output audit.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## š ļø Auto-Fix
|
|
79
|
+
|
|
80
|
+
Fix vulnerabilities interactively:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
supasec fix --interactive
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Or apply fixes automatically:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
supasec fix --auto --backup
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## š Security Checks
|
|
93
|
+
|
|
94
|
+
SupaSec performs comprehensive security checks across multiple categories:
|
|
95
|
+
|
|
96
|
+
### Secrets Detection
|
|
97
|
+
- ā
Service role key exposure
|
|
98
|
+
- ā
Anon key validation
|
|
99
|
+
- ā
Third-party API keys (Stripe, OpenAI, etc.)
|
|
100
|
+
- ā
JWT token exposure
|
|
101
|
+
- ā
Private keys in bundles
|
|
102
|
+
|
|
103
|
+
### RLS Security
|
|
104
|
+
- ā
Tables without RLS enabled
|
|
105
|
+
- ā
Missing RLS policies
|
|
106
|
+
- ā
Bypass policies (`USING (true)`)
|
|
107
|
+
- ā
Missing user isolation
|
|
108
|
+
- ā
Public role access
|
|
109
|
+
|
|
110
|
+
### Authentication
|
|
111
|
+
- ā
Password policy strength
|
|
112
|
+
- ā
MFA configuration
|
|
113
|
+
- ā
Email verification
|
|
114
|
+
- ā
Rate limiting
|
|
115
|
+
|
|
116
|
+
### Storage Security
|
|
117
|
+
- ā
Public bucket exposure
|
|
118
|
+
- ā
File type restrictions
|
|
119
|
+
- ā
Signed URL validation
|
|
120
|
+
|
|
121
|
+
### API Security
|
|
122
|
+
- ā
RPC exposure
|
|
123
|
+
- ā
CORS configuration
|
|
124
|
+
- ā
GraphQL introspection
|
|
125
|
+
|
|
126
|
+
## š Example Output
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
š SupaSec - Supabase Security Audit v1.0.0
|
|
130
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
131
|
+
|
|
132
|
+
šÆ Target: https://myapp.com
|
|
133
|
+
ā±ļø Started: 2026-01-28T14:23:15.000Z
|
|
134
|
+
|
|
135
|
+
ā Detected Supabase project
|
|
136
|
+
Found 12 tables, 8 RPCs, 3 storage buckets
|
|
137
|
+
|
|
138
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
139
|
+
š SCAN SUMMARY
|
|
140
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
141
|
+
|
|
142
|
+
ā CRITICAL: 1 issues
|
|
143
|
+
ā ļø HIGH: 2 issues
|
|
144
|
+
ā” MEDIUM: 1 issues
|
|
145
|
+
|
|
146
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
147
|
+
ā CRITICAL (1 issues)
|
|
148
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
149
|
+
|
|
150
|
+
āā RLS-001: Table 'users' has RLS disabled
|
|
151
|
+
ā The table 'users' does not have Row Level Security enabled.
|
|
152
|
+
ā
|
|
153
|
+
ā Location: public.users
|
|
154
|
+
ā Impact: Complete exposure of 1847 records
|
|
155
|
+
ā
|
|
156
|
+
ā Fix: Enable Row Level Security on table 'users'
|
|
157
|
+
ā SQL:
|
|
158
|
+
ā ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
|
|
159
|
+
ā CREATE POLICY "Users can only access own data"
|
|
160
|
+
ā ON public.users FOR SELECT
|
|
161
|
+
ā USING (auth.uid() = id);
|
|
162
|
+
ā
|
|
163
|
+
|
|
164
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
165
|
+
š SECURITY GRADE
|
|
166
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
167
|
+
|
|
168
|
+
Grade D - 45/100
|
|
169
|
+
Below average - serious issues found.
|
|
170
|
+
|
|
171
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
172
|
+
š ļø QUICK ACTIONS
|
|
173
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
174
|
+
|
|
175
|
+
Fix critical issues now:
|
|
176
|
+
$ supasec fix --interactive
|
|
177
|
+
|
|
178
|
+
View detailed report:
|
|
179
|
+
$ supasec report --format html --output report.html
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## š CI/CD Integration
|
|
183
|
+
|
|
184
|
+
### GitHub Actions
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
name: Security Audit
|
|
188
|
+
|
|
189
|
+
on: [push, pull_request]
|
|
190
|
+
|
|
191
|
+
jobs:
|
|
192
|
+
security:
|
|
193
|
+
runs-on: ubuntu-latest
|
|
194
|
+
steps:
|
|
195
|
+
- uses: actions/checkout@v3
|
|
196
|
+
|
|
197
|
+
- name: Run SupaSec Security Scan
|
|
198
|
+
run: |
|
|
199
|
+
npx supasec scan https://staging.myapp.com \
|
|
200
|
+
--format json \
|
|
201
|
+
--fail-on critical,high \
|
|
202
|
+
--output audit.json
|
|
203
|
+
|
|
204
|
+
- name: Upload Report
|
|
205
|
+
if: always()
|
|
206
|
+
uses: actions/upload-artifact@v3
|
|
207
|
+
with:
|
|
208
|
+
name: security-report
|
|
209
|
+
path: audit.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### GitLab CI
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
security_scan:
|
|
216
|
+
stage: security
|
|
217
|
+
image: node:18
|
|
218
|
+
script:
|
|
219
|
+
- npx supasec scan $STAGING_URL
|
|
220
|
+
--format json
|
|
221
|
+
--output audit.json
|
|
222
|
+
--fail-on critical,high
|
|
223
|
+
artifacts:
|
|
224
|
+
paths:
|
|
225
|
+
- audit.json
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## š Documentation
|
|
229
|
+
|
|
230
|
+
- [Full Documentation](https://github.com/yourusername/supasec/wiki)
|
|
231
|
+
- [Configuration Guide](https://github.com/yourusername/supasec/wiki/Configuration)
|
|
232
|
+
- [CI/CD Integration](https://github.com/yourusername/supasec/wiki/CI-CD)
|
|
233
|
+
- [API Reference](https://github.com/yourusername/supasec/wiki/API)
|
|
234
|
+
|
|
235
|
+
## š¤ Contributing
|
|
236
|
+
|
|
237
|
+
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
238
|
+
|
|
239
|
+
### Development Setup
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Clone the repository
|
|
243
|
+
git clone https://github.com/yourusername/supasec.git
|
|
244
|
+
cd supasec
|
|
245
|
+
|
|
246
|
+
# Install dependencies
|
|
247
|
+
npm install
|
|
248
|
+
|
|
249
|
+
# Build the project
|
|
250
|
+
npm run build
|
|
251
|
+
|
|
252
|
+
# Run in development mode
|
|
253
|
+
npm run dev
|
|
254
|
+
|
|
255
|
+
# Run tests
|
|
256
|
+
npm test
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## š License
|
|
260
|
+
|
|
261
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
|
262
|
+
|
|
263
|
+
## š Acknowledgments
|
|
264
|
+
|
|
265
|
+
- Inspired by [AuditYour.App](https://audityour.app), [SupaShield](https://github.com/steve-chavez/supashield), and other Supabase security tools
|
|
266
|
+
- Built with ā¤ļø for the Supabase community
|
|
267
|
+
|
|
268
|
+
## š Support
|
|
269
|
+
|
|
270
|
+
- [GitHub Issues](https://github.com/yourusername/supasec/issues)
|
|
271
|
+
- [Discord Community](https://discord.gg/supasec)
|
|
272
|
+
- [Twitter/X: @supasec](https://twitter.com/supasec)
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
**Made with š by the SupaSec Team**
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* SupaSec CLI
|
|
5
|
+
* Main entry point for the Supabase Security Auditor
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
const scan_js_1 = require("./commands/scan.js");
|
|
10
|
+
// Create the CLI program
|
|
11
|
+
const program = new commander_1.Command();
|
|
12
|
+
program
|
|
13
|
+
.name('supasec')
|
|
14
|
+
.description('A free, open-source CLI tool for comprehensive Supabase security auditing')
|
|
15
|
+
.version('1.0.0')
|
|
16
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
17
|
+
.option('--no-color', 'Disable colored output');
|
|
18
|
+
// Register commands
|
|
19
|
+
(0, scan_js_1.registerScanCommand)(program);
|
|
20
|
+
// TODO: Register additional commands
|
|
21
|
+
// registerFixCommand(program);
|
|
22
|
+
// registerWatchCommand(program);
|
|
23
|
+
// registerReportCommand(program);
|
|
24
|
+
// Parse command line arguments
|
|
25
|
+
program.parse();
|
|
26
|
+
// Show help if no command provided
|
|
27
|
+
if (!process.argv.slice(2).length) {
|
|
28
|
+
program.outputHelp();
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;AAEH,yCAAoC;AACpC,gDAAyD;AAEzD,yBAAyB;AACzB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,2EAA2E,CAAC;KACxF,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAElD,oBAAoB;AACpB,IAAA,6BAAmB,EAAC,OAAO,CAAC,CAAC;AAE7B,qCAAqC;AACrC,+BAA+B;AAC/B,iCAAiC;AACjC,kCAAkC;AAElC,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Commands Index
|
|
4
|
+
* Export all CLI commands
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./scan.js"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,4CAA0B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan Command
|
|
3
|
+
* Main scanning command implementation
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface ScanCommandOptions {
|
|
7
|
+
format?: 'terminal' | 'json' | 'html' | 'md';
|
|
8
|
+
output?: string;
|
|
9
|
+
failOn?: string;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
projectUrl?: string;
|
|
12
|
+
anonKey?: string;
|
|
13
|
+
serviceKey?: string;
|
|
14
|
+
local?: boolean;
|
|
15
|
+
deep?: boolean;
|
|
16
|
+
quiet?: boolean;
|
|
17
|
+
noColor?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register the scan command
|
|
21
|
+
*/
|
|
22
|
+
export declare function registerScanCommand(program: Command): void;
|
|
23
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB1D"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scan Command
|
|
4
|
+
* Main scanning command implementation
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.registerScanCommand = registerScanCommand;
|
|
44
|
+
const ora_1 = __importDefault(require("ora"));
|
|
45
|
+
const detector_js_1 = require("../scanners/secrets/detector.js");
|
|
46
|
+
const analyzer_js_1 = require("../scanners/rls/analyzer.js");
|
|
47
|
+
const index_js_1 = require("../models/index.js");
|
|
48
|
+
const terminal_js_1 = require("../reporters/terminal.js");
|
|
49
|
+
const fs = __importStar(require("fs/promises"));
|
|
50
|
+
/**
|
|
51
|
+
* Register the scan command
|
|
52
|
+
*/
|
|
53
|
+
function registerScanCommand(program) {
|
|
54
|
+
program
|
|
55
|
+
.command('scan')
|
|
56
|
+
.description('Scan a Supabase project for security issues')
|
|
57
|
+
.argument('<target>', 'URL or project to scan')
|
|
58
|
+
.option('-f, --format <format>', 'Output format (terminal, json, html, md)', 'terminal')
|
|
59
|
+
.option('-o, --output <file>', 'Output file path')
|
|
60
|
+
.option('--fail-on <levels>', 'Fail on severity levels (comma-separated: critical,high,medium,low)')
|
|
61
|
+
.option('-t, --timeout <seconds>', 'Scan timeout in seconds', '60')
|
|
62
|
+
.option('--project-url <url>', 'Supabase project URL')
|
|
63
|
+
.option('--anon-key <key>', 'Supabase anon key')
|
|
64
|
+
.option('--service-key <key>', 'Supabase service role key')
|
|
65
|
+
.option('-l, --local', 'Scan local Supabase project')
|
|
66
|
+
.option('-d, --deep', 'Perform deep scan (slower, more thorough)')
|
|
67
|
+
.option('-q, --quiet', 'Suppress non-error output')
|
|
68
|
+
.option('--no-color', 'Disable colored output')
|
|
69
|
+
.action(async (target, options) => {
|
|
70
|
+
try {
|
|
71
|
+
await executeScan(target, options);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Scan failed:', error instanceof Error ? error.message : error);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Execute the scan command
|
|
81
|
+
*/
|
|
82
|
+
async function executeScan(target, options) {
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
// Create initial result
|
|
85
|
+
const result = (0, index_js_1.createEmptyScanResult)(target, options.local ? 'local' : options.projectUrl ? 'project' : 'url');
|
|
86
|
+
const spinner = options.quiet ? null : (0, ora_1.default)('Initializing scan...').start();
|
|
87
|
+
try {
|
|
88
|
+
const allFindings = [];
|
|
89
|
+
// Scan for secrets in the target
|
|
90
|
+
if (spinner)
|
|
91
|
+
spinner.text = 'Scanning for exposed secrets...';
|
|
92
|
+
// Simulate scanning JavaScript content (in real implementation, this would fetch from URL)
|
|
93
|
+
const mockJsContent = `
|
|
94
|
+
const supabaseUrl = 'https://example.supabase.co';
|
|
95
|
+
const supabaseKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiJ9...';
|
|
96
|
+
// TODO: Remove before production - sk_live_1234567890abcdef
|
|
97
|
+
`;
|
|
98
|
+
const secretsResult = await (0, detector_js_1.scanForSecrets)({
|
|
99
|
+
content: mockJsContent,
|
|
100
|
+
sourceUrl: target,
|
|
101
|
+
sourceType: 'javascript'
|
|
102
|
+
});
|
|
103
|
+
allFindings.push(...secretsResult.findings);
|
|
104
|
+
// Scan RLS policies (if we have project access)
|
|
105
|
+
if (options.projectUrl || options.serviceKey) {
|
|
106
|
+
if (spinner)
|
|
107
|
+
spinner.text = 'Analyzing RLS policies...';
|
|
108
|
+
// Mock table and policy data
|
|
109
|
+
const mockTables = [
|
|
110
|
+
{
|
|
111
|
+
name: 'users',
|
|
112
|
+
schema: 'public',
|
|
113
|
+
rowCount: 1847,
|
|
114
|
+
hasRLSEnabled: false,
|
|
115
|
+
columns: [
|
|
116
|
+
{ name: 'id', type: 'uuid', isNullable: false },
|
|
117
|
+
{ name: 'email', type: 'text', isNullable: false },
|
|
118
|
+
{ name: 'phone', type: 'text', isNullable: true }
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'posts',
|
|
123
|
+
schema: 'public',
|
|
124
|
+
rowCount: 5234,
|
|
125
|
+
hasRLSEnabled: true,
|
|
126
|
+
columns: [
|
|
127
|
+
{ name: 'id', type: 'uuid', isNullable: false },
|
|
128
|
+
{ name: 'title', type: 'text', isNullable: false },
|
|
129
|
+
{ name: 'user_id', type: 'uuid', isNullable: false }
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
];
|
|
133
|
+
const mockPolicies = [
|
|
134
|
+
{
|
|
135
|
+
name: 'posts_select',
|
|
136
|
+
table: 'posts',
|
|
137
|
+
schema: 'public',
|
|
138
|
+
permissive: true,
|
|
139
|
+
roles: ['public'],
|
|
140
|
+
command: 'SELECT',
|
|
141
|
+
usingExpression: 'true'
|
|
142
|
+
}
|
|
143
|
+
];
|
|
144
|
+
const rlsResult = await (0, analyzer_js_1.analyzeRLS)({
|
|
145
|
+
tables: mockTables,
|
|
146
|
+
policies: mockPolicies,
|
|
147
|
+
supabaseUrl: options.projectUrl || target,
|
|
148
|
+
anonKey: options.anonKey
|
|
149
|
+
});
|
|
150
|
+
allFindings.push(...rlsResult.findings);
|
|
151
|
+
result.project_info.tables_count = rlsResult.tablesScanned;
|
|
152
|
+
}
|
|
153
|
+
// Add findings to result
|
|
154
|
+
result.findings = allFindings;
|
|
155
|
+
// Add some passed checks for demonstration
|
|
156
|
+
result.passed_checks = [
|
|
157
|
+
{
|
|
158
|
+
check_id: 'SEC-HTTPS-001',
|
|
159
|
+
category: 'transport',
|
|
160
|
+
title: 'HTTPS Enforced',
|
|
161
|
+
description: 'All connections use HTTPS/TLS 1.2+'
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
check_id: 'AUTH-EMAIL-001',
|
|
165
|
+
category: 'auth',
|
|
166
|
+
title: 'Email Verification Enabled',
|
|
167
|
+
description: 'New users must verify email before access'
|
|
168
|
+
}
|
|
169
|
+
];
|
|
170
|
+
// Calculate duration
|
|
171
|
+
result.scan_metadata.scan_duration_seconds = (Date.now() - startTime) / 1000;
|
|
172
|
+
// Finalize result
|
|
173
|
+
(0, index_js_1.finalizeScanResult)(result);
|
|
174
|
+
if (spinner)
|
|
175
|
+
spinner.succeed('Scan completed!');
|
|
176
|
+
// Output results
|
|
177
|
+
await outputResults(result, options);
|
|
178
|
+
// Handle fail-on option
|
|
179
|
+
if (options.failOn) {
|
|
180
|
+
const failLevels = options.failOn.split(',').map(l => l.trim().toUpperCase());
|
|
181
|
+
const counts = {
|
|
182
|
+
CRITICAL: result.summary.critical,
|
|
183
|
+
HIGH: result.summary.high,
|
|
184
|
+
MEDIUM: result.summary.medium,
|
|
185
|
+
LOW: result.summary.low
|
|
186
|
+
};
|
|
187
|
+
for (const level of failLevels) {
|
|
188
|
+
if (counts[level] > 0) {
|
|
189
|
+
if (!options.quiet) {
|
|
190
|
+
console.error(`\nā Scan failed: Found ${counts[level]} ${level} issue(s)`);
|
|
191
|
+
}
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (spinner)
|
|
199
|
+
spinner.fail('Scan failed!');
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Output scan results based on format
|
|
205
|
+
*/
|
|
206
|
+
async function outputResults(result, options) {
|
|
207
|
+
const format = options.format || 'terminal';
|
|
208
|
+
switch (format) {
|
|
209
|
+
case 'json':
|
|
210
|
+
const jsonOutput = JSON.stringify(result, null, 2);
|
|
211
|
+
if (options.output) {
|
|
212
|
+
await fs.writeFile(options.output, jsonOutput, 'utf-8');
|
|
213
|
+
if (!options.quiet) {
|
|
214
|
+
console.log(`\nā
JSON report saved to ${options.output}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
console.log(jsonOutput);
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
case 'terminal':
|
|
222
|
+
default:
|
|
223
|
+
(0, terminal_js_1.printReport)(result, {
|
|
224
|
+
showPassed: true,
|
|
225
|
+
showRemediation: true,
|
|
226
|
+
compact: false,
|
|
227
|
+
noColor: options.noColor
|
|
228
|
+
});
|
|
229
|
+
// Also save JSON report
|
|
230
|
+
const defaultOutput = `./supasec-report-${result.scan_metadata.scan_id}.json`;
|
|
231
|
+
await fs.writeFile(defaultOutput, JSON.stringify(result, null, 2), 'utf-8');
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SupaSec - Supabase Security Auditor
|
|
3
|
+
* Main exports for programmatic usage
|
|
4
|
+
*/
|
|
5
|
+
export * from './models/index.js';
|
|
6
|
+
export * from './scanners/index.js';
|
|
7
|
+
export * from './reporters/index.js';
|
|
8
|
+
export declare const VERSION = "1.0.0";
|
|
9
|
+
export declare const TOOL_NAME = "supasec";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,mBAAmB,CAAC;AAGlC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,SAAS,YAAY,CAAC"}
|