Journal L'étrange affaire du port 0

Posté par  (site Web personnel) . Licence CC By‑SA.
Étiquettes :
63
18
avr.
2021

Cette semaine je me suis posé une question en écrivant un validateur pour le fichier de configuration d'une application: est-ce que je dois autoriser mon application à se connecter au port TCP 0?

La réponse est non, a priori. Ce port est marqué réservé dans la liste des ports de l'IANA, et avec les APIs POSIX, ce n'est pas possible de faire un serveur écoutant sur ce port: le système choisira un autre port au hasard.

Cependant, sur internet, des paquets circulent qui utilisent ce port, aussi bien comme source que comme destination. Qui sont ils? Ou vont-ils? Certaines réponses se trouvent dans cet article.

On y trouve donc:

  • Du traffic généré pour faire du DDoS (qui s'attaque à tous les ports, y compris celui-ci)
  • Du scanning de ports, mais ça n'a pas l'air d'être un des outils connus (par exemple en utilisant le port 0 comme port source pour scanner d'autres ports)
  • Enfin, du fingerprinting, en utilisant des flags TCP un peu inhabituels, il est possible d'identifier le système d'exploitation qui répond à ces paquets
  • # on en apprend tous les jours !

    Posté par  . Évalué à 10 (+10/-0).

    Merci beaucoup d'avoir partagé cela !
    Ça part d'une question à priori bête (je ne m'étais jamais posé par manque de curiosité), mais qui débouche sur des liens super intéressants.
    C'est un peu un des mécanismes de la vulgarisation scientifique :)

  • # Noyau Linux

    Posté par  (site Web personnel) . Évalué à 10 (+12/-0).

    Merci pour ce partage.

    Et l'info de l'article de 2015 est toujours vraie : source du noyau Linux : https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/ipv4/inet_connection_sock.c?h=v5.12-rc7#n350

    /* Obtain a reference to a local port for the given sock,
     * if snum is zero it means select any available local port.
     * We try to allocate an odd port (and leave even ports for connect())
     */
    int inet_csk_get_port(struct sock *sk, unsigned short snum)
    • [^] # Re: Noyau Linux

      Posté par  . Évalué à 2 (+3/-3).

      Je ferais mon chieur, je demanderais la RFC qui stipule ce comportement, ou au moins qui indique que le port 0 n'est pas utilisable.

      Mais bon, je ne suis pas un chieur, donc ça ira

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Noyau Linux

        Posté par  . Évalué à 8 (+6/-0).

        Le port zéro est indiqué comme réservé page 9 dans la RFC 1340, en TCP comme en UDP.

        Cette RFC est rendu obsolète par transitivité par la RFC 3232 :

        Since 1994, this sequence of RFCs have been replaced by an online
        database accessible through a web page (currently, www.iana.org).

        Je n'ai pas trouvé l'info sur iana.org après 5 minutes de recherche et j'ai abandonné. Je suis un peu perdu, ça ne ressemble pas du tout à une RFC.

        • [^] # Re: Noyau Linux

          Posté par  (site Web personnel) . Évalué à 5 (+3/-0). Dernière modification le 18/04/21 à 17:15.

          C'est le premier lien dans le journal, la liste des ports TCP et UDP avec une recherche sur ceux qui sont "réservés". Il n'y a pas plus de détails.

          Mais ça n'indique pas l'API "choix d'un port au hasard". Cependant, s'agissant d'une API, c'est plutôt du côté de la spécification POSIX que des RFC qu'il faudrait chercher.

          • [^] # Re: Noyau Linux

            Posté par  (site Web personnel) . Évalué à 5 (+3/-0).

            Mais ça n'indique pas l'API "choix d'un port au hasard". Cependant, s'agissant d'une API, c'est plutôt du côté de la spécification POSIX que des RFC qu'il faudrait chercher.

            Je trouve rien à ce sujet dans POSIX:2001 mais ça existe effectivement depuis au moins 4.2 BSD : https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.2BSD/usr/src/sys/netinet/in_pcb.c

            if (lport == 0)
            do {
            if (head->inp_lport++ < IPPORT_RESERVED)
            head->inp_lport = IPPORT_RESERVED;
            lport = htons(head->inp_lport);
            } while (in_pcblookup(head, zeroin_addr, 0, inp->inp_laddr, lport, 0));

            pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Port 22

    Posté par  . Évalué à 10 (+15/-0). Dernière modification le 18/04/21 à 17:18.

    Récemment c'est l'histoire du port 22 que j'ai lu (The story of getting SSH port 22).

    En particulier Tatu Ylonen (concepteur de SSH) a choisi 22 car il voulait remplacer telnet (port 23) et ftp (port 21) et quand il a demandé l'obtention de à l'IANA a reçu un mail surprenant de simplicité :

    Date: Mon, 10 Jul 1995 15:35:33 -0700
    From: jkrey@ISI.EDU
    To: ylo@cs.hut.fi
    Subject: Re: request for port number
    Cc: iana@ISI.EDU
    
    Tatu, We have assigned port number 22 to ssh, with you as the point of contact.  Joyce
    
    • [^] # Re: Port 22

      Posté par  (site Web personnel) . Évalué à 0 (+3/-5). Dernière modification le 19/04/21 à 00:49.

      C'est pas trop la simplicité qui m'étonne, mais plutôt le fait qu'il s'est écoulé 14 heures entre la demande et l'obtention, avec la RFC d'un nouveau protocole mettant en avant la sécurité qui était jointe à la demande. Donc soit les décideurs étaient des brutes (et ils l'étaient), soit la sécurité craignait un max (et elle craignait), mais ça me parait quand même super court pour l'audit d'un nouveau protocole qui se dit sécurisé. Sans compter qu'on ne leur a même pas fourni l'implémentation, qui aurait aussi potentiellement pu être moisie. Autres temps…

      • [^] # Re: Port 22

        Posté par  (site Web personnel) . Évalué à 10 (+12/-0).

        Si j'ai bien compris la réponse, c'était "ok, on a réservé le port 22 pour SSH". Ils ne disent pas avoir audité et validé le RFC pour SSH.

        C'est ça qui est fou en fait: l'auteur de SSH a pris pas mal de temps à faire son mail pour demander la réservation du port, il a pris la peine de joindre un brouillon de RFC et d'avoir une version stable presque prête et le lendemain (très rapidement) on lui répond juste "ok" 😅

        • [^] # Re: Port 22

          Posté par  . Évalué à 6 (+4/-0).

          Je comprends la réaction de libreforce. Si ssh n'avait pas eu ce succès, on aurait un port réservé pour rien, mais je pense qu'on se formalise beaucoup aujourd'hui. Si tu regarde la liste des ports réservés, il y a pas mal de réservations qui sont inutiles (le plus connu c'est le port 666 pour doom, mais il y en a des dizaines d'autres).

          • [^] # Re: Port 22

            Posté par  . Évalué à 2 (+1/-0).

            Tout à fait. Et j'en suis perso arrivé à la conclusion que ce groupe maintien surtout la liste des ports officiels et n'est pas là pour enquiquiner les gens qui font une demande de réservation (mais ça a peut-être évolué depuis.) Cependant, rien ne nous dit qu'ils ne lisent pas, bien que ne se formalisant pas de plus de question que ne l'aurait voulu les gens en face (après tout, la norme sous-jacente n'est pas vraiment de leur domaine/compétence) :

            • avec un nom aussi evil et pour faire du carnage, bah 666 colle bien et est libre
            • quelque chose qui mélange/fusionne ftp (21) et telnet (23) ou un truc du genre, bah ça tombe bien 22 est libre
            • etc.
          • [^] # Re: Port 22

            Posté par  (site Web personnel) . Évalué à 7 (+5/-0).

            La RFC https://tools.ietf.org/html/rfc6335 explique les procédures non seulement pour demander la réservation d'un port, mais aussi la façon dont les ports peuvent être révoqués à la demande de la personne qui a fait la réservation, ou sur décision de l'IANA (c'est une nouveauté par rapport aux versions précédentes de la RFC).

            Ils ont aussi calculé que au rythme actuel d'allocation des ports, on était tranquilles pour 85 ans avant de devoir ré-allouer des ports. On peut espérer que d'ici là, FTP sera bien mort et enterré?

            • [^] # Re: Port 22

              Posté par  (site Web personnel) . Évalué à 3 (+1/-0).

              Oui, ma remarque était sur le fait que le port risquait d'être alloué pour rien. Je ne savais pas que cela pouvait être révoqué par la suite, surtout vu l'âge des protocoles qu'on trouve dans les ports réservés, certains plus vraiment populaires. Cela explique l'apparente facilité à avoir un port.

              • [^] # Re: Port 22

                Posté par  . Évalué à 2 (+1/-0).

                Mouais,

                C'est juste une demande de réservation de port… Que tu demandes 22 ou 34 ne va rien changer à la sécurité…

                En plus eux aussi on du trouver ça cool d'avoir un remplaçant telnet/ftp juste au milieu…

                j'avais toujours trouvé ça bizarre d'avoir 22 avant 23, j'imaginais que c'était ouvert dans l'ordre de création des protocoles :D et du coup c'était pas logique :)

                "Gentoo" is an ancient african word, meaning "Read the F*ckin' Manual". "Gentoo" also means "I am what I am because you all are freaky n3rdz"

                • [^] # Re: Port 22

                  Posté par  (site Web personnel) . Évalué à 4 (+2/-0).

                  C'est juste une demande de réservation de port… Que tu demandes 22 ou 34 ne va rien changer à la sécurité…

                  Mon propos était que si les ports étaient alloués définitivement, on serait plus enclin à vérifier que le protocole/logiciel en question n'est pas bidon pour ne pas "gaspiller" un port.

                  Mais indiqué plus haut, la réservation peut être révoquée à tout moment, donc effectivement, on s'en fout.

      • [^] # Re: Port 22

        Posté par  . Évalué à 5 (+3/-0).

        bah c'est y'a longtemps. A cette époque, des numéros de ports il y en avait pleins. Le mec justifie sa demande par une explication pas trop mal branlée, le gars est d'accord, bim port 22.
        c'est juste une association port <-> service, pas une revue formelle de protocole. Les ports peuvent changer, les associations aussi, personne t'empêche de dévier de ce fichier, donc y'a pas de risque à accepter.

        Faut pas oublier que pendant longtemps, le DNS c'était un fichier texte /etc/hosts que les gens s'envoyaient par ftp et par mail (si si). Les gars se connaissaient tous par leurs prénoms et ça déconnait pas mal (les RFC du premier avril, le "I'm a teapot" etc…)

        Tout ça pour dire que 14h, ouais, ça me parait pas anormal.

  • # museum of broken packets

    Posté par  (site Web personnel) . Évalué à 6 (+4/-0).

    Voire aussi https://lcamtuf.coredump.cx/mobp/

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # À lire cette archive de 2013

    Posté par  . Évalué à 6 (+4/-0).

  • # Idem

    Posté par  . Évalué à 2 (+2/-0). Dernière modification le 18/04/21 à 21:37.

    Je me suis posé la même question cette semaine pour les raisons et je suis arrivé aux mêmes conclusions :p, mais je n'ai pas eu l'idée d'en faire un journal. Félicitation pour ta démarche !!!

  • # Gruik

    Posté par  (site Web personnel) . Évalué à 6 (+3/-0).

    C'est dommage d'utiliser un numéro pour identifier un service. Ce serait plus simple avec une url !

    Incubez l'excellence sur https://linuxfr.org/board/

    • [^] # Re: Gruik

      Posté par  . Évalué à 2 (+1/-0).

      🤣

      "Gentoo" is an ancient african word, meaning "Read the F*ckin' Manual". "Gentoo" also means "I am what I am because you all are freaky n3rdz"

    • [^] # Re: Gruik

      Posté par  (site Web personnel) . Évalué à 5 (+3/-0).

      Alors en fait, les numéros de ports sont associés à des noms et on peut utiliser par exemple getaddrinfo() pour faire la résolution du nom vers le numéro correspondant.

  • # Waouh !

    Posté par  . Évalué à 3 (+2/-0).

    Alors ton journal m'a permis de faire cette commande :

    $ nc -l 0

    Et de m'apercevoir que :

    LISTEN    0    1    0.0.0.0:35641    0.0.0.0:*    users:(("nc",pid=8XXXXX,fd=X))

    J'en suis tout retourné 🙃

    Du coup :

    $ nc -l 1
    nc: Permission denied

    là on retombe sur ce que je connais

    d'ailleurs : https://fr.wikipedia.org/wiki/TCP_Port_Service_Multiplexer

    $ getent services 1
    tcpmux                1/tcp

    Mais du coup ?

    $ sudo nc -l 0
    LISTEN    0    1    0.0.0.0:32827    0.0.0.0:*

    a bien le même comportement.

    Ok
    #meCoucheraiMoinsCon

    "Gentoo" is an ancient african word, meaning "Read the F*ckin' Manual". "Gentoo" also means "I am what I am because you all are freaky n3rdz"

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.