grithdocs

13. Destination reputation

A fixed domain list plus two shape checks - not the learned trust table.

Phase3, context
Score-1.0 to 4.0
Sourcecrates/grith-proxy/src/filters/reputation.rs
Configconfig/filters/domains.toml; gated by proxy.filters.reputation.enabled (default true)

ℹ️Two different things share this name

This page is about the filter: a fixed domain list, evaluated inside the pipeline like any other filter. The learned reputation table behind grith reputation is a separate mechanism that runs after the pipeline, only on a queued call. See Adaptive reputation.

The four verdicts

VerdictScoreSource
known-malicious4.0the [known_malicious] list
raw-ip-destination3.0the host is four dotted octets
suspicious-tld2.0a compiled TLD list
known-safe-1.0the [known_safe] list
unknown0.0anything else - explicitly neutral

An unknown host contributes nothing here. Pricing the unfamiliar is egress-policy's job; this filter only speaks when it recognises something.

Suspicious TLDs, compiled in: .xyz, .top, .tk, .ml, .ga, .cf, .gq, .buzz, .work, .click, .link, .info, .pw, .cc, .su.

The shipped [known_malicious] list covers tunnelling and interaction services - ngrok.io, serveo.net, localhost.run, burpcollaborator.net, interact.sh, oastify.com, canarytokens.com, requestbin.net, pipedream.net, webhook.site - and paste or transfer sinks: paste.ee, transfer.sh, file.io.

terminal
$ grith proxy test '{"type":"HttpRequest","method":"GET","url":"https://webhook.site/abc123"}'

Score:       8.0
Decision:    QUEUE (Critical)

Filter Breakdown:
  + operation-risk         0.5  [notice]  HTTP request: GET https://webhook.site/abc123
  + egress-policy          3.5  [warning]  Unknown outbound destination from http_request: webhook.site
  + reputation             4.0  [critical]  Known malicious domain: webhook.site

Exit code:   1 (queue (critical))

Exactly 8.0, and it queues. The deny test is score > 8.0, so a call landing on the line itself goes to a human rather than being refused.

What it reads

HttpRequest uses the URL host. NetConnect uses the address. ShellExec and ProcessSpawn have every http:// or https:// URL extracted from the reconstructed command line, and the worst host wins. Everything else is skipped.

Control-class unix sockets - the session D-Bus, X11, tmux, screen - return no match. Their paths are not hostnames, and treating them as such flagged /run/user/1000/foo.info as a suspicious .info domain.

Editing the lists

config/filters/domains.toml carries [known_safe] and [known_malicious], each with a domains array. Matching is exact and case-insensitive - github.com does not cover api.github.com, so list both.

Two things in that file are not read: the patterns array under [known_malicious] and the whole [suspicious] section. The suspicious-TLD list is compiled into the binary.

See also

Last updated: 2026-08-24Edit this page on GitHub →