@remnux/mcp-server 0.1.55 → 0.1.57

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.
Files changed (48) hide show
  1. package/README.md +9 -0
  2. package/data/osint-resources.json +546 -0
  3. package/dist/analysis/string-usage.d.ts +0 -3
  4. package/dist/analysis/string-usage.d.ts.map +1 -1
  5. package/dist/analysis/string-usage.js +1 -7
  6. package/dist/analysis/string-usage.js.map +1 -1
  7. package/dist/connectors/docker.d.ts +1 -0
  8. package/dist/connectors/docker.d.ts.map +1 -1
  9. package/dist/connectors/docker.js +39 -5
  10. package/dist/connectors/docker.js.map +1 -1
  11. package/dist/handlers/analyze-file.d.ts.map +1 -1
  12. package/dist/handlers/analyze-file.js +11 -1
  13. package/dist/handlers/analyze-file.js.map +1 -1
  14. package/dist/handlers/extract-iocs.d.ts.map +1 -1
  15. package/dist/handlers/extract-iocs.js +6 -0
  16. package/dist/handlers/extract-iocs.js.map +1 -1
  17. package/dist/handlers/get-tool-help.d.ts.map +1 -1
  18. package/dist/handlers/get-tool-help.js +11 -0
  19. package/dist/handlers/get-tool-help.js.map +1 -1
  20. package/dist/handlers/osint.d.ts +10 -0
  21. package/dist/handlers/osint.d.ts.map +1 -0
  22. package/dist/handlers/osint.js +72 -0
  23. package/dist/handlers/osint.js.map +1 -0
  24. package/dist/handlers/verify-string-usage.d.ts.map +1 -1
  25. package/dist/handlers/verify-string-usage.js +11 -4
  26. package/dist/handlers/verify-string-usage.js.map +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +9 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/osint/guidance.d.ts +125 -0
  31. package/dist/osint/guidance.d.ts.map +1 -0
  32. package/dist/osint/guidance.js +217 -0
  33. package/dist/osint/guidance.js.map +1 -0
  34. package/dist/osint/index.d.ts +61 -0
  35. package/dist/osint/index.d.ts.map +1 -0
  36. package/dist/osint/index.js +64 -0
  37. package/dist/osint/index.js.map +1 -0
  38. package/dist/parsers/capa.d.ts.map +1 -1
  39. package/dist/parsers/capa.js +8 -1
  40. package/dist/parsers/capa.js.map +1 -1
  41. package/dist/schemas/tools.d.ts +11 -0
  42. package/dist/schemas/tools.d.ts.map +1 -1
  43. package/dist/schemas/tools.js +22 -0
  44. package/dist/schemas/tools.js.map +1 -1
  45. package/dist/tools/definitions.d.ts.map +1 -1
  46. package/dist/tools/definitions.js +34 -0
  47. package/dist/tools/definitions.js.map +1 -1
  48. package/package.json +2 -1
package/README.md CHANGED
@@ -269,6 +269,7 @@ claude mcp add remnux --transport http http://REMNUX_IP:3000/mcp \
269
269
  | `check_tools` | Check which REMnux analysis tools are installed and available |
270
270
  | `get_report_template` | Return a bundled malware analysis report template (CC BY 4.0, by Lenny Zeltser) for drafting a report offline |
271
271
  | `get_report_guidance` | Return bundled report writing guidelines (sections, confidence, capabilities, IOC tiering, anti-patterns); `topic` narrows the digest, or `topic='triage_checklist'` returns the pre-claim artifact-vs-behavior triage discipline checklist |
272
+ | `get_osint_guidance` | Return bundled, offline OSINT triage guidance for malware indicators. Enrichment tradecraft (hash-first, disclosure-aware, do-not-tip-off-the-adversary, leads-not-verdicts) plus a curated, PR-maintained catalog of free and freemium lookup services. `topic` selects the guidance slice, `ioc_type` narrows the catalog. Makes no network calls and holds no API keys |
272
273
 
273
274
  ### Key Behaviors
274
275
 
@@ -514,6 +515,14 @@ Analysis produces findings; a report turns them into something a reader can act
514
515
 
515
516
  The bundled copy is a point-in-time snapshot, refreshed from the canonical public source via `pnpm run sync:report-guidance`. The continuously updated source is the [zeltser-website MCP server](https://zeltser.com/malware-analysis-report) and the article [Writing a Malware Analysis Report](https://zeltser.com/malware-analysis-report), which also offer interactive review and scoring; `analyze_file` points there as optional enrichment when online. Both report tools return only static bundled text — they never read sample content or tool output, so they add no new prompt-injection surface.
516
517
 
518
+ ### Why bundle an OSINT triage catalog?
519
+
520
+ Analysis produces IOCs, and triage decides what to do with them. After `extract_iocs`, an AI agent left to improvise might upload a confidential sample to a public multiscanner, or actively probe live C2 and tip off the adversary. `get_osint_guidance` encodes the OPSEC tradecraft for that enrichment step (hash-first, disclosure-aware, do-not-tip-off-the-adversary, leads-not-verdicts) alongside a curated catalog of free and freemium lookup services.
521
+
522
+ Like the report tools, it returns only static bundled text. It makes no network calls, holds no API keys, reads no sample content, and adds no prompt-injection surface. The server returns guidance, and the AI runs the lookups with its own tools. This keeps the offline, no-secrets stance intact while giving malware-specific OSINT a consistent, in-context home, distinct from a general-purpose OSINT tool.
523
+
524
+ The service catalog lives in `data/osint-resources.json`, a contributor-editable data file. Every listed service offers a usable free tier (no account, free account, or freemium), so the guidance can default to free-first. Each entry is also tagged for AI-friendliness (`ai_access`: keyless JSON API, key-gated API, or web-only), and the guidance lists keyless APIs first, so an agent with no keys is steered to the services it can use right now (Shodan InternetDB, GreyNoise, ipinfo, DShield, urlscan, crt.sh, RDAP, Team Cymru MHR). Propose additions or access-tier corrections by pull request. A CI test (`src/__tests__/osint-resources.test.ts`) validates structure (required fields, enums, https URLs, `last_verified`, and no duplicates) on every PR, but it cannot judge whether a service is legitimate or still reliable, so reviewers vet new entries for that. Curation favors stable, freely available services, with the backbone drawn from Lenny Zeltser's lists of [automated analysis services](https://zeltser.com/automated-malware-analysis), [malicious-website lookups](https://zeltser.com/lookup-malicious-websites), and [IP/URL blocklists](https://zeltser.com/malicious-ip-blocklists).
525
+
517
526
  ## Related Projects
518
527
 
519
528
  - [REMnux](https://remnux.org) - Linux toolkit for malware analysis
@@ -0,0 +1,546 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "updated": "2026-06-30",
4
+ "resources": [
5
+ {
6
+ "name": "VirusTotal",
7
+ "url": "https://www.virustotal.com/",
8
+ "categories": ["multiscanner", "url_web", "infrastructure"],
9
+ "ioc_types": ["hash", "url", "domain", "ip", "host_artifact"],
10
+ "access": "freemium",
11
+ "ai_access": "api_key",
12
+ "query_disclosing": "vendor",
13
+ "content_disclosing": "public",
14
+ "best_use": "Multi-engine reputation for a hash, URL, domain, or IP, plus related-sample and relationship pivots.",
15
+ "caveats": "Hash/URL/IP lookups are non-content-disclosing, but the query itself reveals the indicator to the vendor. Uploading a FILE shares it with the VirusTotal community (downloadable by paid/enterprise users), so do not upload confidential samples without authorization.",
16
+ "stability": "Long-established, industry-standard, stable free tier.",
17
+ "last_verified": "2026-06-30",
18
+ "source_list": ["lookup-malicious-websites", "automated-malware-analysis"]
19
+ },
20
+ {
21
+ "name": "Team Cymru Malware Hash Registry",
22
+ "url": "https://www.team-cymru.com/mhr",
23
+ "categories": ["multiscanner"],
24
+ "ioc_types": ["hash"],
25
+ "access": "free",
26
+ "ai_access": "api_nokey",
27
+ "query_disclosing": "vendor",
28
+ "content_disclosing": "none",
29
+ "best_use": "Keyless hash reputation. A DNS TXT lookup of <md5-or-sha1>.malware.hash.cymru.com returns the last-seen time and an antivirus detection percentage when the hash is known. SHA-256 is supported over the HTTPS interface.",
30
+ "caveats": "No key, agent-friendly. MD5 and SHA-1 work over the DNS interface. A SHA-256 is too long for a DNS label, so use the HTTPS interface for SHA-256 (get_file_info and analyze_file report both MD5 and SHA-256). Returns NXDOMAIN for unknown hashes. Non-commercial use only, do not enumerate, and notify Team Cymru before high-volume or automated queries. A non-zero detection percentage is a lead to corroborate, not a verdict.",
31
+ "stability": "Long-running Team Cymru community service.",
32
+ "last_verified": "2026-06-30",
33
+ "source_list": []
34
+ },
35
+ {
36
+ "name": "MalwareBazaar",
37
+ "url": "https://bazaar.abuse.ch/",
38
+ "categories": ["file_repo"],
39
+ "ioc_types": ["hash"],
40
+ "access": "free_account",
41
+ "ai_access": "api_key",
42
+ "query_disclosing": "vendor",
43
+ "content_disclosing": "public",
44
+ "best_use": "Is this hash known, and what related samples exist (by SHA256, imphash, TLSH, tag, or family).",
45
+ "caveats": "A public malware sample exchange. Hash lookups are non-content-disclosing, but the query reveals the hash to abuse.ch. Samples you upload are shared with the community. A free abuse.ch Auth-Key is required for API access.",
46
+ "stability": "Well-established abuse.ch (Spamhaus) platform, widely used.",
47
+ "last_verified": "2026-06-30",
48
+ "source_list": []
49
+ },
50
+ {
51
+ "name": "Hybrid Analysis",
52
+ "url": "https://www.hybrid-analysis.com/",
53
+ "categories": ["sandbox", "multiscanner"],
54
+ "ioc_types": ["hash", "url"],
55
+ "access": "free_account",
56
+ "ai_access": "api_key",
57
+ "query_disclosing": "vendor",
58
+ "content_disclosing": "public",
59
+ "best_use": "Behavioral sandbox reports and reputation for a hash or URL; search existing reports before submitting.",
60
+ "caveats": "Public submissions are searchable by others. Choose a non-public submission setting where available. A free account is required for full access.",
61
+ "stability": "Long-running CrowdStrike-operated service.",
62
+ "last_verified": "2026-06-30",
63
+ "source_list": ["automated-malware-analysis"]
64
+ },
65
+ {
66
+ "name": "Intezer Analyze",
67
+ "url": "https://analyze.intezer.com/",
68
+ "categories": ["code_similarity", "multiscanner"],
69
+ "ioc_types": ["hash"],
70
+ "access": "freemium",
71
+ "ai_access": "api_key",
72
+ "query_disclosing": "vendor",
73
+ "content_disclosing": "vendor",
74
+ "best_use": "Code-reuse and genetic similarity to known malware families; anchors corroboration on sample-intrinsic code, not network IOCs.",
75
+ "caveats": "Free tier has a limited number of scans. Uploaded files are shared with Intezer.",
76
+ "stability": "Established commercial service with a persistent free tier.",
77
+ "last_verified": "2026-06-30",
78
+ "source_list": ["automated-malware-analysis"]
79
+ },
80
+ {
81
+ "name": "ANY.RUN",
82
+ "url": "https://any.run/",
83
+ "categories": ["sandbox"],
84
+ "ioc_types": ["hash", "url"],
85
+ "access": "freemium",
86
+ "ai_access": "web",
87
+ "query_disclosing": "vendor",
88
+ "content_disclosing": "public",
89
+ "best_use": "Interactive cloud sandbox with real-time observation; also search existing public submissions by hash or IOC.",
90
+ "caveats": "Free-tier interactive tasks are PUBLIC. Do not detonate confidential samples on the free tier.",
91
+ "stability": "Widely used interactive sandbox, stable free tier.",
92
+ "last_verified": "2026-06-30",
93
+ "source_list": ["automated-malware-analysis"]
94
+ },
95
+ {
96
+ "name": "Joe Sandbox Cloud Basic",
97
+ "url": "https://www.joesandbox.com/",
98
+ "categories": ["sandbox"],
99
+ "ioc_types": ["hash", "url"],
100
+ "access": "freemium",
101
+ "ai_access": "web",
102
+ "query_disclosing": "vendor",
103
+ "content_disclosing": "public",
104
+ "best_use": "Detailed behavioral reports for a submitted sample or URL.",
105
+ "caveats": "Cloud Basic submissions are public. Use a paid or private tier for sensitive samples.",
106
+ "stability": "Established sandbox vendor with a free Basic tier.",
107
+ "last_verified": "2026-06-30",
108
+ "source_list": ["automated-malware-analysis"]
109
+ },
110
+ {
111
+ "name": "Recorded Future Triage",
112
+ "url": "https://tria.ge/",
113
+ "categories": ["sandbox"],
114
+ "ioc_types": ["hash", "url"],
115
+ "access": "free_account",
116
+ "ai_access": "api_key",
117
+ "query_disclosing": "vendor",
118
+ "content_disclosing": "public",
119
+ "best_use": "Sandbox detonation with configuration extraction; search existing public reports by hash.",
120
+ "caveats": "Free research accounts default to public samples. Mark submissions unlisted or private for sensitive material.",
121
+ "stability": "Widely used (tria.ge), stable researcher tier.",
122
+ "last_verified": "2026-06-30",
123
+ "source_list": ["automated-malware-analysis"]
124
+ },
125
+ {
126
+ "name": "CAPE Sandbox",
127
+ "url": "https://capesandbox.com/",
128
+ "categories": ["sandbox"],
129
+ "ioc_types": ["hash", "url"],
130
+ "access": "free",
131
+ "ai_access": "web",
132
+ "query_disclosing": "vendor",
133
+ "content_disclosing": "public",
134
+ "best_use": "Detonation with payload and configuration extraction for many families.",
135
+ "caveats": "The community instance is public; submissions, configs, and results are visible. Run a private CAPE for sensitive work.",
136
+ "stability": "Open-source, community instance long available.",
137
+ "last_verified": "2026-06-30",
138
+ "source_list": ["automated-malware-analysis"]
139
+ },
140
+ {
141
+ "name": "Malpedia",
142
+ "url": "https://malpedia.caad.fkie.fraunhofer.de/",
143
+ "categories": ["family_yara"],
144
+ "ioc_types": ["family", "hash"],
145
+ "access": "free_account",
146
+ "ai_access": "api_key",
147
+ "query_disclosing": "vendor",
148
+ "content_disclosing": "none",
149
+ "best_use": "Normalize family names and aliases across vendors; family references, descriptions, and YARA.",
150
+ "caveats": "A reference resource, not a submission engine. Some samples and non-public YARA require an account or invite.",
151
+ "stability": "Fraunhofer FKIE academic resource, stable.",
152
+ "last_verified": "2026-06-30",
153
+ "source_list": []
154
+ },
155
+ {
156
+ "name": "YARAify",
157
+ "url": "https://yaraify.abuse.ch/",
158
+ "categories": ["family_yara"],
159
+ "ioc_types": ["hash"],
160
+ "access": "free_account",
161
+ "ai_access": "api_key",
162
+ "query_disclosing": "vendor",
163
+ "content_disclosing": "vendor",
164
+ "best_use": "Match a file or hash against public YARA and ClamAV rules when vendor naming is weak.",
165
+ "caveats": "Scanning a file submits it. A free abuse.ch Auth-Key is required for API access.",
166
+ "stability": "abuse.ch platform, stable.",
167
+ "last_verified": "2026-06-30",
168
+ "source_list": []
169
+ },
170
+ {
171
+ "name": "ThreatFox",
172
+ "url": "https://threatfox.abuse.ch/",
173
+ "categories": ["community_intel"],
174
+ "ioc_types": ["hash", "domain", "ip", "url", "family", "host_artifact"],
175
+ "access": "free_account",
176
+ "ai_access": "api_key",
177
+ "query_disclosing": "vendor",
178
+ "content_disclosing": "none",
179
+ "best_use": "Pivot from a malware family to its current C2 and payload infrastructure, and vice versa.",
180
+ "caveats": "Community-submitted IOCs are leads, not ground truth, and can be poisoned. Corroborate. A free abuse.ch Auth-Key is required for API access.",
181
+ "stability": "abuse.ch platform, widely used.",
182
+ "last_verified": "2026-06-30",
183
+ "source_list": []
184
+ },
185
+ {
186
+ "name": "urlscan.io",
187
+ "url": "https://urlscan.io/",
188
+ "categories": ["url_web", "infrastructure"],
189
+ "ioc_types": ["url", "domain", "ip"],
190
+ "access": "freemium",
191
+ "ai_access": "api_nokey",
192
+ "query_disclosing": "public",
193
+ "content_disclosing": "public",
194
+ "best_use": "Live URL and page analysis (screenshot, DOM, JavaScript, request chain) and search of existing public scans by domain, IP, ASN, or hash.",
195
+ "caveats": "The keyless path is searching existing public scans; submitting a new scan needs an account. Public scans are searchable by anyone, so use unlisted or private visibility for sensitive URLs. Submitting an attacker URL fetches their infrastructure and may alert them.",
196
+ "stability": "Widely used, stable free tier.",
197
+ "last_verified": "2026-06-30",
198
+ "source_list": ["lookup-malicious-websites"]
199
+ },
200
+ {
201
+ "name": "URLhaus",
202
+ "url": "https://urlhaus.abuse.ch/",
203
+ "categories": ["community_intel", "blocklist"],
204
+ "ioc_types": ["url", "domain", "ip"],
205
+ "access": "free_account",
206
+ "ai_access": "api_key",
207
+ "query_disclosing": "vendor",
208
+ "content_disclosing": "none",
209
+ "best_use": "Look up a malware-distribution URL, host, or IP, and pivot to related payloads.",
210
+ "caveats": "A free abuse.ch Auth-Key is required for API access.",
211
+ "stability": "abuse.ch platform, widely used.",
212
+ "last_verified": "2026-06-30",
213
+ "source_list": ["malicious-ip-blocklists"]
214
+ },
215
+ {
216
+ "name": "Sucuri SiteCheck",
217
+ "url": "https://sitecheck.sucuri.net/",
218
+ "categories": ["url_web"],
219
+ "ioc_types": ["url", "domain"],
220
+ "access": "free",
221
+ "ai_access": "web",
222
+ "query_disclosing": "vendor",
223
+ "content_disclosing": "vendor",
224
+ "best_use": "Live remote scan of a site for malware and blocklist status.",
225
+ "caveats": "The scan fetches the URL live from Sucuri infrastructure (not yours). It does not connect from your environment, but it still touches attacker infrastructure, which can tip off an adversary watching their server, so avoid it for sensitive live URLs.",
226
+ "stability": "Long-running free scanner.",
227
+ "last_verified": "2026-06-30",
228
+ "source_list": ["lookup-malicious-websites"]
229
+ },
230
+ {
231
+ "name": "Google Safe Browsing",
232
+ "url": "https://transparencyreport.google.com/safe-browsing/search",
233
+ "categories": ["url_web", "blocklist"],
234
+ "ioc_types": ["url", "domain"],
235
+ "access": "free",
236
+ "ai_access": "web",
237
+ "query_disclosing": "vendor",
238
+ "content_disclosing": "none",
239
+ "best_use": "Check a site's current Safe Browsing status.",
240
+ "caveats": "Status lookup only. The Safe Browsing API (for automation) requires a key.",
241
+ "stability": "Google service, stable.",
242
+ "last_verified": "2026-06-30",
243
+ "source_list": ["lookup-malicious-websites", "malicious-ip-blocklists"]
244
+ },
245
+ {
246
+ "name": "GreyNoise",
247
+ "url": "https://www.greynoise.io/",
248
+ "categories": ["infrastructure"],
249
+ "ioc_types": ["ip"],
250
+ "access": "freemium",
251
+ "ai_access": "api_nokey",
252
+ "query_disclosing": "vendor",
253
+ "content_disclosing": "none",
254
+ "best_use": "Decide whether an IP is opportunistic internet background noise or worth deeper investigation.",
255
+ "caveats": "The free community lookup works without an API key and classifies an IP as noise or not. Richer data and higher limits are paid.",
256
+ "stability": "Established, widely used for IP triage.",
257
+ "last_verified": "2026-06-30",
258
+ "source_list": []
259
+ },
260
+ {
261
+ "name": "Shodan InternetDB",
262
+ "url": "https://internetdb.shodan.io/",
263
+ "categories": ["infrastructure"],
264
+ "ioc_types": ["ip"],
265
+ "access": "free",
266
+ "ai_access": "api_nokey",
267
+ "query_disclosing": "vendor",
268
+ "content_disclosing": "none",
269
+ "best_use": "Fast IP lookup for open ports, hostnames, CPEs, tags, and known vulnerabilities.",
270
+ "caveats": "Unauthenticated and free for non-commercial use. Full Shodan (banners, history, search) needs an account and API key.",
271
+ "stability": "Shodan service, stable.",
272
+ "last_verified": "2026-06-30",
273
+ "source_list": []
274
+ },
275
+ {
276
+ "name": "Censys Search",
277
+ "url": "https://search.censys.io/",
278
+ "categories": ["infrastructure", "cert_transparency"],
279
+ "ioc_types": ["ip", "domain"],
280
+ "access": "freemium",
281
+ "ai_access": "api_key",
282
+ "query_disclosing": "vendor",
283
+ "content_disclosing": "none",
284
+ "best_use": "Map exposed infrastructure and pivot on hosts, services, banners, and certificates.",
285
+ "caveats": "Free tier requires an account and is rate-limited.",
286
+ "stability": "Established internet-scan platform.",
287
+ "last_verified": "2026-06-30",
288
+ "source_list": []
289
+ },
290
+ {
291
+ "name": "AbuseIPDB",
292
+ "url": "https://www.abuseipdb.com/",
293
+ "categories": ["infrastructure"],
294
+ "ioc_types": ["ip"],
295
+ "access": "free_account",
296
+ "ai_access": "api_key",
297
+ "query_disclosing": "vendor",
298
+ "content_disclosing": "none",
299
+ "best_use": "Community reputation and abuse reports for an IP or hostname.",
300
+ "caveats": "Community reports are leads, not ground truth. A free account and API key are needed for the API.",
301
+ "stability": "Widely used IP reputation service.",
302
+ "last_verified": "2026-06-30",
303
+ "source_list": ["lookup-malicious-websites"]
304
+ },
305
+ {
306
+ "name": "Cisco Talos Reputation Center",
307
+ "url": "https://talosintelligence.com/reputation_center",
308
+ "categories": ["infrastructure"],
309
+ "ioc_types": ["ip", "domain"],
310
+ "access": "free",
311
+ "ai_access": "web",
312
+ "query_disclosing": "vendor",
313
+ "content_disclosing": "none",
314
+ "best_use": "Independent IP, domain, and email reputation cross-check, useful for network and email infrastructure.",
315
+ "caveats": "Reputation snapshot; corroborate with other sources.",
316
+ "stability": "Cisco-operated, stable.",
317
+ "last_verified": "2026-06-30",
318
+ "source_list": ["lookup-malicious-websites"]
319
+ },
320
+ {
321
+ "name": "ipinfo",
322
+ "url": "https://ipinfo.io/",
323
+ "categories": ["infrastructure"],
324
+ "ioc_types": ["ip"],
325
+ "access": "freemium",
326
+ "ai_access": "api_nokey",
327
+ "query_disclosing": "vendor",
328
+ "content_disclosing": "none",
329
+ "best_use": "Geolocation, ASN, and owner baseline for an IP.",
330
+ "caveats": "Free tier with an account is rate-limited; richer data is paid.",
331
+ "stability": "Established IP-data provider.",
332
+ "last_verified": "2026-06-30",
333
+ "source_list": []
334
+ },
335
+ {
336
+ "name": "crt.sh",
337
+ "url": "https://crt.sh/",
338
+ "categories": ["cert_transparency"],
339
+ "ioc_types": ["domain"],
340
+ "access": "free",
341
+ "ai_access": "api_nokey",
342
+ "query_disclosing": "vendor",
343
+ "content_disclosing": "none",
344
+ "best_use": "Certificate Transparency search to pivot on domains, organization names, and certificate fingerprints.",
345
+ "caveats": "Passive lookup against public CT logs. The service can be slow or briefly unavailable under load, so retry or fall back to another CT source if it times out.",
346
+ "stability": "Long-running free CT search.",
347
+ "last_verified": "2026-06-30",
348
+ "source_list": []
349
+ },
350
+ {
351
+ "name": "DNSDumpster",
352
+ "url": "https://dnsdumpster.com/",
353
+ "categories": ["passive_dns"],
354
+ "ioc_types": ["domain"],
355
+ "access": "free",
356
+ "ai_access": "web",
357
+ "query_disclosing": "vendor",
358
+ "content_disclosing": "none",
359
+ "best_use": "Passive DNS, subdomain, and host discovery for a domain.",
360
+ "caveats": "Free and rate-limited.",
361
+ "stability": "Long-running free recon tool.",
362
+ "last_verified": "2026-06-30",
363
+ "source_list": []
364
+ },
365
+ {
366
+ "name": "SecurityTrails",
367
+ "url": "https://securitytrails.com/",
368
+ "categories": ["passive_dns", "infrastructure"],
369
+ "ioc_types": ["domain", "ip"],
370
+ "access": "freemium",
371
+ "ai_access": "api_key",
372
+ "query_disclosing": "vendor",
373
+ "content_disclosing": "none",
374
+ "best_use": "Passive DNS, DNS history, subdomain discovery, and domain-to-IP infrastructure pivots.",
375
+ "caveats": "Free tier with an account; paid for volume.",
376
+ "stability": "Established passive-DNS provider.",
377
+ "last_verified": "2026-06-30",
378
+ "source_list": ["lookup-malicious-websites"]
379
+ },
380
+ {
381
+ "name": "Validin",
382
+ "url": "https://app.validin.com/",
383
+ "categories": ["passive_dns", "infrastructure"],
384
+ "ioc_types": ["domain", "ip"],
385
+ "access": "freemium",
386
+ "ai_access": "api_key",
387
+ "query_disclosing": "vendor",
388
+ "content_disclosing": "none",
389
+ "best_use": "DNS and threat-infrastructure enrichment, mapping artifacts to malware-family and attacker profiles.",
390
+ "caveats": "Free community tier with an account.",
391
+ "stability": "Newer but actively maintained; reassess at re-verification.",
392
+ "last_verified": "2026-06-30",
393
+ "source_list": []
394
+ },
395
+ {
396
+ "name": "CyberGordon",
397
+ "url": "https://cybergordon.com/",
398
+ "categories": ["aggregator"],
399
+ "ioc_types": ["ip", "domain", "url", "hash"],
400
+ "access": "free",
401
+ "ai_access": "web",
402
+ "query_disclosing": "vendor",
403
+ "content_disclosing": "none",
404
+ "best_use": "Run one observable across many reputation services at once for a fast first corroboration pass.",
405
+ "caveats": "Aggregates third-party services, so each underlying source carries its own caveats.",
406
+ "stability": "Stable free aggregator.",
407
+ "last_verified": "2026-06-30",
408
+ "source_list": ["lookup-malicious-websites"]
409
+ },
410
+ {
411
+ "name": "Pulsedive",
412
+ "url": "https://pulsedive.com/",
413
+ "categories": ["aggregator", "community_intel"],
414
+ "ioc_types": ["ip", "domain", "url", "hash", "host_artifact"],
415
+ "access": "freemium",
416
+ "ai_access": "api_key",
417
+ "query_disclosing": "vendor",
418
+ "content_disclosing": "none",
419
+ "best_use": "Enrich an IP, domain, URL, or hash from OSINT feeds, with passive and active scan options.",
420
+ "caveats": "Free tier with an account. Treat feed-sourced data as leads.",
421
+ "stability": "Established threat-intel platform.",
422
+ "last_verified": "2026-06-30",
423
+ "source_list": ["lookup-malicious-websites"]
424
+ },
425
+ {
426
+ "name": "IBM X-Force Exchange",
427
+ "url": "https://exchange.xforce.ibmcloud.com/",
428
+ "categories": ["aggregator"],
429
+ "ioc_types": ["ip", "domain", "url", "hash"],
430
+ "access": "free_account",
431
+ "ai_access": "api_key",
432
+ "query_disclosing": "vendor",
433
+ "content_disclosing": "none",
434
+ "best_use": "Independent reputation and context for an IP, URL, or hash to corroborate other sources.",
435
+ "caveats": "A free account is required.",
436
+ "stability": "IBM-operated, stable.",
437
+ "last_verified": "2026-06-30",
438
+ "source_list": ["lookup-malicious-websites"]
439
+ },
440
+ {
441
+ "name": "AlienVault OTX",
442
+ "url": "https://otx.alienvault.com/",
443
+ "categories": ["community_intel"],
444
+ "ioc_types": ["ip", "domain", "url", "hash", "family", "host_artifact"],
445
+ "access": "free_account",
446
+ "ai_access": "api_key",
447
+ "query_disclosing": "vendor",
448
+ "content_disclosing": "none",
449
+ "best_use": "Check whether an IOC appears in community pulses and campaign context.",
450
+ "caveats": "Lead generation, not ground truth. Community pulses can be poisoned; corroborate. Now operated as LevelBlue OTX. A free account is required.",
451
+ "stability": "Large community threat-intel platform.",
452
+ "last_verified": "2026-06-30",
453
+ "source_list": ["lookup-malicious-websites"]
454
+ },
455
+ {
456
+ "name": "OpenPhish",
457
+ "url": "https://openphish.com/",
458
+ "categories": ["blocklist"],
459
+ "ioc_types": ["url"],
460
+ "access": "free",
461
+ "ai_access": "api_nokey",
462
+ "query_disclosing": "none",
463
+ "content_disclosing": "none",
464
+ "best_use": "Check a URL or domain against a phishing feed.",
465
+ "caveats": "Free for non-commercial use.",
466
+ "stability": "Long-running phishing feed.",
467
+ "last_verified": "2026-06-30",
468
+ "source_list": ["malicious-ip-blocklists"]
469
+ },
470
+ {
471
+ "name": "DShield (SANS ISC)",
472
+ "url": "https://www.dshield.org/",
473
+ "categories": ["blocklist", "infrastructure"],
474
+ "ioc_types": ["ip"],
475
+ "access": "free",
476
+ "ai_access": "api_nokey",
477
+ "query_disclosing": "none",
478
+ "content_disclosing": "none",
479
+ "best_use": "Check an IP against suspicious-source blocklists and attack telemetry from the SANS Internet Storm Center.",
480
+ "caveats": "Aggregated telemetry; read the list methodology before acting.",
481
+ "stability": "SANS ISC, long-running.",
482
+ "last_verified": "2026-06-30",
483
+ "source_list": ["malicious-ip-blocklists"]
484
+ },
485
+ {
486
+ "name": "UnpacMe",
487
+ "url": "https://www.unpac.me/",
488
+ "categories": ["unpacking"],
489
+ "ioc_types": ["hash"],
490
+ "access": "freemium",
491
+ "ai_access": "api_key",
492
+ "query_disclosing": "vendor",
493
+ "content_disclosing": "public",
494
+ "best_use": "Automated unpacking and payload or configuration extraction when triage stalls on a packed sample.",
495
+ "caveats": "Not pure OSINT; submission is disclosing. Free-tier results are public.",
496
+ "stability": "Established automated unpacker.",
497
+ "last_verified": "2026-06-30",
498
+ "source_list": []
499
+ },
500
+ {
501
+ "name": "RDAP (rdap.org)",
502
+ "url": "https://rdap.org/",
503
+ "categories": ["registration", "infrastructure"],
504
+ "ioc_types": ["domain", "ip"],
505
+ "access": "free",
506
+ "ai_access": "api_nokey",
507
+ "query_disclosing": "vendor",
508
+ "content_disclosing": "none",
509
+ "best_use": "Registration data (RDAP, the JSON successor to WHOIS) for a domain or IP via a single no-key request, for registrar, network-owner, and allocation pivots.",
510
+ "caveats": "rdap.org redirects to the authoritative registry or RIR and returns clean JSON with no key, so it is agent-friendly. Domain coverage depends on the TLD supporting RDAP.",
511
+ "stability": "IETF-standard protocol with a stable bootstrap redirector.",
512
+ "last_verified": "2026-06-30",
513
+ "source_list": []
514
+ },
515
+ {
516
+ "name": "Silent Push Community Edition",
517
+ "url": "https://www.silentpush.com/community-edition/",
518
+ "categories": ["infrastructure", "passive_dns"],
519
+ "ioc_types": ["domain", "ip"],
520
+ "access": "freemium",
521
+ "ai_access": "api_key",
522
+ "query_disclosing": "vendor",
523
+ "content_disclosing": "none",
524
+ "best_use": "Infrastructure hunting across DNS, WHOIS, certificates, and web-content fingerprints to map related attacker infrastructure.",
525
+ "caveats": "The free Community Edition allows 250 queries per month (GUI and API) for DNS, IP, domain, and WHOIS-history lookups. Advanced features and intelligence feeds are paid.",
526
+ "stability": "Established platform with a free Community Edition.",
527
+ "last_verified": "2026-06-30",
528
+ "source_list": []
529
+ },
530
+ {
531
+ "name": "Maltego Community Edition",
532
+ "url": "https://www.maltego.com/products/maltego-community-edition/",
533
+ "categories": ["aggregator"],
534
+ "ioc_types": ["domain", "ip", "hash", "url"],
535
+ "access": "freemium",
536
+ "ai_access": "web",
537
+ "query_disclosing": "vendor",
538
+ "content_disclosing": "none",
539
+ "best_use": "Link-analysis and graph pivoting across many data sources via transforms.",
540
+ "caveats": "The free Community Edition (requires a Maltego ID) includes about 50 transforms, 200 credits per month, and up to 24 results per transform, with per-provider monthly caps. Breach data and higher limits are paid.",
541
+ "stability": "Long-established link-analysis platform with a free Community Edition.",
542
+ "last_verified": "2026-06-30",
543
+ "source_list": []
544
+ }
545
+ ]
546
+ }
@@ -32,7 +32,6 @@ export interface MatchResult {
32
32
  }>;
33
33
  xref_status: XrefStatus;
34
34
  xref_count: number;
35
- referenced_from_initializer_only?: boolean;
36
35
  data_pointer_found?: boolean;
37
36
  xref_sources?: Array<{
38
37
  from: string;
@@ -51,8 +50,6 @@ export interface ClassifyContext {
51
50
  analysisComplete: boolean;
52
51
  /** The binary looks packed/obscured (import table / r2 coverage unreliable). */
53
52
  obscured: boolean;
54
- /** Addresses of functions registered as static initializers (.CRT$XCU/.init_array). */
55
- initializerFunctionAddrs: Set<number>;
56
53
  }
57
54
  /** Group string hits by distinct value (exact matches first), capped. */
58
55
  export declare function selectMatches(strings: R2String[], query: string, maxMatches?: number): {
@@ -1 +1 @@
1
- {"version":3,"file":"string-usage.d.ts","sourceRoot":"","sources":["../../src/analysis/string-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,MAAM,UAAU,GAClB,sBAAsB,GACtB,wBAAwB,GACxB,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAC;IACrB,mFAAmF;IACnF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;IAClB,uFAAuF;IACvF,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvC;AAID,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,QAAQ,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,UAAU,SAAK,GACd;IAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAa9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAKvE;AA4CD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,SAAS,EAAE,EACrB,GAAG,EAAE,eAAe,EACpB,mBAAmB,UAAQ,GAC1B,WAAW,CAyDb"}
1
+ {"version":3,"file":"string-usage.d.ts","sourceRoot":"","sources":["../../src/analysis/string-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,MAAM,UAAU,GAClB,sBAAsB,GACtB,wBAAwB,GACxB,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAC;IACrB,mFAAmF;IACnF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,QAAQ,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,UAAU,SAAK,GACd;IAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAa9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAKvE;AAuCD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,SAAS,EAAE,EACrB,GAAG,EAAE,eAAe,EACpB,mBAAmB,UAAQ,GAC1B,WAAW,CAqDb"}
@@ -54,9 +54,6 @@ const NOTE_NO_XREFS = "No direct code cross-reference to this string was found b
54
54
  "on this basis alone; confirm with dynamic analysis or manual review.";
55
55
  const NOTE_DATA_POINTER = " A reference from a non-executable (data) section was found (the address is stored in a pointer/data table); " +
56
56
  "this is still not a code reference and does not by itself establish operational use.";
57
- const NOTE_INITIALIZER = " The referencing function(s) are registered in the static-initializer table (.CRT$XCU/.init_array) — they run " +
58
- "before main as C++ static initializers. This is a structural fact about where the reference lives, with no " +
59
- "claim about whether the path executes in a given run.";
60
57
  const NOTE_DATA_ONLY = (ft) => `This file is not an executable (detected type: ${ft}). It contains no code that could cross-reference the ` +
61
58
  "string, so code-xref analysis does not apply. Evaluate the string as file content on its own merits.";
62
59
  const NOTE_UNKNOWN = "Cross-reference analysis could not be completed reliably (radare2 unavailable, analysis timed out, the binary " +
@@ -89,8 +86,6 @@ export function classifyMatch(group, xrefs, sections, ctx, rawXrefParseAnomaly =
89
86
  }
90
87
  const codeXrefs = xrefs.filter((x) => isFromCode(x, sections));
91
88
  if (codeXrefs.length > 0) {
92
- const initOnly = ctx.initializerFunctionAddrs.size > 0 &&
93
- codeXrefs.every((x) => x.fcnAddr !== undefined && ctx.initializerFunctionAddrs.has(x.fcnAddr));
94
89
  const xref_sources = codeXrefs.slice(0, 10).map((x) => ({
95
90
  from: hex(x.from),
96
91
  ...(x.fcnName ? { fcn: x.fcnName } : {}),
@@ -100,9 +95,8 @@ export function classifyMatch(group, xrefs, sections, ctx, rawXrefParseAnomaly =
100
95
  ...base,
101
96
  xref_status: "referenced_from_code",
102
97
  xref_count: codeXrefs.length,
103
- ...(initOnly ? { referenced_from_initializer_only: true } : {}),
104
98
  xref_sources,
105
- note: NOTE_REFERENCED + (initOnly ? NOTE_INITIALIZER : ""),
99
+ note: NOTE_REFERENCED,
106
100
  recommended_followup: FOLLOWUP.referenced_from_code,
107
101
  };
108
102
  }