Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ADR-043 — Pile SSH : OpenSSH système en incubation, air-ssh maison à terme

Statut : Accepté (2026-06-25, validé par le BDFL). Companion de la note docs/notes/reseau-architecture-crates-fr.md (architecture des crates réseau) et pendant d’ADR-042 (pile TLS). Cohérent avec ADR-011 (phasage bottom-up), ADR-013 (incubation / coexistence), et le périmètre connectivité tier-1 (ssh/sshd).

Catégorie : Architecture (couche 2 — air-ssh / réseau) / Sécurité.

Contexte

SSH (client ssh/scp/sftp + serveur sshd) est dans le périmètre tier-1 d’Air. La question — comme pour TLS (ADR-042) — : implémentation maison, réutilisation d’une brique existante, ou usage de l’existant système ? L’analyse a été menée explicitement.

Démarche d’analyse (consignée)

  1. OpenSSH = référence solide (l’équipe OpenBSD a inventé la separation de privilèges, le sandboxing), mais expose des défauts réels : regreSSHion (CVE-2024-6387) — RCE non authentifiée via race de handler de signal (async-signal-unsafe) = classe sûreté- mémoire (C) ; Terrapin (CVE-2023-48795) — faille protocolaire (troncature de préfixe, corrigée par « strict kex ») ; surface legacy (agent/X11/port forwarding) ; vecteur xz via libsystemd lié à sshd dans les distros.
  2. SSH ≠ TLS sur trois points décisifs :
    • Pas d’option Rust mature. L’équivalent Rust est russh (communautaire) — bien moins audité/éprouvé que rustls. Il n’existe pas de SSH Rust de calibre rustls. L’argument « réutiliser le mûr » (décisif pour TLS) est donc faible ici.
    • Surface bien plus grande : transport (BPP/kex/rekey) + auth (publickey/password/ keyboard-interactive/certificats) + connexion (canaux/multiplexage/forwardings/pty/ exec/SFTP). Plus gros que TLS 1.3 ; un sshd maison = surface d’attaque distante critique (classe regreSSHion).
    • Même base crypto (RustCrypto) et memory-safe des deux côtés (russh ou maison) → tous deux éliminent la classe regreSSHion ; la différence est la maturité de correction protocolaire.
  3. SSH n’est pas sur le chemin critique : c’est un protocole applicatif couche 2+ ; Air construit par le bas (ADR-011) et, en incubation (ADR-013), les outils Unix classiques — dont l’OpenSSH système — tournent normalement.

Décision

Court terme : air-ssh est DIFFÉRÉ ; Air s’appuie sur l’OpenSSH du système pendant l’incubation. À terme (cadrage réseau couche 2) : air-ssh MAISON (memory-safe Rust), PAS russh — car russh n’est pas de calibre « confiance les yeux fermés » pour un sshd (surface distante critique), contrairement à rustls pour TLS. russh reste une référence à étudier / base possible si fortement auditée. Client (ssh/scp/sftp) livrable AVANT le serveur (sshd), traité avec un soin extrême (audit externe avant exposition).

Exigences gravées du futur air-ssh (quand il sera planifié)

  • Memory-safe Rust (élimine par construction la classe regreSSHion).
  • Anatomie 9-composants de la note réseau (Framer/Codec/Handshaker… ) — sans-IO, composants fuzzés isolément (Handshaker/Framer = surface hostile).
  • « Strict kex » anti-Terrapin dès le départ ; « moderne uniquement » (pas de vieux kex/ciphers — comme rustls pour TLS) ; surface forwarding minimale et explicite.
  • Crypto = RustCrypto (jamais réécrite — frontière primitives/protocole, cf. ADR-042).
  • Homologation : interop OpenSSH + conformité RFC 4250-4254 (+ 4256, certificats), fuzzing, et audit externe du sshd avant toute exposition.
  • Client avant serveur : ssh/scp/sftp (risque moindre) d’abord ; sshd ensuite.

Conséquences

  • Aucun code maintenant : pas de crate air-ssh tant que la couche 2 réseau n’est pas planifiée. La note réseau marque air-ssh « maison, différé ».
  • Choix maison vs russh ré-arbitrable au moment du cadrage si russh atteint une maturité/ un audit comparables (peu probable à court terme) — la direction par défaut reste maison.
  • Pas d’exception C (contrairement à TLS) : air-ssh maison + RustCrypto = zéro surface C. (L’OpenSSH système utilisé en incubation est hors périmètre Air.)
  • Sécurité d’incubation : tant qu’on utilise l’OpenSSH système, on hérite de ses CVE (regreSSHion…) — assumé et temporaire, comme toute la coexistence ADR-013.

Alternatives écartées

  • air-ssh maison d’emblée : chantier énorme + risque maximal (sshd distant), sans nécessité (OpenSSH système suffit en incubation) → différé, pas écarté (c’est la cible).
  • Bâtir sur russh maintenant : memory-safe mais maturité insuffisante pour un daemon distant critique ; resterait à durcir/auditer autant qu’un maison → bénéfice incertain. Gardé comme référence/base auditée possible.
  • Renoncer à un SSH natif (OpenSSH à vie) : contraire à l’ambition « tout maison / zéro-C / souveraineté » d’Air sur la connectivité tier-1.

Adoption

Documentaire immédiat (ADR-043 + registre/INDEX/SUMMARY + note réseau : air-ssh « maison, différé ; OpenSSH système en incubation »). Implémentation au cadrage réseau couche 2 (spec air-ssh : périmètre client/serveur, algorithmes, SFTP, régime d’homologation).