aboutsummaryrefslogtreecommitdiffstats
path: root/docs/BACKLOG.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-09 10:01:48 +0200
committerDanilo M. <danix@danix.xyz>2026-09-09 10:01:48 +0200
commit1d864197203221fc0dcdd1924d60d1a759fa0d6d (patch)
tree5bf00d282bc00a4023aa8e1a3cac0506b79f6224 /docs/BACKLOG.md
parent01e69c492a5771939d1b1a8efd93f3ebb7cbe72c (diff)
downloadabusectl-1d864197203221fc0dcdd1924d60d1a759fa0d6d.tar.gz
abusectl-1d864197203221fc0dcdd1924d60d1a759fa0d6d.zip
docs: record the fourth property and the contacts command
An RDAP query discloses what the user is looking at, and property 1 covers only what is published, so the query rule needed stating in its own right beside the other three. The section records the three leaks it came from, because each one was the same shape: validation applied per branch, forgotten on the next. Also moves rdap.py's imports into one block at the top. Pure move, the suite is 192 either side of it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wrfqr2xqQfhtXCscU7zrdz
Diffstat (limited to 'docs/BACKLOG.md')
-rw-r--r--docs/BACKLOG.md29
1 files changed, 29 insertions, 0 deletions
diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md
index 25793e1..79c0ab1 100644
--- a/docs/BACKLOG.md
+++ b/docs/BACKLOG.md
@@ -6,6 +6,7 @@ number and gains a status rather than being renumbered.
| # | Item | Size | Status |
|---|------|------|--------|
| 1 | Skip boilerplate namespace URLs | XS | open |
+| 2 | An IDN indicator resolves to no contact | S | open |
## 1. Skip boilerplate namespace URLs
@@ -38,3 +39,31 @@ skip-list is a thing an attacker knows will not be reported. If it is built,
the skipped URLs should still be visible somewhere during review rather than
silently dropped, on the same reasoning that makes `suspect_path_segments`
flag rather than redact.
+
+## 2. An IDN indicator resolves to no contact
+
+**Observed.** `contacts.is_queryable()` refuses any non-ASCII value, so a
+phishing domain in an internationalised name is recorded as `unusable` with the
+reason "not ASCII, and we do not guess at an IDN encoding", and no registry is
+asked. The `ponytail:` comment on that function names this as the ceiling it
+accepted.
+
+**Cause.** Deliberate, not a defect. Converting a name to punycode means
+choosing an encoding for attacker-supplied text, and a wrong choice sends a
+different name than the one in the message to a registry, which is a disclosure
+made about the wrong party. Refusing keeps the value in front of the user
+instead.
+
+**Approach.** `value.encode("idna")` is the obvious move and is not enough on
+its own: it normalises, so the name queried may differ from the name written in
+the message, and the manifest must record BOTH, the way `query_domain` already
+records `queried` separately when the label walk shortens a host. The refusal
+reason already distinguishes non-ASCII from illegal, so the user-facing half
+exists.
+
+**Constraints.** Not a leak: the failure direction is asking nobody, which is
+safe. Weigh against a real argument for leaving it: a homograph name is exactly
+where the attacker wants the tool to normalise on their behalf, and a
+consultant chasing one indicator by hand is a smaller cost than a query made
+about a name the user never saw. Wait for a real IDN indicator in a sweep before
+building it.