Harden network and privacy defaults; fix several bugs
Security:
- Bind HTTP gateway to 127.0.0.1 by default; add --bind for LAN opt-in
- Restrict Reticulum mesh surface to GET /api/sites only (CSRF cannot
authenticate mesh callers, so gate by whitelist)
- Cap request body size at 16 MiB to prevent memory DoS
- Redact /bookmark query strings from request logs so the bookmark token
and URLs do not land in stdout / docker / journal logs
- Tighten FTS5 sanitizer: strip colon, drop AND/OR/NOT/NEAR operator words
- Expand .dockerignore; document trust model in README
Features:
- Add sharing mode toggle (share everything except private vs share only
public-tagged) with /share/preview so users can see what subscribers
would receive before enabling sharing
Bugs:
- handle_export() crashed on every call (missing query kwarg)
- Dead float16 decompression branch in embeddings.py silently corrupted
the HNSW index when compress_embeddings was on
- GATEWAY_PORT staleness: --port and find_available_port had no effect
on the actual bind
- semantic_search default mismatched between db.py ("1") and the rest of
the app ("0"), causing embeddings to be generated when the UI said off
- Connection pool returned connections with uncommitted transactions to
the next consumer
- Gateway POST body decode 502'd on non-UTF-8 input
- ensure_rns_config clobbered user-edited ~/.reticulum/config; now only
rewrites files it authored (sentinel-tagged)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ce50150363
commit
1bc695f508
8 changed files with 266 additions and 56 deletions
13
README.md
13
README.md
|
|
@ -122,10 +122,13 @@ Or with docker-compose (see above) — data persists in the named volume.
|
|||
### Command line options
|
||||
|
||||
```bash
|
||||
./TinyWeb --version # Show version
|
||||
./TinyWeb -p 9000 # Use port 9000 instead of default 8080
|
||||
./TinyWeb --version # Show version
|
||||
./TinyWeb -p 9000 # Use port 9000 instead of default 8080
|
||||
./TinyWeb --bind 0.0.0.0 # Expose the web UI to your LAN (see warning below)
|
||||
```
|
||||
|
||||
By default, the web UI binds to `127.0.0.1` and is only reachable from the machine running TinyWeb. **The UI has no authentication** — anyone who can reach the port can read, add, and delete entries, and change settings. Only pass `--bind 0.0.0.0` if you fully trust your network, or put TinyWeb behind an authenticating reverse proxy.
|
||||
|
||||
## Getting started
|
||||
|
||||
```bash
|
||||
|
|
@ -133,7 +136,7 @@ pip install -r requirements.txt
|
|||
python app.py
|
||||
```
|
||||
|
||||
This starts the Reticulum server and an HTTP gateway on `http://localhost:8080`. Open it in your browser.
|
||||
This starts the Reticulum server and an HTTP gateway on `http://127.0.0.1:8080`. Open it in your browser. The UI is localhost-only by default; see `--bind` under *Command line options* if you want to reach it from another machine.
|
||||
|
||||
Your destination hash is printed on startup — share it with friends so they can subscribe to your index.
|
||||
|
||||
|
|
@ -168,7 +171,9 @@ themes/ — Saved HTML templates (e.g. kodama.html)
|
|||
|
||||
## Security
|
||||
|
||||
TinyWeb includes several hardening measures:
|
||||
**The web UI has no authentication.** It is bound to `127.0.0.1` by default, so only processes on the local machine can reach it. If you pass `--bind 0.0.0.0` (or run inside a container with a published port), anyone who can reach that address can fully control your instance — reading private entries, changing settings, and modifying the HTML template (which runs in your browser). Put TinyWeb behind a reverse proxy with auth before exposing it beyond localhost.
|
||||
|
||||
Other hardening measures:
|
||||
|
||||
- **CSRF protection** — All POST forms use per-session tokens via double-submit cookies
|
||||
- **SSRF prevention** — URL fetching validates hostnames against private IP ranges, with redirect re-validation
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue