SECURITY
What I send, what I keep
The short version: read-only GETs, counts not raw IPs, no accounts. The details below are the real version, not the marketing one.
Probe policy
A scan sends HTTP GET requests to metadata endpoints only: version banners, model lists, config pings. No logins, no POST/PUT/DELETE to the target, no exploit verification, no model pulls. Bodies are truncated at 64 KiB; timeouts are 3s connect, 5s per request. The full contract is PROBES.md; what I probe per product is on /coverage.
Don't take my word for it: the CLI shows its work. aicheck scan <host> --dry-run
prints every request it would send (no sockets, no DNS), and --verbose
logs every connection as it happens, with the pinned IP actually dialed.
No phone-home by default: the one optional extra, a weekly PyPI version check,
runs only when explicitly enabled with --version-check or
AICHECK_VERSION_CHECK=1. Inventory mode never phones home.
Target validation: DNS pinning & SSRF
Targets are resolved once and the scan pins those IPs for every request; redirects that leave the host are blocked, so DNS cannot be rebound mid-scan. The guard is an allowlist, not a blocklist: a target is scanned only if every resolved address is globally routable unicast IPv4. Private, loopback, link-local, CGNAT, benchmarking, and cloud-metadata ranges are rejected, as literals and as DNS answers.
Data retention
Per scan I store the grade, the findings, and the target you submitted. The target feeds time-to-fix under a one-way hash: SHA-256, unsalted and target-specific. That defeats casual browsing, but a hash of a low-entropy value like a hostname is obfuscation, not anonymization; I treat it that way and you should too. Scan pages are served no-store. Honeypot numbers on /botwatch never stores full source IPs. At most a truncated first octet (65.x.x.x).
Accounts & tracking
No accounts, no tracking cookies, no analytics pixels. Fonts are self-hosted (OFL-licensed IBM Plex Sans, JetBrains Mono), no request to Google Fonts or any font CDN. The one third-party call left is Cloudflare Turnstile, the bot check on the scan form; it loads only on that form, nowhere else on the site.
Rate limits
5 scans per hour per client IP; the same target within 10 minutes returns the recent scan instead of re-running. X-Forwarded-For is trusted only from configured proxies. There is no bulk API.
CLI supply chain
The aicheck-scan CLI is published to PyPI with OIDC trusted
publishing, no long-lived API tokens, plus an SBOM and build provenance, and
each release ships SHA256 sums. The monthly data releases on this site carry
SHA256SUMS too (see /releases). Details:
docs/trust.md.
Disclosure
Report vulnerabilities to hello@unauth.dev. I acknowledge within 72 hours, triage within 7 days, and aim to fix within 30 days (SECURITY.md). Machine-readable: /.well-known/security.txt.