Protection anti-abus du relais aveugle

AeroNyx11 min de lecture

Les limites qu'un nœud AeroNyx applique avant de transmettre du trafic de relais chiffré : limitation de débit et quarantaine du saut précédent, suppression du rejeu de routes résistante aux redémarrages, nouvelles tentatives bornées et admission CPU, en s'appuyant uniquement sur des métadonnées signées et des compteurs agrégés.

La protection anti-abus du relais aveugle (Blind Relay Abuse Guard) est l'ensemble des limites qu'un nœud AeroNyx applique avant de transmettre du trafic de relais chiffré pour le compte d'un autre nœud. Elle contient les pairs abusifs ou instables en s'appuyant uniquement sur des métadonnées de routage signées et sur des compteurs locaux. Elle n'analyse jamais le texte chiffré, ne conserve jamais d'historique de routes et n'expose jamais qui communique avec qui.

Périmètre

ContrôleÉtat
Transmission de charges utiles opaquesImplémenté
Contrôles de fraîcheur signés et suppression du rejeu de routesImplémenté. L'état anti-rejeu résiste aux redémarrages lorsque le magasin de relais de messagerie du nœud est activé
Limitation de débit et mise en quarantaine du saut précédentImplémenté
Limites d'admission des requêtes et des opérations cryptographiques à l'échelle du processusImplémenté
Indicateurs d'exécution agrégés dans la santé du nœud et dans NodeboardImplémenté
Inspection du texte en clair ou des charges utilesNon réalisé, par conception
Analyses par utilisateur, par route ou du graphe socialNon réalisé, par conception

La règle du nœud aveugle

Un relais peut authentifier les métadonnées de routage, appliquer une politique bornée, transmettre une enveloppe opaque et renvoyer un accusé de réception signé. Il ne doit jamais inspecter la charge utile ni exposer des métadonnées qui permettraient de reconstituer une route, l'identité d'un utilisateur ou une relation. En particulier, les relais n'enregistrent ni n'exposent :

  • le texte en clair des messages, paquets, médias ou souvenirs
  • les requêtes DNS, destinations, domaines, URL ou l'historique de navigation
  • les identifiants de routes, les chemins complets, les URL de points de terminaison ou les adresses IP des clients
  • les clés publiques complètes, les identités des destinataires, les identifiants de messages ou les liens du graphe social
  • les clés privées, les secrets des bons, le trafic au niveau du portefeuille ou le matériel de déchiffrement

Pipeline d'admission

Chaque requête passe les contrôles suivants avant de pouvoir utiliser la capacité de transmission. Les étapes 1 à 6 s'exécutent dans cet ordre. À l'étape 7, une requête adressée à ce nœud est confiée à son propre traitement terminal ou en oignon, tandis qu'une requête destinée à un autre nœud est réservée une fois son saut suivant résolu.

text
1. request gate: process-wide admission window and in-flight limit (64 requests)
2. crypto admission: a free slot for signature and onion work, or Backpressure
3. authenticate the signed previous hop and envelope
4. previous-hop rate limit and quarantine check
5. envelope metadata: size, age and future-skew limits
6. self-loop check
7. route loop, TTL and next-hop descriptor checks, plus the route replay reservation
8. forward the opaque ciphertext, or peel the terminal layer and deliver

Chaque décision s'appuie sur des métadonnées de routage signées et sur un état agrégé local, jamais sur du contenu déchiffré.

Limites d'exécution

Voici les valeurs par défaut actuelles dans le code source du nœud. Ce sont des valeurs de fonctionnement, et non des engagements permanents du protocole.

ConstanteValeur par défaut
BLIND_RELAY_ROUTE_REPLAY_CAPACITY8192 routes actives
BLIND_RELAY_ROUTE_REPLAY_TTL_SECS600 secondes
PREVIOUS_HOP_RATE_LIMIT par PREVIOUS_HOP_RATE_WINDOW_SECS120 requêtes par 60 secondes
PREVIOUS_HOP_FAILURE_THRESHOLD par PREVIOUS_HOP_FAILURE_WINDOW_SECS12 échecs comptabilisés par 300 secondes
PREVIOUS_HOP_QUARANTINE_SECS300 secondes
MAX_PREVIOUS_HOP_BUCKETS4096 compartiments
BLIND_RELAY_MAX_ENVELOPE_AGE_SECS600 secondes
BLIND_RELAY_MAX_FUTURE_SKEW_SECS120 secondes
BLIND_RELAY_DELIVERY_RECEIPT_MAX_AGE_SECS120 secondes
DEFAULT_MAX_ATTEMPTS (nouvelles tentatives de transmission)3 tentatives
MAX_IN_FLIGHT_BLIND_RELAY_REQUESTS64 requêtes

Limitation de débit et mise en quarantaine du saut précédent

Les limites de débit sont indexées sur l'identité signée du saut précédent. Plus de 120 requêtes provenant d'un même saut précédent en 60 secondes déclenchent une quarantaine locale de cinq minutes pour ce saut. Un score d'échecs distinct déclenche la même quarantaine après 12 échecs comptabilisés en cinq minutes. Seuls les motifs suivants comptent dans le score :

text
invalid_previous_hop | invalid_signature | self_loop | route_loop | ttl_exhausted

Les délais d'attente de transport dépassés, les accusés de réception perdus, les nouvelles tentatives en double et les conflits de rejeu n'augmentent pas le score : un pair sain n'est donc pas mis en quarantaine à cause de problèmes réseau. Le magasin de compartiments est borné et les compartiments inactifs sont évincés, de sorte que la protection ne peut pas se transformer en graphe de communication à long terme.

Rejeu de routes et nouvelles tentatives

Chaque requête de relais porte un identifiant de route. Lorsque le magasin de relais de messagerie du nœud est activé ([memchain.chat_relay] enabled = true), les réservations de routes et les réponses terminées sont conservées dans sa base de données SQLite, de sorte que la protection anti-rejeu résiste à un redémarrage. Sinon, le nœud utilise un registre en mémoire de même capacité et de même fenêtre. Si les 8192 emplacements contiennent tous des routes actives, les nouvelles routes sont rejetées avec replay_capacity jusqu'à l'expiration d'emplacements.

Un identifiant de route répété aboutit à l'un des quatre résultats suivants :

SituationRéponseEffet sur le saut précédent
Même requête ; la première tentative est terminéeLa réponse stockée est rejouée, y compris tout accusé de réception signé par le nœud terminal. Rien n'est remis ni transmis une seconde fois (duplicate_route)Comptabilisé comme un succès
Même requête ; la première tentative est toujours en coursHTTP 503 route_in_flight. L'expéditeur peut réessayerAucun
Requête différente sous le même identifiant de routeHTTP 400 replay_conflictEnregistré dans la santé du pair. N'augmente pas le score de quarantaine
Même requête, mais la réponse stockée date de plus de 120 secondesHTTP 409 replay_response_expired. La route reste réservée pour le reste de sa fenêtre de 600 secondes et ne peut donc pas être exécutée à nouveauAucun

Le dernier résultat s'applique au magasin durable. Les accusés de réception signés ne sont valables qu'en tant que preuve récente : le nœud n'en rejoue donc pas un au-delà de 120 secondes.

Lorsque la transmission vers le saut suivant échoue en raison d'un délai d'attente dépassé, d'une erreur de connexion ou d'une erreur de requête, le nœud réessaie, jusqu'à trois tentatives au total. Le court délai précédant chaque nouvelle tentative est dérivé de l'identifiant de route, du saut suivant et du numéro de tentative. Les échecs que le nœud en aval signale comme des rejets définitifs ne font pas l'objet de nouvelles tentatives.

Admission cryptographique (note de capacité pour les opérateurs)

Les vérifications de signatures, le retrait des couches d'oignon et la signature des accusés de réception sont limités par le CPU ; chaque processus de nœud les limite donc :

  • Emplacements au total : la moitié des threads CPU signalés par l'hôte, arrondie au supérieur, avec au moins 4 et au plus 8, de sorte qu'un hôte à un ou deux threads dispose quand même de 4 emplacements.
  • Requêtes entrantes : un emplacement de moins que le total, afin que la création de routes sortantes et la finalisation des accusés de réception puissent toujours progresser. Sur les plus petits hôtes, les requêtes entrantes disposent donc de 3 emplacements.
  • Lorsque tous les emplacements sont occupés : la requête est immédiatement rejetée avec HTTP 429 et le motif backpressure. Elle n'attend pas dans une file.

Sur un petit hôte, un relais délaisse donc la charge tôt en cas de pics. Un compteur backpressure_dropped en hausse signifie que le nœud a besoin de plus de CPU ou de moins de trafic de relais.

Compteurs d'exécution agrégés

Les nœuds signalent dans leur heartbeat des compteurs cumulés approximatifs et des horodatages de fraîcheur, sous :

text
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.blind_relay_quality
system_stats.discovery_status.peer_store.peer_health_summary
Groupe de compteursChamps
Réception et issuereceived, terminal, forwarded, rejected
Validation et protectioninvalid_signature, envelope_too_large, ttl_exhausted, no_route, invalid_endpoint, loop_detected, replay_dropped, timestamp_rejected, rate_limited, quarantined, quarantine_started
Transport et nouvelles tentativesbackpressure_dropped, forward_failed, retry_attempted, retry_succeeded, retry_exhausted
Sondes synthétiquesprobe_attempted, probe_succeeded, probe_failed, two_hop_probe_attempted, two_hop_probe_succeeded, two_hop_probe_failed
Remises réelles et fraîcheurverified_client_onion_deliveries, last_verified_client_onion_delivery_at, last_accepted_at, last_event_at

Ces compteurs décrivent le fonctionnement du nœud. Ce ne sont ni des journaux de messages ni des données de facturation, et ils ne prouvent pas qu'une conversation donnée a eu lieu.

Qualité des preuves

Le résumé de qualité distingue quatre types de preuves : le travail de relais opaque accepté, les sondes synthétiques d'accessibilité, les sondes synthétiques à deux sauts et les accusés de réception signés par le nœud terminal pour les remises initiées par des clients. real_relay_ready exige un accusé de réception de remise client récent et authentifié. Les preuves synthétiques ne sont jamais présentées comme du trafic utilisateur.

statusSignification
idleAucune activité de relais ou de sonde pour l'instant
observingCertaines preuves existent, mais l'état de disponibilité n'est pas établi
staleLes preuves de succès antérieures ne sont plus récentes
readyTravail accepté récent ou preuve qualifiante, sans problème de transport actif
protectingDes protections anti-abus se sont déclenchées tandis que le relais continue de fonctionner
degradedDes échecs de transmission ou de sonde doivent être examinés
attentionLa contre-pression (backpressure) ou des nouvelles tentatives épuisées requièrent une attention rapide de l'opérateur

proof_scope indique la preuve la plus forte observée : client_message_delivery, relay_acceptance, message_delivery, control_plane, single_hop_control_plane, attempted ou none.

Santé des pairs sans relations de trafic

peer_health_summary permet aux opérateurs de repérer un pair défaillant ou en quarantaine sans voir qui communique avec qui.

Inclus : un préfixe raccourci de l'identifiant du nœud, l'état approximatif de santé et du descripteur, la fraîcheur de la diffusion et des succès de routes, le nombre agrégé de succès et d'échecs de routes, l'état de quarantaine, le temps restant et des catégories approximatives de motifs.

Jamais inclus : les clés publiques complètes des nœuds, les identifiants de routes, les listes de points de terminaison, les blocs chiffrés ou les hachages de charges utiles, les identifiants de messages, les identités des destinataires, les adresses IP des clients, les destinations, les données DNS ni les liens du graphe social.

Plan du code source

CoucheChemin dans le dépôt du nœudRôle
Orchestration du relaiscrates/aeronyx-server/src/api/chat_peer/blind_relay.rsFiltre d'admission des requêtes, admission cryptographique, authentification, contrôles de boucle et de TTL, résultats du rejeu, transmission et traitement terminal
Surface HTTP et limitescrates/aeronyx-server/src/api/chat_peer.rsRoutes, limites de corps et de requêtes en cours, codes d'erreur et catégories de motifs
Politique anti-abuscrates/aeronyx-server/src/api/chat_peer_abuse_guard.rsLimites de débit du saut précédent, score d'échecs et quarantaine
Registre anti-rejeucrates/aeronyx-server/src/api/chat_peer_replay.rsRegistre en mémoire et format des réponses stockées
Magasin anti-rejeu durablecrates/aeronyx-server/src/services/chat_relay_blind_route_store.rsRéservations de routes et réponses dans SQLite
Politique de nouvelles tentativescrates/aeronyx-server/src/api/chat_peer_retry.rsÉchecs pouvant être réessayés ou définitifs, et calendrier des nouvelles tentatives
Compteurs et qualitécrates/aeronyx-server/src/services/peer_store.rs et services/peer_store/status.rsCompteurs agrégés, disponibilité et classification des preuves
Rapports de santécrates/aeronyx-server/src/api/vpn_health.rs et management/reporter.rsJSON de santé local et charge utile du heartbeat

Le logiciel de nœud est open source sous licence AGPL-3.0 sur github.com/AeroNyxNetwork/AeroNyx. Consultez Découverte des nœuds et relais chiffré multisaut pour savoir comment les routes sont construites.

<!-- faq:start -->

Questions fréquentes

Un nœud relais peut-il lire ou journaliser le trafic qu'il transmet ?

Non. Un relais vérifie les métadonnées de routage signées et transmet une enveloppe opaque. Il ne conserve que des compteurs agrégés, jamais de charges utiles, d'historiques de routes ni d'identités de destinataires.

Que se passe-t-il lorsqu'un nœud réessaie la même route ?

Si la première tentative est terminée, le nœud rejoue sa réponse stockée et ne remet rien une seconde fois. Si la première tentative est toujours en cours, le nœud renvoie route_in_flight, qui peut être réessayé. Une requête différente sous le même identifiant de route est rejetée avec replay_conflict.

La protection anti-rejeu résiste-t-elle à un redémarrage du nœud ?

Oui, lorsque le magasin de relais de messagerie du nœud est activé. Les réservations de routes et les réponses terminées sont alors conservées dans SQLite. Sans ce magasin, le nœud utilise un registre en mémoire qui est effacé au redémarrage.

Pourquoi un pair est-il mis en quarantaine ?

Un pair est mis en quarantaine pendant cinq minutes après avoir envoyé plus de 120 requêtes en 60 secondes, ou après 12 échecs de validation comptabilisés en cinq minutes. Les délais d'attente dépassés, les accusés de réception perdus et les nouvelles tentatives en double ne comptent pas comme des échecs.

Pourquoi mon nœud renvoie-t-il backpressure sous charge ?

Tous ses emplacements cryptographiques de relais étaient occupés. Un nœud alloue environ la moitié de ses threads CPU (au moins 4 et au plus 8) aux opérations de signature et d'oignon, et rejette immédiatement les requêtes excédentaires au lieu de les mettre en file d'attente.

<!-- faq:end -->