feat: SSRF guard for the document-fetch worker #4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/ssrf-guard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Objet
Ferme un SSRF exploitable : un utilisateur authentifié pouvait faire fetcher au
worker n'importe quelle cible interne (loopback, RFC1918, metadata, services
K8s…). Approche à la Discourse/Mastodon : garde applicatif primaire + couche
réseau (NetworkPolicy/Cilium) en backstop opt-in.
Changements
indara-core::net:is_public_ip(plages privées/réservées + dé-mappingIPv4-in-IPv6 dont
::a.b.c.d),validate_url,host_is_literal_private_ip.indara-jobs:PublicOnlyResolver(DNS public fixe, filtrage IP, pinninganti-rebinding),
build_fetch_client(redirections auto off), boucle deredirection revalidant chaque hop (schéma/credentials/host + IP littérale),
classification fatale des hosts bloqués.
apps/server: fast-fail 400 à l'API (credentials, IP littérale privée).charts/indara: NetworkPolicy + CiliumNetworkPolicy egress opt-in,worker.fetchDnsen source unique (env app + règles egress).INDARA_FETCH_DNS,INDARA_FETCH_MAX_REDIRECTS. README documenté.Point de sécurité notable
La revue whole-branch a rattrapé un bypass critique : reqwest ne consulte le
résolveur custom que pour les hosts par nom, pas les IP littérales — donc un
302vers une IP privée littérale contournait le garde. Corrigé par un checkhost_is_literal_private_ipà chaque hop (worker autoritaire indép. de l'API),avec test comportemental.
Vérification
cargo test --workspacevert,cargo build --workspaceclean,helm template(flags on/off) OK. Design & plan :
docs/superpowers/specs|plans/2026-07-11-ssrf-*.