clawsec 0.0.1
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/README.md +560 -0
- package/dist/bin/clawsec.d.ts +7 -0
- package/dist/bin/clawsec.d.ts.map +1 -0
- package/dist/bin/clawsec.js +12 -0
- package/dist/bin/clawsec.js.map +1 -0
- package/dist/src/actions/block.d.ts +22 -0
- package/dist/src/actions/block.d.ts.map +1 -0
- package/dist/src/actions/block.js +83 -0
- package/dist/src/actions/block.js.map +1 -0
- package/dist/src/actions/confirm.d.ts +35 -0
- package/dist/src/actions/confirm.d.ts.map +1 -0
- package/dist/src/actions/confirm.js +156 -0
- package/dist/src/actions/confirm.js.map +1 -0
- package/dist/src/actions/executor.d.ts +64 -0
- package/dist/src/actions/executor.d.ts.map +1 -0
- package/dist/src/actions/executor.js +114 -0
- package/dist/src/actions/executor.js.map +1 -0
- package/dist/src/actions/index.d.ts +13 -0
- package/dist/src/actions/index.d.ts.map +1 -0
- package/dist/src/actions/index.js +15 -0
- package/dist/src/actions/index.js.map +1 -0
- package/dist/src/actions/log.d.ts +19 -0
- package/dist/src/actions/log.d.ts.map +1 -0
- package/dist/src/actions/log.js +63 -0
- package/dist/src/actions/log.js.map +1 -0
- package/dist/src/actions/types.d.ts +85 -0
- package/dist/src/actions/types.d.ts.map +1 -0
- package/dist/src/actions/types.js +78 -0
- package/dist/src/actions/types.js.map +1 -0
- package/dist/src/actions/warn.d.ts +22 -0
- package/dist/src/actions/warn.d.ts.map +1 -0
- package/dist/src/actions/warn.js +84 -0
- package/dist/src/actions/warn.js.map +1 -0
- package/dist/src/approval/agent-confirm.d.ts +104 -0
- package/dist/src/approval/agent-confirm.d.ts.map +1 -0
- package/dist/src/approval/agent-confirm.js +173 -0
- package/dist/src/approval/agent-confirm.js.map +1 -0
- package/dist/src/approval/index.d.ts +14 -0
- package/dist/src/approval/index.d.ts.map +1 -0
- package/dist/src/approval/index.js +9 -0
- package/dist/src/approval/index.js.map +1 -0
- package/dist/src/approval/native.d.ts +56 -0
- package/dist/src/approval/native.d.ts.map +1 -0
- package/dist/src/approval/native.js +196 -0
- package/dist/src/approval/native.js.map +1 -0
- package/dist/src/approval/store.d.ts +88 -0
- package/dist/src/approval/store.d.ts.map +1 -0
- package/dist/src/approval/store.js +192 -0
- package/dist/src/approval/store.js.map +1 -0
- package/dist/src/approval/types.d.ts +119 -0
- package/dist/src/approval/types.d.ts.map +1 -0
- package/dist/src/approval/types.js +6 -0
- package/dist/src/approval/types.js.map +1 -0
- package/dist/src/approval/webhook.d.ts +170 -0
- package/dist/src/approval/webhook.d.ts.map +1 -0
- package/dist/src/approval/webhook.js +362 -0
- package/dist/src/approval/webhook.js.map +1 -0
- package/dist/src/cli/commands/audit.d.ts +43 -0
- package/dist/src/cli/commands/audit.d.ts.map +1 -0
- package/dist/src/cli/commands/audit.js +115 -0
- package/dist/src/cli/commands/audit.js.map +1 -0
- package/dist/src/cli/commands/feedback.d.ts +27 -0
- package/dist/src/cli/commands/feedback.d.ts.map +1 -0
- package/dist/src/cli/commands/feedback.js +228 -0
- package/dist/src/cli/commands/feedback.js.map +1 -0
- package/dist/src/cli/commands/index.d.ts +11 -0
- package/dist/src/cli/commands/index.d.ts.map +1 -0
- package/dist/src/cli/commands/index.js +13 -0
- package/dist/src/cli/commands/index.js.map +1 -0
- package/dist/src/cli/commands/status.d.ts +20 -0
- package/dist/src/cli/commands/status.d.ts.map +1 -0
- package/dist/src/cli/commands/status.js +122 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/test.d.ts +23 -0
- package/dist/src/cli/commands/test.d.ts.map +1 -0
- package/dist/src/cli/commands/test.js +134 -0
- package/dist/src/cli/commands/test.js.map +1 -0
- package/dist/src/cli/commands/types.d.ts +81 -0
- package/dist/src/cli/commands/types.d.ts.map +1 -0
- package/dist/src/cli/commands/types.js +6 -0
- package/dist/src/cli/commands/types.js.map +1 -0
- package/dist/src/cli/index.d.ts +17 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +267 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/config/defaults.d.ts +20 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/defaults.js +123 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/config/index.d.ts +8 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +41 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/loader.d.ts +99 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +242 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +627 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +585 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/detectors/destructive/cloud-detector.d.ts +51 -0
- package/dist/src/detectors/destructive/cloud-detector.d.ts.map +1 -0
- package/dist/src/detectors/destructive/cloud-detector.js +556 -0
- package/dist/src/detectors/destructive/cloud-detector.js.map +1 -0
- package/dist/src/detectors/destructive/code-detector.d.ts +59 -0
- package/dist/src/detectors/destructive/code-detector.d.ts.map +1 -0
- package/dist/src/detectors/destructive/code-detector.js +558 -0
- package/dist/src/detectors/destructive/code-detector.js.map +1 -0
- package/dist/src/detectors/destructive/index.d.ts +54 -0
- package/dist/src/detectors/destructive/index.d.ts.map +1 -0
- package/dist/src/detectors/destructive/index.js +168 -0
- package/dist/src/detectors/destructive/index.js.map +1 -0
- package/dist/src/detectors/destructive/shell-detector.d.ts +43 -0
- package/dist/src/detectors/destructive/shell-detector.d.ts.map +1 -0
- package/dist/src/detectors/destructive/shell-detector.js +302 -0
- package/dist/src/detectors/destructive/shell-detector.js.map +1 -0
- package/dist/src/detectors/destructive/types.d.ts +143 -0
- package/dist/src/detectors/destructive/types.d.ts.map +1 -0
- package/dist/src/detectors/destructive/types.js +6 -0
- package/dist/src/detectors/destructive/types.js.map +1 -0
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts +51 -0
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts.map +1 -0
- package/dist/src/detectors/exfiltration/cloud-detector.js +427 -0
- package/dist/src/detectors/exfiltration/cloud-detector.js.map +1 -0
- package/dist/src/detectors/exfiltration/http-detector.d.ts +47 -0
- package/dist/src/detectors/exfiltration/http-detector.d.ts.map +1 -0
- package/dist/src/detectors/exfiltration/http-detector.js +429 -0
- package/dist/src/detectors/exfiltration/http-detector.js.map +1 -0
- package/dist/src/detectors/exfiltration/index.d.ts +44 -0
- package/dist/src/detectors/exfiltration/index.d.ts.map +1 -0
- package/dist/src/detectors/exfiltration/index.js +118 -0
- package/dist/src/detectors/exfiltration/index.js.map +1 -0
- package/dist/src/detectors/exfiltration/network-detector.d.ts +55 -0
- package/dist/src/detectors/exfiltration/network-detector.d.ts.map +1 -0
- package/dist/src/detectors/exfiltration/network-detector.js +504 -0
- package/dist/src/detectors/exfiltration/network-detector.js.map +1 -0
- package/dist/src/detectors/exfiltration/types.d.ts +139 -0
- package/dist/src/detectors/exfiltration/types.d.ts.map +1 -0
- package/dist/src/detectors/exfiltration/types.js +6 -0
- package/dist/src/detectors/exfiltration/types.js.map +1 -0
- package/dist/src/detectors/purchase/domain-detector.d.ts +44 -0
- package/dist/src/detectors/purchase/domain-detector.d.ts.map +1 -0
- package/dist/src/detectors/purchase/domain-detector.js +296 -0
- package/dist/src/detectors/purchase/domain-detector.js.map +1 -0
- package/dist/src/detectors/purchase/form-detector.d.ts +27 -0
- package/dist/src/detectors/purchase/form-detector.d.ts.map +1 -0
- package/dist/src/detectors/purchase/form-detector.js +344 -0
- package/dist/src/detectors/purchase/form-detector.js.map +1 -0
- package/dist/src/detectors/purchase/index.d.ts +65 -0
- package/dist/src/detectors/purchase/index.d.ts.map +1 -0
- package/dist/src/detectors/purchase/index.js +216 -0
- package/dist/src/detectors/purchase/index.js.map +1 -0
- package/dist/src/detectors/purchase/spend-tracker.d.ts +132 -0
- package/dist/src/detectors/purchase/spend-tracker.d.ts.map +1 -0
- package/dist/src/detectors/purchase/spend-tracker.js +313 -0
- package/dist/src/detectors/purchase/spend-tracker.js.map +1 -0
- package/dist/src/detectors/purchase/types.d.ts +139 -0
- package/dist/src/detectors/purchase/types.d.ts.map +1 -0
- package/dist/src/detectors/purchase/types.js +6 -0
- package/dist/src/detectors/purchase/types.js.map +1 -0
- package/dist/src/detectors/purchase/url-detector.d.ts +31 -0
- package/dist/src/detectors/purchase/url-detector.d.ts.map +1 -0
- package/dist/src/detectors/purchase/url-detector.js +292 -0
- package/dist/src/detectors/purchase/url-detector.js.map +1 -0
- package/dist/src/detectors/secrets/api-key-detector.d.ts +30 -0
- package/dist/src/detectors/secrets/api-key-detector.d.ts.map +1 -0
- package/dist/src/detectors/secrets/api-key-detector.js +297 -0
- package/dist/src/detectors/secrets/api-key-detector.js.map +1 -0
- package/dist/src/detectors/secrets/index.d.ts +43 -0
- package/dist/src/detectors/secrets/index.d.ts.map +1 -0
- package/dist/src/detectors/secrets/index.js +261 -0
- package/dist/src/detectors/secrets/index.js.map +1 -0
- package/dist/src/detectors/secrets/pii-detector.d.ts +54 -0
- package/dist/src/detectors/secrets/pii-detector.d.ts.map +1 -0
- package/dist/src/detectors/secrets/pii-detector.js +286 -0
- package/dist/src/detectors/secrets/pii-detector.js.map +1 -0
- package/dist/src/detectors/secrets/token-detector.d.ts +51 -0
- package/dist/src/detectors/secrets/token-detector.d.ts.map +1 -0
- package/dist/src/detectors/secrets/token-detector.js +233 -0
- package/dist/src/detectors/secrets/token-detector.js.map +1 -0
- package/dist/src/detectors/secrets/types.d.ts +157 -0
- package/dist/src/detectors/secrets/types.d.ts.map +1 -0
- package/dist/src/detectors/secrets/types.js +6 -0
- package/dist/src/detectors/secrets/types.js.map +1 -0
- package/dist/src/detectors/website/category-detector.d.ts +22 -0
- package/dist/src/detectors/website/category-detector.d.ts.map +1 -0
- package/dist/src/detectors/website/category-detector.js +162 -0
- package/dist/src/detectors/website/category-detector.js.map +1 -0
- package/dist/src/detectors/website/index.d.ts +53 -0
- package/dist/src/detectors/website/index.d.ts.map +1 -0
- package/dist/src/detectors/website/index.js +232 -0
- package/dist/src/detectors/website/index.js.map +1 -0
- package/dist/src/detectors/website/pattern-matcher.d.ts +33 -0
- package/dist/src/detectors/website/pattern-matcher.d.ts.map +1 -0
- package/dist/src/detectors/website/pattern-matcher.js +121 -0
- package/dist/src/detectors/website/pattern-matcher.js.map +1 -0
- package/dist/src/detectors/website/types.d.ts +105 -0
- package/dist/src/detectors/website/types.d.ts.map +1 -0
- package/dist/src/detectors/website/types.js +6 -0
- package/dist/src/detectors/website/types.js.map +1 -0
- package/dist/src/engine/analyzer.d.ts +87 -0
- package/dist/src/engine/analyzer.d.ts.map +1 -0
- package/dist/src/engine/analyzer.js +427 -0
- package/dist/src/engine/analyzer.js.map +1 -0
- package/dist/src/engine/cache.d.ts +80 -0
- package/dist/src/engine/cache.d.ts.map +1 -0
- package/dist/src/engine/cache.js +167 -0
- package/dist/src/engine/cache.js.map +1 -0
- package/dist/src/engine/index.d.ts +11 -0
- package/dist/src/engine/index.d.ts.map +1 -0
- package/dist/src/engine/index.js +11 -0
- package/dist/src/engine/index.js.map +1 -0
- package/dist/src/engine/llm-client.d.ts +210 -0
- package/dist/src/engine/llm-client.d.ts.map +1 -0
- package/dist/src/engine/llm-client.js +506 -0
- package/dist/src/engine/llm-client.js.map +1 -0
- package/dist/src/engine/types.d.ts +163 -0
- package/dist/src/engine/types.d.ts.map +1 -0
- package/dist/src/engine/types.js +21 -0
- package/dist/src/engine/types.js.map +1 -0
- package/dist/src/feedback/index.d.ts +9 -0
- package/dist/src/feedback/index.d.ts.map +1 -0
- package/dist/src/feedback/index.js +8 -0
- package/dist/src/feedback/index.js.map +1 -0
- package/dist/src/feedback/learner.d.ts +222 -0
- package/dist/src/feedback/learner.d.ts.map +1 -0
- package/dist/src/feedback/learner.js +401 -0
- package/dist/src/feedback/learner.js.map +1 -0
- package/dist/src/feedback/store.d.ts +113 -0
- package/dist/src/feedback/store.d.ts.map +1 -0
- package/dist/src/feedback/store.js +228 -0
- package/dist/src/feedback/store.js.map +1 -0
- package/dist/src/feedback/types.d.ts +126 -0
- package/dist/src/feedback/types.d.ts.map +1 -0
- package/dist/src/feedback/types.js +6 -0
- package/dist/src/feedback/types.js.map +1 -0
- package/dist/src/hooks/before-agent-start/handler.d.ts +37 -0
- package/dist/src/hooks/before-agent-start/handler.d.ts.map +1 -0
- package/dist/src/hooks/before-agent-start/handler.js +109 -0
- package/dist/src/hooks/before-agent-start/handler.js.map +1 -0
- package/dist/src/hooks/before-agent-start/index.d.ts +8 -0
- package/dist/src/hooks/before-agent-start/index.d.ts.map +1 -0
- package/dist/src/hooks/before-agent-start/index.js +7 -0
- package/dist/src/hooks/before-agent-start/index.js.map +1 -0
- package/dist/src/hooks/before-agent-start/prompts.d.ts +48 -0
- package/dist/src/hooks/before-agent-start/prompts.d.ts.map +1 -0
- package/dist/src/hooks/before-agent-start/prompts.js +103 -0
- package/dist/src/hooks/before-agent-start/prompts.js.map +1 -0
- package/dist/src/hooks/before-tool-call/handler.d.ts +42 -0
- package/dist/src/hooks/before-tool-call/handler.d.ts.map +1 -0
- package/dist/src/hooks/before-tool-call/handler.js +226 -0
- package/dist/src/hooks/before-tool-call/handler.js.map +1 -0
- package/dist/src/hooks/before-tool-call/index.d.ts +7 -0
- package/dist/src/hooks/before-tool-call/index.d.ts.map +1 -0
- package/dist/src/hooks/before-tool-call/index.js +6 -0
- package/dist/src/hooks/before-tool-call/index.js.map +1 -0
- package/dist/src/hooks/tool-result-persist/filter.d.ts +72 -0
- package/dist/src/hooks/tool-result-persist/filter.d.ts.map +1 -0
- package/dist/src/hooks/tool-result-persist/filter.js +305 -0
- package/dist/src/hooks/tool-result-persist/filter.js.map +1 -0
- package/dist/src/hooks/tool-result-persist/handler.d.ts +49 -0
- package/dist/src/hooks/tool-result-persist/handler.d.ts.map +1 -0
- package/dist/src/hooks/tool-result-persist/handler.js +217 -0
- package/dist/src/hooks/tool-result-persist/handler.js.map +1 -0
- package/dist/src/hooks/tool-result-persist/index.d.ts +11 -0
- package/dist/src/hooks/tool-result-persist/index.d.ts.map +1 -0
- package/dist/src/hooks/tool-result-persist/index.js +11 -0
- package/dist/src/hooks/tool-result-persist/index.js.map +1 -0
- package/dist/src/index.d.ts +256 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +222 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/notifications/discord.d.ts +10 -0
- package/dist/src/notifications/discord.d.ts.map +1 -0
- package/dist/src/notifications/discord.js +218 -0
- package/dist/src/notifications/discord.js.map +1 -0
- package/dist/src/notifications/index.d.ts +37 -0
- package/dist/src/notifications/index.d.ts.map +1 -0
- package/dist/src/notifications/index.js +68 -0
- package/dist/src/notifications/index.js.map +1 -0
- package/dist/src/notifications/slack.d.ts +10 -0
- package/dist/src/notifications/slack.d.ts.map +1 -0
- package/dist/src/notifications/slack.js +218 -0
- package/dist/src/notifications/slack.js.map +1 -0
- package/dist/src/notifications/telegram.d.ts +10 -0
- package/dist/src/notifications/telegram.d.ts.map +1 -0
- package/dist/src/notifications/telegram.js +242 -0
- package/dist/src/notifications/telegram.js.map +1 -0
- package/dist/src/notifications/types.d.ts +119 -0
- package/dist/src/notifications/types.d.ts.map +1 -0
- package/dist/src/notifications/types.js +6 -0
- package/dist/src/notifications/types.js.map +1 -0
- package/dist/src/proxy/index.d.ts +8 -0
- package/dist/src/proxy/index.d.ts.map +1 -0
- package/dist/src/proxy/index.js +9 -0
- package/dist/src/proxy/index.js.map +1 -0
- package/dist/src/proxy/middleware.d.ts +55 -0
- package/dist/src/proxy/middleware.d.ts.map +1 -0
- package/dist/src/proxy/middleware.js +215 -0
- package/dist/src/proxy/middleware.js.map +1 -0
- package/dist/src/proxy/server.d.ts +57 -0
- package/dist/src/proxy/server.d.ts.map +1 -0
- package/dist/src/proxy/server.js +298 -0
- package/dist/src/proxy/server.js.map +1 -0
- package/dist/src/proxy/types.d.ts +136 -0
- package/dist/src/proxy/types.d.ts.map +1 -0
- package/dist/src/proxy/types.js +6 -0
- package/dist/src/proxy/types.js.map +1 -0
- package/dist/src/sanitization/index.d.ts +10 -0
- package/dist/src/sanitization/index.d.ts.map +1 -0
- package/dist/src/sanitization/index.js +9 -0
- package/dist/src/sanitization/index.js.map +1 -0
- package/dist/src/sanitization/patterns.d.ts +51 -0
- package/dist/src/sanitization/patterns.d.ts.map +1 -0
- package/dist/src/sanitization/patterns.js +266 -0
- package/dist/src/sanitization/patterns.js.map +1 -0
- package/dist/src/sanitization/scanner.d.ts +29 -0
- package/dist/src/sanitization/scanner.d.ts.map +1 -0
- package/dist/src/sanitization/scanner.js +328 -0
- package/dist/src/sanitization/scanner.js.map +1 -0
- package/dist/src/sanitization/types.d.ts +57 -0
- package/dist/src/sanitization/types.d.ts.map +1 -0
- package/dist/src/sanitization/types.js +5 -0
- package/dist/src/sanitization/types.js.map +1 -0
- package/openclaw.plugin.json +114 -0
- package/package.json +63 -0
- package/rules/builtin/README.md +139 -0
- package/rules/builtin/ai-services.yaml +70 -0
- package/rules/builtin/api-keys.yaml +64 -0
- package/rules/builtin/authentication.yaml +56 -0
- package/rules/builtin/aws-security.yaml +57 -0
- package/rules/builtin/azure-security.yaml +58 -0
- package/rules/builtin/cicd-security.yaml +64 -0
- package/rules/builtin/cloud-storage.yaml +64 -0
- package/rules/builtin/container-registry.yaml +55 -0
- package/rules/builtin/crypto-wallets.yaml +71 -0
- package/rules/builtin/database-nosql.yaml +58 -0
- package/rules/builtin/database-sql.yaml +62 -0
- package/rules/builtin/development-env.yaml +67 -0
- package/rules/builtin/docker.yaml +57 -0
- package/rules/builtin/filesystem.yaml +71 -0
- package/rules/builtin/financial-pci.yaml +61 -0
- package/rules/builtin/gcp-security.yaml +57 -0
- package/rules/builtin/git-operations.yaml +68 -0
- package/rules/builtin/healthcare-hipaa.yaml +64 -0
- package/rules/builtin/kubernetes.yaml +60 -0
- package/rules/builtin/messaging-services.yaml +53 -0
- package/rules/builtin/minimal.yaml +47 -0
- package/rules/builtin/mobile-development.yaml +61 -0
- package/rules/builtin/monitoring.yaml +63 -0
- package/rules/builtin/network-security.yaml +57 -0
- package/rules/builtin/package-managers.yaml +74 -0
- package/rules/builtin/payment-processing.yaml +66 -0
- package/rules/builtin/pii-protection.yaml +48 -0
- package/rules/builtin/production-strict.yaml +55 -0
- package/rules/builtin/secrets-management.yaml +63 -0
- package/rules/builtin/serverless.yaml +74 -0
- package/rules/builtin/ssh-security.yaml +66 -0
- package/rules/builtin/terraform.yaml +51 -0
- package/rules/builtin/web-security.yaml +62 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Detector
|
|
3
|
+
* Detects tokens including JWTs, Bearer tokens, and session tokens
|
|
4
|
+
*/
|
|
5
|
+
import type { SecretsDetectionResult, SecretSubDetector, TokenMatch } from './types.js';
|
|
6
|
+
import type { Severity } from '../../config/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Validate JWT structure
|
|
9
|
+
* Returns true if the token appears to be a valid JWT
|
|
10
|
+
*/
|
|
11
|
+
export declare function isValidJwtStructure(token: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Match JWTs in text
|
|
14
|
+
*/
|
|
15
|
+
export declare function matchJwt(text: string): TokenMatch[];
|
|
16
|
+
/**
|
|
17
|
+
* Match Bearer tokens in text
|
|
18
|
+
*/
|
|
19
|
+
export declare function matchBearerToken(text: string): TokenMatch[];
|
|
20
|
+
/**
|
|
21
|
+
* Match session tokens in text
|
|
22
|
+
*/
|
|
23
|
+
export declare function matchSessionToken(text: string): TokenMatch[];
|
|
24
|
+
/**
|
|
25
|
+
* Match refresh tokens in text
|
|
26
|
+
*/
|
|
27
|
+
export declare function matchRefreshToken(text: string): TokenMatch[];
|
|
28
|
+
/**
|
|
29
|
+
* Match generic access tokens in text
|
|
30
|
+
*/
|
|
31
|
+
export declare function matchAccessToken(text: string): TokenMatch[];
|
|
32
|
+
/**
|
|
33
|
+
* Match all token types in text
|
|
34
|
+
*/
|
|
35
|
+
export declare function matchTokens(text: string): TokenMatch[];
|
|
36
|
+
/**
|
|
37
|
+
* Token Detector class
|
|
38
|
+
*/
|
|
39
|
+
export declare class TokenDetector implements SecretSubDetector {
|
|
40
|
+
private severity;
|
|
41
|
+
constructor(severity: Severity);
|
|
42
|
+
/**
|
|
43
|
+
* Scan text for tokens
|
|
44
|
+
*/
|
|
45
|
+
scan(text: string, location: string): SecretsDetectionResult[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a token detector
|
|
49
|
+
*/
|
|
50
|
+
export declare function createTokenDetector(severity: Severity): TokenDetector;
|
|
51
|
+
//# sourceMappingURL=token-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-detector.d.ts","sourceRoot":"","sources":["../../../../src/detectors/secrets/token-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAuCtD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAwB1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAmBnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAuB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAuB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA0B3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAUtD;AAED;;GAEG;AACH,qBAAa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,QAAQ;IAI9B;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,EAAE;CAiB/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAErE"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Detector
|
|
3
|
+
* Detects tokens including JWTs, Bearer tokens, and session tokens
|
|
4
|
+
*/
|
|
5
|
+
import { redactValue } from './api-key-detector.js';
|
|
6
|
+
/**
|
|
7
|
+
* JWT pattern - three base64url-encoded parts separated by dots
|
|
8
|
+
* Header starts with eyJ (base64 for '{"')
|
|
9
|
+
*/
|
|
10
|
+
const JWT_PATTERN = /\beyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\b/g;
|
|
11
|
+
/**
|
|
12
|
+
* Bearer token pattern in Authorization header
|
|
13
|
+
*/
|
|
14
|
+
const BEARER_PATTERN = /\b(?:Bearer|bearer|BEARER)\s+([A-Za-z0-9_.-]+)\b/g;
|
|
15
|
+
/**
|
|
16
|
+
* Session token patterns
|
|
17
|
+
*/
|
|
18
|
+
const SESSION_PATTERNS = [
|
|
19
|
+
/\bsession_[A-Za-z0-9_-]{20,}\b/g,
|
|
20
|
+
/\bsess_[A-Za-z0-9_-]{20,}\b/g,
|
|
21
|
+
/\bsid[_-][A-Za-z0-9_-]{20,}\b/gi,
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Refresh token patterns
|
|
25
|
+
*/
|
|
26
|
+
const REFRESH_PATTERNS = [
|
|
27
|
+
/\brefresh_[A-Za-z0-9_-]{20,}\b/g,
|
|
28
|
+
/\brt_[A-Za-z0-9_-]{20,}\b/g,
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Access token patterns (generic)
|
|
32
|
+
*/
|
|
33
|
+
const ACCESS_TOKEN_PATTERNS = [
|
|
34
|
+
/\baccess_token[_=:]["']?([A-Za-z0-9_.-]{20,})["']?/gi,
|
|
35
|
+
/\btoken[_=:]["']?([A-Za-z0-9_.-]{32,})["']?/gi,
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Validate JWT structure
|
|
39
|
+
* Returns true if the token appears to be a valid JWT
|
|
40
|
+
*/
|
|
41
|
+
export function isValidJwtStructure(token) {
|
|
42
|
+
const parts = token.split('.');
|
|
43
|
+
if (parts.length !== 3)
|
|
44
|
+
return false;
|
|
45
|
+
// Each part should be base64url encoded
|
|
46
|
+
const base64UrlRegex = /^[A-Za-z0-9_-]+$/;
|
|
47
|
+
if (!parts.every(part => base64UrlRegex.test(part)))
|
|
48
|
+
return false;
|
|
49
|
+
// Try to decode and parse the header
|
|
50
|
+
try {
|
|
51
|
+
const header = JSON.parse(atob(parts[0].replace(/-/g, '+').replace(/_/g, '/')));
|
|
52
|
+
// JWT headers typically have 'alg' and optionally 'typ'
|
|
53
|
+
if (!header.alg)
|
|
54
|
+
return false;
|
|
55
|
+
// Try to decode the payload (should be valid JSON)
|
|
56
|
+
const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));
|
|
57
|
+
// Payload should be an object
|
|
58
|
+
if (typeof payload !== 'object' || payload === null)
|
|
59
|
+
return false;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// If we can't parse it, it's likely not a valid JWT
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Match JWTs in text
|
|
69
|
+
*/
|
|
70
|
+
export function matchJwt(text) {
|
|
71
|
+
const matches = [];
|
|
72
|
+
const regex = new RegExp(JWT_PATTERN.source, JWT_PATTERN.flags);
|
|
73
|
+
let match;
|
|
74
|
+
while ((match = regex.exec(text)) !== null) {
|
|
75
|
+
const value = match[0];
|
|
76
|
+
const isValid = isValidJwtStructure(value);
|
|
77
|
+
matches.push({
|
|
78
|
+
matched: true,
|
|
79
|
+
tokenType: 'jwt',
|
|
80
|
+
value,
|
|
81
|
+
redactedValue: redactValue(value, 10, 6),
|
|
82
|
+
confidence: isValid ? 0.95 : 0.70,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return matches;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Match Bearer tokens in text
|
|
89
|
+
*/
|
|
90
|
+
export function matchBearerToken(text) {
|
|
91
|
+
const matches = [];
|
|
92
|
+
const regex = new RegExp(BEARER_PATTERN.source, BEARER_PATTERN.flags);
|
|
93
|
+
let match;
|
|
94
|
+
while ((match = regex.exec(text)) !== null) {
|
|
95
|
+
const value = match[1] || match[0];
|
|
96
|
+
// Skip if it looks like a JWT (will be caught by JWT detector)
|
|
97
|
+
if (value.startsWith('eyJ'))
|
|
98
|
+
continue;
|
|
99
|
+
matches.push({
|
|
100
|
+
matched: true,
|
|
101
|
+
tokenType: 'bearer',
|
|
102
|
+
value,
|
|
103
|
+
redactedValue: redactValue(value),
|
|
104
|
+
confidence: 0.85,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return matches;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Match session tokens in text
|
|
111
|
+
*/
|
|
112
|
+
export function matchSessionToken(text) {
|
|
113
|
+
const matches = [];
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
for (const pattern of SESSION_PATTERNS) {
|
|
116
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
117
|
+
let match;
|
|
118
|
+
while ((match = regex.exec(text)) !== null) {
|
|
119
|
+
const value = match[0];
|
|
120
|
+
if (seen.has(value))
|
|
121
|
+
continue;
|
|
122
|
+
seen.add(value);
|
|
123
|
+
matches.push({
|
|
124
|
+
matched: true,
|
|
125
|
+
tokenType: 'session',
|
|
126
|
+
value,
|
|
127
|
+
redactedValue: redactValue(value),
|
|
128
|
+
confidence: 0.85,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return matches;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Match refresh tokens in text
|
|
136
|
+
*/
|
|
137
|
+
export function matchRefreshToken(text) {
|
|
138
|
+
const matches = [];
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
for (const pattern of REFRESH_PATTERNS) {
|
|
141
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
142
|
+
let match;
|
|
143
|
+
while ((match = regex.exec(text)) !== null) {
|
|
144
|
+
const value = match[0];
|
|
145
|
+
if (seen.has(value))
|
|
146
|
+
continue;
|
|
147
|
+
seen.add(value);
|
|
148
|
+
matches.push({
|
|
149
|
+
matched: true,
|
|
150
|
+
tokenType: 'refresh',
|
|
151
|
+
value,
|
|
152
|
+
redactedValue: redactValue(value),
|
|
153
|
+
confidence: 0.85,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return matches;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Match generic access tokens in text
|
|
161
|
+
*/
|
|
162
|
+
export function matchAccessToken(text) {
|
|
163
|
+
const matches = [];
|
|
164
|
+
const seen = new Set();
|
|
165
|
+
for (const pattern of ACCESS_TOKEN_PATTERNS) {
|
|
166
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
167
|
+
let match;
|
|
168
|
+
while ((match = regex.exec(text)) !== null) {
|
|
169
|
+
const value = match[1] || match[0];
|
|
170
|
+
if (seen.has(value))
|
|
171
|
+
continue;
|
|
172
|
+
seen.add(value);
|
|
173
|
+
// Skip if it looks like a JWT
|
|
174
|
+
if (value.startsWith('eyJ'))
|
|
175
|
+
continue;
|
|
176
|
+
matches.push({
|
|
177
|
+
matched: true,
|
|
178
|
+
tokenType: 'bearer', // Treat generic access tokens as bearer-like
|
|
179
|
+
value,
|
|
180
|
+
redactedValue: redactValue(value),
|
|
181
|
+
confidence: 0.70,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return matches;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Match all token types in text
|
|
189
|
+
*/
|
|
190
|
+
export function matchTokens(text) {
|
|
191
|
+
const allMatches = [];
|
|
192
|
+
allMatches.push(...matchJwt(text));
|
|
193
|
+
allMatches.push(...matchBearerToken(text));
|
|
194
|
+
allMatches.push(...matchSessionToken(text));
|
|
195
|
+
allMatches.push(...matchRefreshToken(text));
|
|
196
|
+
allMatches.push(...matchAccessToken(text));
|
|
197
|
+
return allMatches;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Token Detector class
|
|
201
|
+
*/
|
|
202
|
+
export class TokenDetector {
|
|
203
|
+
severity;
|
|
204
|
+
constructor(severity) {
|
|
205
|
+
this.severity = severity;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Scan text for tokens
|
|
209
|
+
*/
|
|
210
|
+
scan(text, location) {
|
|
211
|
+
const matches = matchTokens(text);
|
|
212
|
+
return matches.map((match) => ({
|
|
213
|
+
detected: true,
|
|
214
|
+
category: 'secrets',
|
|
215
|
+
severity: this.severity,
|
|
216
|
+
confidence: match.confidence,
|
|
217
|
+
reason: `Detected ${match.tokenType.toUpperCase()} token`,
|
|
218
|
+
metadata: {
|
|
219
|
+
type: 'token',
|
|
220
|
+
subtype: match.tokenType,
|
|
221
|
+
redactedValue: match.redactedValue,
|
|
222
|
+
location,
|
|
223
|
+
},
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Create a token detector
|
|
229
|
+
*/
|
|
230
|
+
export function createTokenDetector(severity) {
|
|
231
|
+
return new TokenDetector(severity);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=token-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-detector.js","sourceRoot":"","sources":["../../../../src/detectors/secrets/token-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets Detector Types
|
|
3
|
+
* Type definitions for detecting secrets, tokens, and PII
|
|
4
|
+
*/
|
|
5
|
+
import type { Severity, Action } from '../../config/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Detection context passed to detectors
|
|
8
|
+
*/
|
|
9
|
+
export interface SecretsDetectionContext {
|
|
10
|
+
/** Name of the tool being invoked */
|
|
11
|
+
toolName: string;
|
|
12
|
+
/** Input parameters to the tool */
|
|
13
|
+
toolInput: Record<string, unknown>;
|
|
14
|
+
/** Output from the tool (if scanning output) */
|
|
15
|
+
toolOutput?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Type of secret detected
|
|
19
|
+
*/
|
|
20
|
+
export type SecretType = 'api-key' | 'token' | 'credential' | 'pii';
|
|
21
|
+
/**
|
|
22
|
+
* Provider of the detected API key
|
|
23
|
+
*/
|
|
24
|
+
export type ApiKeyProvider = 'openai' | 'aws' | 'github' | 'stripe' | 'slack' | 'google' | 'anthropic' | 'generic';
|
|
25
|
+
/**
|
|
26
|
+
* Type of token detected
|
|
27
|
+
*/
|
|
28
|
+
export type TokenType = 'jwt' | 'bearer' | 'session' | 'refresh';
|
|
29
|
+
/**
|
|
30
|
+
* Type of PII detected
|
|
31
|
+
*/
|
|
32
|
+
export type PiiType = 'ssn' | 'credit-card' | 'email';
|
|
33
|
+
/**
|
|
34
|
+
* Result of a secrets detection
|
|
35
|
+
*/
|
|
36
|
+
export interface SecretsDetectionResult {
|
|
37
|
+
/** Whether a secret was detected */
|
|
38
|
+
detected: boolean;
|
|
39
|
+
/** Category of the detection */
|
|
40
|
+
category: 'secrets';
|
|
41
|
+
/** Severity level of the detection */
|
|
42
|
+
severity: Severity;
|
|
43
|
+
/** Confidence score from 0 to 1 */
|
|
44
|
+
confidence: number;
|
|
45
|
+
/** Human-readable reason for the detection */
|
|
46
|
+
reason: string;
|
|
47
|
+
/** Additional metadata about the detection */
|
|
48
|
+
metadata?: {
|
|
49
|
+
/** Type of secret detected */
|
|
50
|
+
type: SecretType;
|
|
51
|
+
/** Provider for API keys */
|
|
52
|
+
provider?: string;
|
|
53
|
+
/** Redacted value showing first/last few chars with *** */
|
|
54
|
+
redactedValue?: string;
|
|
55
|
+
/** Where the secret was found (input/output, field name) */
|
|
56
|
+
location?: string;
|
|
57
|
+
/** Specific subtype (jwt, ssn, etc.) */
|
|
58
|
+
subtype?: string;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Configuration for the secrets detector
|
|
63
|
+
*/
|
|
64
|
+
export interface SecretsDetectorConfig {
|
|
65
|
+
/** Whether the detector is enabled */
|
|
66
|
+
enabled: boolean;
|
|
67
|
+
/** Severity level to assign to detections */
|
|
68
|
+
severity: Severity;
|
|
69
|
+
/** Action to take when secret is detected */
|
|
70
|
+
action: Action;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Interface for the main secrets detector
|
|
74
|
+
*/
|
|
75
|
+
export interface SecretsDetector {
|
|
76
|
+
/**
|
|
77
|
+
* Detect secrets in the given context
|
|
78
|
+
* @param context Detection context with tool information
|
|
79
|
+
* @returns Detection result (may contain multiple matches)
|
|
80
|
+
*/
|
|
81
|
+
detect(context: SecretsDetectionContext): Promise<SecretsDetectionResult>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Interface for sub-detectors (api-key, token, pii)
|
|
85
|
+
*/
|
|
86
|
+
export interface SecretSubDetector {
|
|
87
|
+
/**
|
|
88
|
+
* Scan text for secrets
|
|
89
|
+
* @param text Text to scan
|
|
90
|
+
* @param location Description of where the text came from
|
|
91
|
+
* @returns Array of detection results
|
|
92
|
+
*/
|
|
93
|
+
scan(text: string, location: string): SecretsDetectionResult[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* API key match result
|
|
97
|
+
*/
|
|
98
|
+
export interface ApiKeyMatch {
|
|
99
|
+
/** Whether a match was found */
|
|
100
|
+
matched: boolean;
|
|
101
|
+
/** The provider of the API key */
|
|
102
|
+
provider: ApiKeyProvider;
|
|
103
|
+
/** The original matched value */
|
|
104
|
+
value: string;
|
|
105
|
+
/** Redacted value for safe display */
|
|
106
|
+
redactedValue: string;
|
|
107
|
+
/** Confidence score */
|
|
108
|
+
confidence: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Token match result
|
|
112
|
+
*/
|
|
113
|
+
export interface TokenMatch {
|
|
114
|
+
/** Whether a match was found */
|
|
115
|
+
matched: boolean;
|
|
116
|
+
/** Type of token */
|
|
117
|
+
tokenType: TokenType;
|
|
118
|
+
/** The original matched value */
|
|
119
|
+
value: string;
|
|
120
|
+
/** Redacted value for safe display */
|
|
121
|
+
redactedValue: string;
|
|
122
|
+
/** Confidence score */
|
|
123
|
+
confidence: number;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* PII match result
|
|
127
|
+
*/
|
|
128
|
+
export interface PiiMatch {
|
|
129
|
+
/** Whether a match was found */
|
|
130
|
+
matched: boolean;
|
|
131
|
+
/** Type of PII */
|
|
132
|
+
piiType: PiiType;
|
|
133
|
+
/** The original matched value */
|
|
134
|
+
value: string;
|
|
135
|
+
/** Redacted value for safe display */
|
|
136
|
+
redactedValue: string;
|
|
137
|
+
/** Confidence score */
|
|
138
|
+
confidence: number;
|
|
139
|
+
/** Whether Luhn validation passed (for credit cards) */
|
|
140
|
+
luhnValid?: boolean;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Credential match result
|
|
144
|
+
*/
|
|
145
|
+
export interface CredentialMatch {
|
|
146
|
+
/** Whether a match was found */
|
|
147
|
+
matched: boolean;
|
|
148
|
+
/** Type of credential pattern */
|
|
149
|
+
credentialType: string;
|
|
150
|
+
/** The matched value (usually key=value) */
|
|
151
|
+
value: string;
|
|
152
|
+
/** Redacted value */
|
|
153
|
+
redactedValue: string;
|
|
154
|
+
/** Confidence score */
|
|
155
|
+
confidence: number;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/detectors/secrets/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/detectors/secrets/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category Detector
|
|
3
|
+
* Detects website categories like malware, phishing, gambling, adult content
|
|
4
|
+
*/
|
|
5
|
+
import type { CategoryDetectionResult, WebsiteCategory } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Detect website category based on domain patterns
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectCategory(domain: string): CategoryDetectionResult;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a category is considered dangerous (malware, phishing)
|
|
12
|
+
*/
|
|
13
|
+
export declare function isDangerousCategory(category: WebsiteCategory): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a category is considered optional/warning-only (gambling, adult)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isWarningCategory(category: WebsiteCategory): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Get severity description for a category
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCategorySeverityDescription(category: WebsiteCategory): string;
|
|
22
|
+
//# sourceMappingURL=category-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-detector.d.ts","sourceRoot":"","sources":["../../../../src/detectors/website/category-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA0H3E;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAoBtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAahF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category Detector
|
|
3
|
+
* Detects website categories like malware, phishing, gambling, adult content
|
|
4
|
+
*/
|
|
5
|
+
import { matchesGlobPattern } from './pattern-matcher.js';
|
|
6
|
+
/**
|
|
7
|
+
* Known malware domain patterns
|
|
8
|
+
* These patterns match domains commonly associated with malware distribution
|
|
9
|
+
*/
|
|
10
|
+
const MALWARE_PATTERNS = [
|
|
11
|
+
// Common malware domain patterns
|
|
12
|
+
'*.malware.*',
|
|
13
|
+
'*.virus.*',
|
|
14
|
+
'*.trojan.*',
|
|
15
|
+
'*.exploit.*',
|
|
16
|
+
'malware-*.*',
|
|
17
|
+
'*-malware.*',
|
|
18
|
+
'*.malicious.*',
|
|
19
|
+
// Suspicious TLDs often used for malware
|
|
20
|
+
'*.xyz',
|
|
21
|
+
'*.tk',
|
|
22
|
+
'*.ml',
|
|
23
|
+
'*.ga',
|
|
24
|
+
'*.cf',
|
|
25
|
+
'*.gq',
|
|
26
|
+
// Download/crack sites (common malware vectors)
|
|
27
|
+
'*crack*.*',
|
|
28
|
+
'*keygen*.*',
|
|
29
|
+
'*warez*.*',
|
|
30
|
+
'*pirat*.*',
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Known phishing domain patterns
|
|
34
|
+
* These patterns match domains commonly used for phishing attacks
|
|
35
|
+
*/
|
|
36
|
+
const PHISHING_PATTERNS = [
|
|
37
|
+
// Phishing keyword patterns
|
|
38
|
+
'phishing-*.*',
|
|
39
|
+
'*-phishing.*',
|
|
40
|
+
'*.phishing.*',
|
|
41
|
+
// Common phishing techniques
|
|
42
|
+
'*login-secure*.*',
|
|
43
|
+
'*secure-login*.*',
|
|
44
|
+
'*account-verify*.*',
|
|
45
|
+
'*verify-account*.*',
|
|
46
|
+
'*update-payment*.*',
|
|
47
|
+
'*payment-update*.*',
|
|
48
|
+
'*confirm-identity*.*',
|
|
49
|
+
'*identity-confirm*.*',
|
|
50
|
+
// Lookalike domain patterns (suspicious)
|
|
51
|
+
'*-signin.*',
|
|
52
|
+
'*signin-*.*',
|
|
53
|
+
'*-login.*',
|
|
54
|
+
'*login-*.*',
|
|
55
|
+
'*paypa1*.*', // Paypal with 1 instead of l
|
|
56
|
+
'*g00gle*.*', // Google with 0 instead of o
|
|
57
|
+
'*amaz0n*.*', // Amazon with 0 instead of o
|
|
58
|
+
'*faceb00k*.*', // Facebook with 0 instead of o
|
|
59
|
+
'*micros0ft*.*', // Microsoft with 0 instead of o
|
|
60
|
+
'*app1e*.*', // Apple with 1 instead of l
|
|
61
|
+
// Urgent action domains
|
|
62
|
+
'*urgent-*.*',
|
|
63
|
+
'*-urgent.*',
|
|
64
|
+
'*suspended-*.*',
|
|
65
|
+
'*-suspended.*',
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* Gambling domain patterns
|
|
69
|
+
*/
|
|
70
|
+
const GAMBLING_PATTERNS = [
|
|
71
|
+
'*.casino.*',
|
|
72
|
+
'*.bet.*',
|
|
73
|
+
'*.poker.*',
|
|
74
|
+
'*.slots.*',
|
|
75
|
+
'*.gambling.*',
|
|
76
|
+
'*casino*.*',
|
|
77
|
+
'*betting*.*',
|
|
78
|
+
'*poker*.*',
|
|
79
|
+
'*blackjack*.*',
|
|
80
|
+
'*roulette*.*',
|
|
81
|
+
'*lottery*.*',
|
|
82
|
+
'*jackpot*.*',
|
|
83
|
+
'*.888casino.*',
|
|
84
|
+
'*.bet365.*',
|
|
85
|
+
'*.pokerstars.*',
|
|
86
|
+
'*.draftkings.*',
|
|
87
|
+
'*.fanduel.*',
|
|
88
|
+
];
|
|
89
|
+
/**
|
|
90
|
+
* Adult content domain patterns
|
|
91
|
+
*/
|
|
92
|
+
const ADULT_PATTERNS = [
|
|
93
|
+
'*.adult.*',
|
|
94
|
+
'*.xxx.*',
|
|
95
|
+
'*.porn*.*',
|
|
96
|
+
'*porn*.*',
|
|
97
|
+
'*.sex.*',
|
|
98
|
+
'*adult*.*',
|
|
99
|
+
'*.nsfw.*',
|
|
100
|
+
'*nsfw*.*',
|
|
101
|
+
];
|
|
102
|
+
/**
|
|
103
|
+
* Category patterns with their severity
|
|
104
|
+
*/
|
|
105
|
+
const CATEGORY_PATTERNS = [
|
|
106
|
+
{ category: 'malware', patterns: MALWARE_PATTERNS, defaultConfidence: 0.85 },
|
|
107
|
+
{ category: 'phishing', patterns: PHISHING_PATTERNS, defaultConfidence: 0.80 },
|
|
108
|
+
{ category: 'gambling', patterns: GAMBLING_PATTERNS, defaultConfidence: 0.90 },
|
|
109
|
+
{ category: 'adult', patterns: ADULT_PATTERNS, defaultConfidence: 0.90 },
|
|
110
|
+
];
|
|
111
|
+
/**
|
|
112
|
+
* Detect website category based on domain patterns
|
|
113
|
+
*/
|
|
114
|
+
export function detectCategory(domain) {
|
|
115
|
+
const domainLower = domain.toLowerCase();
|
|
116
|
+
for (const { category, patterns, defaultConfidence } of CATEGORY_PATTERNS) {
|
|
117
|
+
for (const pattern of patterns) {
|
|
118
|
+
if (matchesGlobPattern(domainLower, pattern)) {
|
|
119
|
+
return {
|
|
120
|
+
detected: true,
|
|
121
|
+
category,
|
|
122
|
+
matchedPattern: pattern,
|
|
123
|
+
confidence: defaultConfidence,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
detected: false,
|
|
130
|
+
confidence: 0,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if a category is considered dangerous (malware, phishing)
|
|
135
|
+
*/
|
|
136
|
+
export function isDangerousCategory(category) {
|
|
137
|
+
return category === 'malware' || category === 'phishing';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if a category is considered optional/warning-only (gambling, adult)
|
|
141
|
+
*/
|
|
142
|
+
export function isWarningCategory(category) {
|
|
143
|
+
return category === 'gambling' || category === 'adult';
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get severity description for a category
|
|
147
|
+
*/
|
|
148
|
+
export function getCategorySeverityDescription(category) {
|
|
149
|
+
switch (category) {
|
|
150
|
+
case 'malware':
|
|
151
|
+
return 'potential malware distribution site';
|
|
152
|
+
case 'phishing':
|
|
153
|
+
return 'potential phishing site';
|
|
154
|
+
case 'gambling':
|
|
155
|
+
return 'gambling website';
|
|
156
|
+
case 'adult':
|
|
157
|
+
return 'adult content website';
|
|
158
|
+
default:
|
|
159
|
+
return 'unknown category';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=category-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"category-detector.js","sourceRoot":"","sources":["../../../../src/detectors/website/category-detector.ts"],"names":[],"mappings":"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"}
|