13 Stimmen

Was wären die Nachteile/Risiken bei der Verwendung von AF_UNSPEC?

En Beejs Leitfaden zur Netzwerkprogrammierung

Sie können die Verwendung von IPv4 oder IPv6 im Feld ai_family erzwingen oder es bei AF_UNSPEC belassen, um was auch immer zu verwenden. Das ist cool, weil Ihr Code IP-Versions-agnostisch sein kann.

Wie der Titel schon sagt - was wären die Nachteile (oder Risiken, wenn überhaupt), wenn man immer AF_UNSPEC anstelle der Angabe von IPv4 oder IPv6?

Oder ist es nur aus einem Grund - wenn die Version angegeben wird, wird dies garantieren, dass diese und nur diese Version unterstützt wird?


Ein kleiner Hintergrund - ich denke darüber nach, Unterstützung für IPv6 in Client-Server-Anwendungen (C++) hinzuzufügen, und beide Versionen sollten unterstützt werden. Also fragte ich mich, ob es in Ordnung ist, zu verwenden AF_UNSPEC oder es ist besser, die Adresse aus der Zeichenkette zu "erkennen" und die AF_INET6 o AF_INET je nach Adresse.

8voto

glglgl Punkte 84928

Man muss zwischen Client- und Serveranwendungen unterscheiden.

Auf dem Client ist es ganz einfach: Rufen Sie einfach getaddrinfo() und probieren Sie nacheinander alle Antworten aus, bis Sie eine Verbindung erhalten.

Auf dem Server sind die Dinge ein wenig schwieriger:

  • Es gibt Systeme, deren IPv4- und v6-Stacks zusammengeschaltet sind; dort reicht es aus, nur auf IPv6 zu hören. Vielleicht muss der Socket so eingestellt werden, dass er auf beide hört.
  • Andere Systeme, wie z. B. Windows XP, haben getrennte Stacks, bei denen diese Verbindung nicht möglich ist. Dort müssten Sie mit mehreren Sockeln gleichzeitig arbeiten. Im Folgenden möchte ich mich auf diese konzentrieren.

Auch auf Servern, getaddrinfo() verwendet werden können. Dort verwenden Sie das Flag AI_PASSIVE in den Hinweisen. Dann erhalten Sie Ergebnisse. Auf diese müssen Sie alle hören, vielleicht aktivieren Sie die IPV6_V6ONLY Flagge.

accept() sollte entweder nicht-blockierend oder mit select() o poll() (ich bin nicht sicher, ob letzteres möglich ist).

3voto

ClearCrescendo Punkte 1075

Eines der Risiken bei der Verwendung von AF_UNSPEC besteht darin, dass Sie den Client größeren Antworten eines bösartigen DNS-Servers aussetzen, der möglicherweise versucht, CVE-2015-7547 zu nutzen, um einen Stapelpufferüberlauf zu verursachen und die Ausführung von bösartigem Code durch den Client zu veranlassen. Ein vorgeschlagener Workaround für den bekannten Fehler in getaddrinfo besteht darin, die Verwendung von AF_UNSPEC zu verhindern, wie im Folgenden beschrieben aquí im Fehlerbericht. Der Überlauffehler bei DNS-Antworten, die größer als 2K sind, betrifft die Glibc ab 2.9 und ist in 2.23 behoben. Dies betrifft die meisten derzeit installierten Linux-Distributionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X