[ security ]

What I send, what I keep

the real version, not the marketing one

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.