← back to Domain Sniper
brand-typo-watcher: suppress known-noise patterns (Let's Encrypt + Beutl)
549f3fbc2210f9f718cadb1ee3c3237c957ab50e · 2026-05-12 17:24:06 -0700 · steve
209 hits over the last ~50min of firehose audit: 206 were
*.haplorrhini.com (LE internal HTTP-01 challenge subdomains) and 3 were
audiobookshelf.beutl.in (legit Beutl app, Levenshtein-2 collision with
'butlr'). Zero real squats. Added NOISE_PATTERNS array + isKnownNoise()
filter so these drop before matchBrand/notify/logHit. Adds noise= column
to minute summary so the noise rate stays visible.
Also logged 3.74h slice 6-7 FRESH datapoint: 0/10. 80% of batch (40 of
50 baits) now DoH-checked at least once with zero confirmed snipes.
Files touched
Diff
commit 549f3fbc2210f9f718cadb1ee3c3237c957ab50e
Author: steve <steve@designerwallcoverings.com>
Date: Tue May 12 17:24:06 2026 -0700
brand-typo-watcher: suppress known-noise patterns (Let's Encrypt + Beutl)
209 hits over the last ~50min of firehose audit: 206 were
*.haplorrhini.com (LE internal HTTP-01 challenge subdomains) and 3 were
audiobookshelf.beutl.in (legit Beutl app, Levenshtein-2 collision with
'butlr'). Zero real squats. Added NOISE_PATTERNS array + isKnownNoise()
filter so these drop before matchBrand/notify/logHit. Adds noise= column
to minute summary so the noise rate stays visible.
Also logged 3.74h slice 6-7 FRESH datapoint: 0/10. 80% of batch (40 of
50 baits) now DoH-checked at least once with zero confirmed snipes.
---
brand-typo-watcher.js | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/brand-typo-watcher.js b/brand-typo-watcher.js
index 774282c..83e5128 100644
--- a/brand-typo-watcher.js
+++ b/brand-typo-watcher.js
@@ -31,6 +31,15 @@ const HITS_LOG = path.join(DATA_DIR, 'brand-typo-hits.jsonl');
const MAX_DISTANCE = parseInt(process.env.MAX_DISTANCE || '2', 10);
const NOTIFY = process.env.NOTIFY !== '0';
+// Known-noise domain patterns — suppressed from hit-counter, notification, and JSONL log.
+// These are catalogued false positives from real CT firehose runs; add new ones here as they
+// emerge to keep the signal-to-noise ratio honest. Audit at: data/brand-typo-hits.jsonl.
+const NOISE_PATTERNS = [
+ /\.haplorrhini\.com$/i, // Let's Encrypt internal HTTP-01 challenge subdomains
+ /\.beutl\.in$/i, // Beutl video-editor app — Levenshtein-2 collision with "butlr"
+];
+function isKnownNoise(d) { return NOISE_PATTERNS.some((r) => r.test(d)); }
+
const BRAND_KEYWORDS = (
process.env.BRAND_KEYWORDS ||
[
@@ -118,7 +127,7 @@ function notify(title, msg) {
} catch {}
}
-let count = { seen: 0, hits: 0, substring: 0, typo: 0, puny: 0 };
+let count = { seen: 0, hits: 0, substring: 0, typo: 0, puny: 0, noise: 0 };
const perLog = {}; // log_name -> { fetched, x509, precert, emitted }
function ts() { return new Date().toISOString(); }
@@ -132,6 +141,7 @@ function handleCertEvent(msg) {
const domains = (msg.data && msg.data.leaf_cert && msg.data.leaf_cert.all_domains) || [];
for (const d of domains) {
count.seen++;
+ if (isKnownNoise(d)) { count.noise++; continue; } // drop without further work
const m = matchBrand(d);
const puny = isPunycode(d);
if (puny) count.puny++;
@@ -203,7 +213,7 @@ function connect() {
}
setInterval(() => {
- console.error(`[${ts()}] seen=${count.seen} hits=${count.hits} (substring=${count.substring} typo=${count.typo}) puny=${count.puny}`);
+ console.error(`[${ts()}] seen=${count.seen} hits=${count.hits} (substring=${count.substring} typo=${count.typo}) puny=${count.puny} noise=${count.noise}`);
const logs = Object.keys(perLog).sort();
if (logs.length) {
const parts = logs.map((l) => {
← 49089a1 package.json: wire npm scripts for inspect + drops:list + dr
·
back to Domain Sniper
·
honeypot: 3.87h full 50-bait check — 0/50 across all 5 bucke 7b71df7 →