@slicedearth/whoisleuth-cli 2.4.0 → 2.5.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/NOTICE +2 -2
- package/cli/argument-values.mjs +55 -0
- package/cli/arguments.mjs +24 -470
- package/cli/artifact-validation/case-response.mjs +21 -6
- package/cli/artifact-validation/lookup-evidence.mjs +3 -3
- package/cli/artifact-validation/signed-review.mjs +59 -13
- package/cli/artifact-verify.mjs +2 -0
- package/cli/assurance-arguments.mjs +56 -0
- package/cli/assurance-command-definitions.mjs +179 -0
- package/cli/assurance-command-runner.mjs +1 -1
- package/cli/bounded-json.mjs +1 -1
- package/cli/bulk-checkpoint.mjs +1 -1
- package/cli/bulk-command-runner.mjs +2 -2
- package/cli/bulk.mjs +2 -3
- package/cli/case-command.mjs +20 -3
- package/cli/case-pack.mjs +12 -2
- package/cli/ci-report.mjs +6 -3
- package/cli/collection-arguments.mjs +123 -0
- package/cli/collection-command-definitions.mjs +330 -0
- package/cli/collection-preflight.mjs +8 -1
- package/cli/command-argument-grammar.mjs +8 -210
- package/cli/command-definition.mjs +329 -0
- package/cli/command-reference.mjs +55 -1388
- package/cli/command-seeds.mjs +18 -0
- package/cli/compare.mjs +1 -1
- package/cli/config-profile.mjs +1 -1
- package/cli/ct-event-intake.mjs +4 -4
- package/cli/discover.mjs +2 -2
- package/cli/discovery-observation-snapshot.mjs +2 -2
- package/cli/discovery-scan-command-runner.mjs +3 -3
- package/cli/discovery-scan.mjs +1 -1
- package/cli/discovery-snapshot.mjs +2 -2
- package/cli/discovery-workflow.mjs +4 -4
- package/cli/domain-control-monitor.mjs +6 -6
- package/cli/domain-control-observations.mjs +2 -1
- package/cli/errors.mjs +5 -6
- package/cli/evidence-arguments.mjs +46 -0
- package/cli/evidence-command-definitions.mjs +69 -0
- package/cli/evidence-command-runner.mjs +2 -3
- package/cli/evidence-signing.mjs +3 -2
- package/cli/external-observation-mapping.mjs +2 -2
- package/cli/formatters/terminal-command-formats.mjs +6 -0
- package/cli/formatters/terminal-lookup.mjs +6 -0
- package/cli/history-arguments.mjs +39 -0
- package/cli/history-command-definitions.mjs +88 -0
- package/cli/indicator-set-command.mjs +33 -0
- package/cli/inline-command-families.mjs +6 -47
- package/cli/inline-command-runner.mjs +4 -31
- package/cli/input.mjs +2 -2
- package/cli/intake-command.mjs +107 -0
- package/cli/interchange-report.mjs +4 -2
- package/cli/investigation-artifacts.mjs +1 -1
- package/cli/investigation-plan.mjs +32 -154
- package/cli/investigation-recipes.mjs +177 -0
- package/cli/investigation-run.mjs +78 -12
- package/cli/local-mmdb-review.mjs +197 -17
- package/cli/lookalike-calibration.mjs +1 -1
- package/cli/lookup-brief.mjs +2 -2
- package/cli/lookup-command-runner.mjs +18 -35
- package/cli/lookup-diff.mjs +10 -9
- package/cli/lookup-plan.mjs +10 -14
- package/cli/lookup-reconcile.mjs +6 -5
- package/cli/lookup-timeline.mjs +7 -6
- package/cli/mail-header-review.mjs +24 -247
- package/cli/mail-review.mjs +9 -7
- package/cli/network-arguments.mjs +51 -0
- package/cli/network-command-definitions.mjs +130 -0
- package/cli/network-command-runner.mjs +43 -31
- package/cli/offline-evidence-review.mjs +39 -6
- package/cli/posture.mjs +1 -1
- package/cli/registry-fixture-scaffold.mjs +1 -1
- package/cli/retained-artifact-diff.mjs +8 -7
- package/cli/review-arguments.mjs +131 -0
- package/cli/review-command-definitions.mjs +273 -0
- package/cli/review-command-runner.mjs +68 -158
- package/cli/risk-calibration.mjs +8 -8
- package/cli/runner.mjs +20 -32
- package/cli/saved-lookup.mjs +2 -2
- package/cli/selected-input-worker.mjs +63 -0
- package/cli/sharing-review.mjs +5 -64
- package/cli/source-reliability.mjs +2 -2
- package/cli/support-arguments.mjs +49 -0
- package/cli/support-command-definitions.mjs +209 -0
- package/cli/support-command-runner.mjs +2 -2
- package/cli/workflow-arguments.mjs +86 -0
- package/cli/workflow-command-definitions.mjs +78 -0
- package/cli/workflow-command-runner.mjs +8 -1
- package/docs/cli-reference.md +27 -0
- package/docs/cli.md +223 -2
- package/docs/contextual-reviews.md +155 -0
- package/lib/analyst-taxonomy.mjs +2 -40
- package/lib/application-version.mjs +1 -1
- package/lib/availability.mjs +13 -789
- package/lib/bounded-contract-normalizers.mjs +4 -0
- package/lib/bounded-json.mjs +2 -330
- package/lib/browser-library-profile.mjs +62 -84
- package/lib/candidate-provenance-bounds.mjs +2 -0
- package/lib/classify.mjs +1 -1
- package/lib/ct-query.mjs +2 -27
- package/lib/ct-response-bounds.mjs +2 -9
- package/lib/ct-search.mjs +83 -47
- package/lib/dmarc-discovery.mjs +62 -0
- package/lib/dns-convergence-review.mjs +21 -8
- package/lib/dns-delegation-health.mjs +12 -8
- package/lib/dns-inheritance-review.mjs +53 -63
- package/lib/dns-intelligence.mjs +9 -7
- package/lib/dns-query-coverage.mjs +40 -0
- package/lib/domain-assurance.mjs +1 -1
- package/lib/domain-change-packet.mjs +12 -13
- package/lib/domain-change-review.mjs +32 -14
- package/lib/domain-control-flight-recorder.mjs +103 -27
- package/lib/domain-control-manifest.mjs +25 -17
- package/lib/domain-posture-analysis.mjs +22 -5
- package/lib/domain-posture.mjs +16 -15
- package/lib/domain-registration.mjs +392 -0
- package/lib/evidence-export-privacy.mjs +22 -15
- package/lib/evidence-export.mjs +3 -3
- package/lib/evidence-report.mjs +4 -1
- package/lib/external-intelligence-risk.mjs +2 -124
- package/lib/generated/cisa-kev-catalog.mjs +41 -3
- package/lib/generated/registrar-standing-catalogue.mjs +18 -10
- package/lib/generated/retire-browser-catalog.mjs +332 -19
- package/lib/generated/{unicode-confusables-17.mjs → unicode-confusables.mjs} +33 -33
- package/lib/html-signals.mjs +7 -2
- package/lib/http-evidence-bounds.mjs +2 -8
- package/lib/http-intelligence.mjs +13 -1
- package/lib/idn-confusable-policy.mjs +6 -4
- package/lib/idn-confusables.mjs +1 -1
- package/lib/interchange-fidelity-registry.mjs +10 -0
- package/lib/lookup-contract-primitives.mjs +1 -1
- package/lib/lookup-diagnostics.mjs +1 -23
- package/lib/lookup-network-evidence-bounds.mjs +1 -10
- package/lib/lookup-progress.mjs +50 -1
- package/lib/lookup-response-contract.mjs +69 -40
- package/lib/lookup-response.mjs +5 -15
- package/lib/lookup-source-progress.mjs +8 -22
- package/lib/lookup.mjs +1 -1
- package/lib/opportunity-scoring.mjs +2 -107
- package/lib/outbound-identity.mjs +1 -1
- package/lib/page-fingerprints.mjs +18 -1
- package/lib/perceptual-hash-comparison.mjs +2 -34
- package/lib/perceptual-hash.mjs +36 -10
- package/lib/portable-generator.mjs +2 -29
- package/lib/project-metadata.mjs +2 -8
- package/lib/rdap-client.mjs +11 -7
- package/lib/registrable-domain.mjs +2 -56
- package/lib/registrar-standing-contract.mjs +1 -1
- package/lib/registrar-standing.mjs +9 -13
- package/lib/registry-capabilities.mjs +2 -2
- package/lib/registry-capability-catalogue.mjs +27 -19
- package/lib/risk-calibration-summary.mjs +2 -352
- package/lib/risk-scoring.mjs +2 -345
- package/lib/scoring-evidence-quality.mjs +2 -107
- package/lib/semantic-version.mjs +2 -54
- package/lib/service-binding-dns.mjs +27 -0
- package/lib/smtp-transport-review.mjs +48 -19
- package/lib/sslbl-certificates.generated.mjs +141 -139
- package/lib/static-html-analysis.mjs +1 -1
- package/lib/structured-data-identity.mjs +1 -1
- package/lib/threat-intelligence-manifests.mjs +1 -1
- package/lib/threat-intelligence-runtime.mjs +1 -1
- package/lib/threat-intelligence-targets.mjs +1 -1
- package/lib/threat-intelligence-types.mjs +2 -75
- package/lib/typosquat-generator.mjs +11 -2
- package/lib/website-enrichment.mjs +388 -0
- package/lib/whois-authority.mjs +43 -5
- package/lib/whois-normalization.mjs +3 -1
- package/lib/whois-parser.mjs +5 -3
- package/package.json +13 -14
- package/packages/analysis/analyst-taxonomy.mjs +40 -0
- package/packages/analysis/bounded-json.mjs +330 -0
- package/packages/analysis/candidate-provenance-bounds.mjs +4 -0
- package/packages/analysis/cli-argument-grammar.mjs +216 -0
- package/packages/analysis/ct-query.mjs +27 -0
- package/packages/analysis/ct-response-bounds.mjs +9 -0
- package/packages/analysis/external-intelligence-risk.mjs +124 -0
- package/packages/analysis/http-evidence-bounds.mjs +8 -0
- package/packages/analysis/lookup-network-evidence-bounds.mjs +10 -0
- package/packages/analysis/opportunity-scoring.mjs +107 -0
- package/packages/analysis/perceptual-hash-comparison.mjs +34 -0
- package/packages/analysis/portable-generator.mjs +29 -0
- package/packages/analysis/project-metadata.mjs +8 -0
- package/packages/analysis/registrable-domain.mjs +56 -0
- package/packages/analysis/risk-calibration-summary.mjs +352 -0
- package/packages/analysis/risk-scoring.mjs +345 -0
- package/packages/analysis/scoring-evidence-quality.mjs +107 -0
- package/packages/analysis/semantic-version.mjs +54 -0
- package/packages/analysis/threat-intelligence-types.mjs +75 -0
- package/packages/cases/case-evidence-links.mjs +135 -0
- package/packages/cases/case-evidence-model.mjs +78 -12
- package/packages/cases/case-evidence-quality.mjs +5 -0
- package/packages/cases/case-export-input.mjs +7 -5
- package/packages/cases/case-incident-context.mjs +52 -0
- package/packages/cases/case-markdown.mjs +11 -0
- package/packages/cases/case-migration-model.mjs +40 -24
- package/packages/cases/case-recheck-model.mjs +90 -32
- package/packages/cases/case-record-contracts.mjs +1 -1
- package/packages/cases/case-record-core.mjs +1 -1
- package/packages/cases/case-record-operations.mjs +40 -112
- package/packages/cases/case-record-projection.mjs +8 -1
- package/packages/cases/case-record-version-input.mjs +19 -0
- package/packages/cases/case-report.mjs +63 -27
- package/packages/cases/case-requested-evidence.mjs +146 -0
- package/packages/cases/case-response-actions.mjs +103 -1
- package/packages/cases/case-response-model.mjs +9 -1
- package/packages/cases/case-response-outcomes.mjs +29 -8
- package/packages/cases/case-response-packet-render.mjs +13 -9
- package/packages/cases/case-response-packet.mjs +25 -11
- package/packages/cases/case-response-records.mjs +0 -1
- package/packages/cases/case-response-review-inputs.mjs +14 -3
- package/packages/cases/case-storage-model.mjs +1 -1
- package/packages/cases/case-workflow-metadata.mjs +225 -0
- package/packages/cases/case-workflow-migration.mjs +43 -0
- package/packages/cases/http-summary.mjs +6 -1
- package/packages/comparison/favicon-similarity.mjs +1 -1
- package/packages/comparison/page-similarity.mjs +1 -1
- package/packages/comparison/relationship-evidence.mjs +21 -9
- package/packages/comparison/relationship-provenance.mjs +7 -1
- package/packages/contracts/analyst-interchange.mjs +28 -10
- package/packages/contracts/case-portability.mjs +118 -25
- package/packages/contracts/cli-command-semantics.mjs +2 -0
- package/packages/contracts/cli-grammar.mjs +6 -0
- package/packages/contracts/cli-lookup-brief.mjs +2 -0
- package/packages/contracts/context-review.mjs +24 -0
- package/packages/contracts/document-intake.mjs +11 -0
- package/packages/contracts/domain-control-flight-recorder.mjs +30 -14
- package/packages/contracts/domain-control-manifest.mjs +1 -1
- package/packages/contracts/domain-control-monitor.mjs +13 -2
- package/packages/contracts/domain-control-review.mjs +36 -15
- package/packages/contracts/har-review.mjs +2 -0
- package/packages/contracts/identity-events.mjs +4 -0
- package/packages/contracts/investigation-run.mjs +2 -0
- package/packages/contracts/ip-address.mjs +10 -0
- package/packages/contracts/mail-authentication.mjs +5 -0
- package/packages/contracts/message-intake.mjs +31 -0
- package/packages/contracts/offline-comparison.mjs +4 -1
- package/packages/contracts/passive-mail.mjs +10 -0
- package/packages/contracts/web-capture.mjs +2 -2
- package/packages/contracts/workspace-portability.mjs +63 -17
- package/packages/evidence/collection-quality.mjs +67 -0
- package/packages/evidence/dns-query-outcome.mjs +72 -0
- package/packages/evidence/email-recipient.mjs +18 -0
- package/packages/evidence/lookup-target.mjs +5 -1
- package/packages/evidence/observation.mjs +2 -0
- package/packages/evidence/png-pixels.mjs +117 -0
- package/packages/evidence/public-address-policy.mjs +83 -0
- package/packages/interchange/defensive-indicator-export.mjs +264 -0
- package/packages/interchange/external-findings-import.mjs +4 -12
- package/packages/interchange/managed-indicator-export.mjs +35 -0
- package/packages/interchange/managed-indicator-set.mjs +210 -0
- package/packages/interchange/misp-indicator-export.mjs +93 -0
- package/packages/interchange/sharing-policy.mjs +56 -0
- package/packages/interchange/stix-indicator-export.mjs +129 -0
- package/packages/interchange/web-capture-import.mjs +22 -15
- package/packages/investigation/acquisition-decision-packet.mjs +1 -1
- package/packages/investigation/bulk-mail-exposure.mjs +7 -13
- package/packages/investigation/capture-coverage.mjs +57 -0
- package/packages/investigation/connector-provenance-review.mjs +100 -0
- package/packages/investigation/context-review.mjs +35 -0
- package/packages/investigation/document-intake.mjs +81 -0
- package/packages/investigation/docx-intake.mjs +133 -0
- package/packages/investigation/domain-history-review.mjs +100 -0
- package/packages/investigation/domain-transition-review.mjs +47 -0
- package/packages/investigation/evidence-coverage-ledger.mjs +9 -1
- package/packages/investigation/har-intake.mjs +68 -0
- package/packages/investigation/identity-event-intake.mjs +131 -0
- package/packages/investigation/identity-incident-review.mjs +39 -0
- package/packages/investigation/incident-sequence-review.mjs +58 -0
- package/packages/investigation/intake-report.mjs +19 -0
- package/packages/investigation/investigation-manifest.mjs +2 -2
- package/packages/investigation/link-intake.mjs +179 -0
- package/packages/investigation/lookup-asset-graph.mjs +1 -1
- package/packages/investigation/mail-authentication-review.mjs +222 -0
- package/packages/investigation/mail-header-identity.mjs +209 -0
- package/packages/investigation/message-intake.mjs +195 -0
- package/packages/investigation/page-behaviour.mjs +113 -0
- package/packages/investigation/pdf-intake.mjs +155 -0
- package/packages/investigation/platform-continuity-review.mjs +60 -0
- package/packages/investigation/qr-intake.mjs +56 -0
- package/packages/investigation/requested-action-hints.mjs +11 -0
- package/packages/investigation/selected-input-review.mjs +17 -0
- package/packages/investigation/storefront-review.mjs +70 -0
- package/packages/workspace/brand-profile-model.mjs +2 -2
- package/packages/workspace/bulk-review-model.mjs +28 -26
- package/packages/workspace/bulk-session-model.mjs +23 -13
- package/packages/workspace/campaign-model.mjs +1 -1
- package/packages/workspace/detection-rule-model.mjs +1 -1
- package/packages/workspace/hostile-input.mjs +1 -1
- package/packages/workspace/investigation-guide.mjs +2 -2
- package/packages/workspace/investigation-template-model.mjs +26 -2
- package/packages/workspace/page-baseline.mjs +2 -2
- package/packages/workspace/relationship-observation-model.mjs +17 -13
- package/packages/workspace/shortlist-model.mjs +14 -5
- package/packages/workspace/watchlist-history.mjs +28 -12
- package/packages/workspace/watchlist-store.mjs +17 -5
- package/packages/workspace/website-snapshot-model.mjs +28 -3
- package/packages/workspace/workspace-archive-crypto.mjs +1 -1
- package/packages/workspace/workspace-archive.mjs +5 -4
- package/third-party-notices.txt +549 -16
- package/lib/hostname.mjs +0 -2
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Contextual evidence reviews
|
|
2
|
+
|
|
3
|
+
Cases → Evidence → **Specialist evidence reviews** offers incident-sequence, domain-history,
|
|
4
|
+
platform-object, storefront and connector reviews. Inputs stay in page memory until you
|
|
5
|
+
save or download. Saved reports use the existing Case attachment and evidence
|
|
6
|
+
summary controls; select the report file explicitly when preparing a response
|
|
7
|
+
packet. Switching tasks or Case sections preserves opened drafts; leaving the Case
|
|
8
|
+
discards them. Save the review in the Case, download its JSON, or print a summary.
|
|
9
|
+
Reusable inputs are a separate download. Storefront columns keep unreviewed fields
|
|
10
|
+
distinct from reviewed fields with no values; platform histories separate report
|
|
11
|
+
status, provider response and independent recheck. Sources and interpretation are
|
|
12
|
+
available beneath each review, with exact observation times and citation copying.
|
|
13
|
+
|
|
14
|
+
The CLI uses the same models:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
whoisleuth review-evidence selected-input.json --json --strict-exit
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Each input has `schema`, `version: 1` and `evidence`. Unknown versions and fields
|
|
21
|
+
are rejected. Inputs are bounded to 16 MiB; each supplied context list permits
|
|
22
|
+
200 records. `--strict-exit` returns 4 for a partial contextual review. Neither
|
|
23
|
+
adapter contacts a destination or executes selected software.
|
|
24
|
+
|
|
25
|
+
## Incident sequence
|
|
26
|
+
|
|
27
|
+
Build an analyst-ordered sequence from retained Case pins, imported records and
|
|
28
|
+
reported actions. A retained pin supplies its own source, time, completeness and
|
|
29
|
+
limitations; unknown times stay unknown. Reordering is deliberate, and reversed
|
|
30
|
+
timestamps are flagged without rewriting the sequence. A displayed instruction
|
|
31
|
+
is not recorded as a person having followed it.
|
|
32
|
+
|
|
33
|
+
Schema: `whoisleuth.incident-sequence.input`. `evidence` is an array:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"schema": "whoisleuth.incident-sequence.input", "version": 1,
|
|
38
|
+
"evidence": [{
|
|
39
|
+
"id": "stage-1", "kind": "credential_entry", "basis": "reported_action",
|
|
40
|
+
"description": "The reporter entered a password into the displayed form.",
|
|
41
|
+
"occurredAt": null, "hostname": "example.test",
|
|
42
|
+
"source": "Reporter interview", "reference": "interview-17",
|
|
43
|
+
"referenceSha256": null, "completeness": "unknown",
|
|
44
|
+
"limitations": ["Event time not supplied."]
|
|
45
|
+
}]
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Kinds cover messages, navigation, identity prompts, credential entry, consent,
|
|
50
|
+
browser instructions, clipboard events, local execution, payment, recovery and
|
|
51
|
+
other events. Basis is `retained_observation`, `imported_record` or
|
|
52
|
+
`reported_action`. Reference hashes identify the supplied record; they do not
|
|
53
|
+
authenticate its source. Save the reusable input with the review to continue
|
|
54
|
+
later. These stages never execute a command, submit a form or open a destination.
|
|
55
|
+
|
|
56
|
+
## Domain history and retirement
|
|
57
|
+
|
|
58
|
+
The Case view compares retained snapshots using the existing source, hostname,
|
|
59
|
+
scan-depth and model-version rules. Registration, DNS, mail and web changes are
|
|
60
|
+
shown alongside source-qualified certificate pins. Equal-time observations are
|
|
61
|
+
not ordered into a change sequence. Retired dependencies must involve the Case
|
|
62
|
+
domain or one of its hostnames. An expected window qualifies the review; it does
|
|
63
|
+
not approve a change automatically or establish transfer or takeover.
|
|
64
|
+
Review prompts connect comparable page, mail, delegation and registration changes
|
|
65
|
+
to the retained concern. Incomplete comparisons remain visible. A changed creation
|
|
66
|
+
date asks for reassessment of earlier decisions without asserting a new owner,
|
|
67
|
+
resetting a baseline or discarding history; expiry alone never establishes deletion.
|
|
68
|
+
|
|
69
|
+
Schema: `whoisleuth.domain-history.input`. Its `evidence` contains:
|
|
70
|
+
|
|
71
|
+
- `caseExport`: an ordinary supported editable Case export, with `version` and
|
|
72
|
+
`cases`; the exact existing Case reader rejects data loss or silent repair.
|
|
73
|
+
- `caseId`: the Case selected from that export.
|
|
74
|
+
- `declarations`: `expectedChanges` and `retiredDependencies` arrays.
|
|
75
|
+
|
|
76
|
+
An expected change is `{family, start, end, reason}`. A retired dependency is
|
|
77
|
+
`{asset, dependency, family, retiredAt, source}`. Families are `registration`,
|
|
78
|
+
`dns`, `mail`, `certificate` and `web`; times are explicit ISO timestamps. The
|
|
79
|
+
reusable input download includes the selected Case and is not duplicated in
|
|
80
|
+
workspace storage when saving the report.
|
|
81
|
+
|
|
82
|
+
## Platform objects
|
|
83
|
+
|
|
84
|
+
Schema: `whoisleuth.platform-continuity.input`. `evidence` is an array:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"schema": "whoisleuth.platform-continuity.input",
|
|
89
|
+
"version": 1,
|
|
90
|
+
"evidence": [{
|
|
91
|
+
"platformOrigin": "https://platform.example.test",
|
|
92
|
+
"objectType": "extension", "objectId": "extension-17", "version": "1.0.0",
|
|
93
|
+
"observedAt": "2026-09-22T00:00:00.000Z", "source": "Selected manifest",
|
|
94
|
+
"report": "acknowledged", "providerOutcome": "provider_reports_resolved",
|
|
95
|
+
"recheck": "not_checked", "recheckedAt": null
|
|
96
|
+
}]
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Object types include account, tenant, application, extension, package, page,
|
|
101
|
+
channel and post. Identity is scoped to platform origin and object type, not a
|
|
102
|
+
URL alone. Version is nullable. Report status is `not_reported`, `submitted` or
|
|
103
|
+
`acknowledged`. Provider outcomes and independent rechecks use the existing Case
|
|
104
|
+
response vocabulary. A recheck needs its own time; provider resolution does not
|
|
105
|
+
establish removal. Save or download the reusable input to add later observations.
|
|
106
|
+
|
|
107
|
+
## Storefronts
|
|
108
|
+
|
|
109
|
+
Schema: `whoisleuth.storefront-review.input`. `evidence` contains `official`,
|
|
110
|
+
`candidate`, `authorisedComparator: true`, `resellerStatus` and `resellerSource`.
|
|
111
|
+
Reseller status is `authorised`, `not_authorised` or `unknown`; a non-unknown
|
|
112
|
+
declaration needs a source. Both observations use this shape:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"hostname": "shop.example.test",
|
|
117
|
+
"observedAt": "2026-09-22T00:00:00.000Z", "source": "Selected capture",
|
|
118
|
+
"brandNames": ["Example shop"], "contactDomains": ["example.test"],
|
|
119
|
+
"policyHashes": null, "checkoutOrigins": ["https://checkout.example.test"],
|
|
120
|
+
"paymentMethods": ["card"], "assetHashes": null
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Null means not reviewed; an empty array means no values were recorded. Policy
|
|
125
|
+
and asset hashes are lowercase hexadecimal SHA-256. Checkout values are origins
|
|
126
|
+
only. Exact shared values are displayed without a combined scam score. Check
|
|
127
|
+
reseller, affiliate and regional-store authority before preparing a complaint.
|
|
128
|
+
|
|
129
|
+
## Connectors
|
|
130
|
+
|
|
131
|
+
Schema: `whoisleuth.connector-review.input`. `evidence` contains `current` and
|
|
132
|
+
nullable `previous` configuration objects, each with exactly one `mcpServers`
|
|
133
|
+
or `servers` map. Select that section rather than unrelated application settings.
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"schema": "whoisleuth.connector-review.input", "version": 1,
|
|
138
|
+
"evidence": {
|
|
139
|
+
"current": {"mcpServers": {
|
|
140
|
+
"remote": {"url": "https://connector.example.test/service"},
|
|
141
|
+
"local": {"command": "npx", "args": ["--yes", "@example/connector@1.0.0"]}
|
|
142
|
+
}},
|
|
143
|
+
"previous": null
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The browser accepts the configuration itself. Reports retain names, endpoint
|
|
149
|
+
origins, executable basenames, recognised package identities, declared
|
|
150
|
+
capabilities and metadata counts. They exclude local paths, argument contents,
|
|
151
|
+
environment values, header values, authentication material and URL paths or
|
|
152
|
+
queries. Raw configuration is not saved with the report. Matching retained
|
|
153
|
+
metadata does not mean excluded values are unchanged. No command, connector,
|
|
154
|
+
tool, prompt or model is run; declarations are not negotiated capabilities or a
|
|
155
|
+
safety assessment.
|
package/lib/analyst-taxonomy.mjs
CHANGED
|
@@ -1,40 +1,2 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
// derives machine tags only when an analyst-owned disposition and reason make
|
|
4
|
-
// the mapping unambiguous. These tags never alter collection or scoring.
|
|
5
|
-
const ANALYST_REVIEW_REASONS = Object.freeze([
|
|
6
|
-
Object.freeze({ value: '', label: 'Not recorded' }),
|
|
7
|
-
Object.freeze({ value: 'authorized_or_owned', label: 'Authorised or owned domain' }),
|
|
8
|
-
Object.freeze({ value: 'shared_infrastructure', label: 'Shared infrastructure explained the signal' }),
|
|
9
|
-
Object.freeze({ value: 'generic_platform_or_template', label: 'Generic platform or template' }),
|
|
10
|
-
Object.freeze({ value: 'parked_or_reseller', label: 'Parking or reseller page' }),
|
|
11
|
-
Object.freeze({ value: 'insufficient_evidence', label: 'Insufficient evidence' }),
|
|
12
|
-
Object.freeze({ value: 'legitimate_third_party', label: 'Legitimate third party' }),
|
|
13
|
-
Object.freeze({ value: 'confirmed_credential_abuse', label: 'Confirmed credential abuse' }),
|
|
14
|
-
Object.freeze({ value: 'confirmed_malware', label: 'Confirmed malware' }),
|
|
15
|
-
Object.freeze({ value: 'other_reviewed', label: 'Other reviewed reason' }),
|
|
16
|
-
]);
|
|
17
|
-
const ANALYST_REVIEW_REASON_VALUES = new Set(ANALYST_REVIEW_REASONS.map(({ value }) => value).filter(Boolean));
|
|
18
|
-
const MISP_TAXONOMY_REFERENCES = Object.freeze([
|
|
19
|
-
Object.freeze({ namespace: 'domain-abuse', version: 2, sourceSha256: '5fcfb44742daac97061726faaaadd2ce6b7eac55306acaae3d30c3882d18f991', sourceUrl: 'https://github.com/MISP/misp-taxonomies/blob/main/domain-abuse/machinetag.json' }),
|
|
20
|
-
Object.freeze({ namespace: 'estimative-language', version: 5, sourceSha256: '1010927d396f66f7cc58a229ebb8af6ad2cdc0250ad5f8ce3b1bd9aacf5ab4da', sourceUrl: 'https://github.com/MISP/misp-taxonomies/blob/main/estimative-language/machinetag.json' }),
|
|
21
|
-
Object.freeze({ namespace: 'event-assessment', version: 2, sourceSha256: '39291bdd50e1b2975a93e33e396f42b398178015580a84402bc3d8d549dd721e', sourceUrl: 'https://github.com/MISP/misp-taxonomies/blob/main/event-assessment/machinetag.json' }),
|
|
22
|
-
Object.freeze({ namespace: 'false-positive', version: 7, sourceSha256: 'ffc8d35ae36eb1d39f33611d1090793021f2bfe3b4b31ae41631e22cf544a2fb', sourceUrl: 'https://github.com/MISP/misp-taxonomies/blob/main/false-positive/machinetag.json' }),
|
|
23
|
-
Object.freeze({ namespace: 'phishing', version: 5, sourceSha256: '8628ebe4d5935216a7b006a4d975669c4ae1a554ef8ed78ffaadd62f763d7263', sourceUrl: 'https://github.com/MISP/misp-taxonomies/blob/main/phishing/machinetag.json' }),
|
|
24
|
-
]);
|
|
25
|
-
function analystInteroperabilityTags(disposition, reviewReasonCode) {
|
|
26
|
-
const tags = new Set();
|
|
27
|
-
if (disposition === 'false_positive')
|
|
28
|
-
tags.add('false-positive:confirmed="true"');
|
|
29
|
-
if ((disposition === 'false_positive' || disposition === 'expected')
|
|
30
|
-
&& ['authorized_or_owned', 'shared_infrastructure', 'generic_platform_or_template', 'parked_or_reseller', 'legitimate_third_party'].includes(String(reviewReasonCode)))
|
|
31
|
-
tags.add('false-positive:risk="high"');
|
|
32
|
-
if (reviewReasonCode === 'insufficient_evidence') {
|
|
33
|
-
tags.add('estimative-language:confidence-in-analytic-judgment="low"');
|
|
34
|
-
}
|
|
35
|
-
if (disposition === 'confirmed_abuse' && reviewReasonCode === 'confirmed_credential_abuse') {
|
|
36
|
-
tags.add('phishing:techniques="fake-website"');
|
|
37
|
-
}
|
|
38
|
-
return [...tags].sort();
|
|
39
|
-
}
|
|
40
|
-
export { ANALYST_REVIEW_REASONS, ANALYST_REVIEW_REASON_VALUES, MISP_TAXONOMY_REFERENCES, analystInteroperabilityTags, };
|
|
1
|
+
// Retained public import; the runtime-neutral implementation lives in the domain layer.
|
|
2
|
+
export * from "../packages/analysis/analyst-taxonomy.mjs";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import packageDocument from '../package.json' with { type: 'json' };
|
|
2
|
-
import { normalizeBoundedSemanticVersion } from "
|
|
2
|
+
import { normalizeBoundedSemanticVersion } from "../packages/analysis/semantic-version.mjs";
|
|
3
3
|
export const WHOISLEUTH_APPLICATION_VERSION = normalizeBoundedSemanticVersion(packageDocument.version, 'Application manifest');
|