TTL, ICMP-Fehler, und wie eine App in der Sandbox das trotzdem schafft
Ein IPv4-Header trägt ein 8-Bit-TTL-Feld (in IPv6 heißt es Hop Limit), dessen einziger Zweck darin besteht, Pakete am ewigen Kreisen zu hindern. Jeder Router, der ein Paket weiterleitet, zieht eins ab; erreicht es null, verwirft der Router das Paket und schickt eine ICMP-Time-Exceeded-Nachricht zurück, Typ 11 Code 0, abgesendet von der Schnittstelle, auf der das Paket eintraf.
Traceroute macht aus diesem Fehlermodus eine Messung. Es sendet eine Sonde mit TTL 1, die am ersten Router stirbt und einen Fehler auslöst, der ihn benennt. Dann TTL 2, dann TTL 3, und arbeitet sich Hop für Hop nach außen vor. Drei Sonden je TTL ergeben die drei Zeiten in jeder Zeile. Wie das Ziel erkannt wird, hängt vom Sondentyp ab: Der BSD-Traceroute unter macOS sendet UDP-Datagramme an unwahrscheinliche hohe Ports ab 33434 und wertet ein ICMP Port Unreachable (Typ 3, Code 3) als Ankunftssignal, während das Windows-tracert ICMP Echo Requests sendet und bei einer Echo Reply aufhört. Dieser Unterschied ist nicht kosmetisch. Firewalls behandeln UDP-Sonden und ICMP Echo sehr verschieden, dasselbe Ziel erzeugt von einem Mac und von einer Windows-Maschine aus also berechtigterweise unterschiedliche Sternchen-Hops; prüfen Sie beides, bevor Sie einen Router beschuldigen.
Womit wir bei der Frage sind, die alle falsch beantworten, eine frühere Fassung dieser Seite eingeschlossen: Kann eine App in der Sandbox das überhaupt?
Die Argumentation, die Nein sagt, geht so. /usr/sbin/traceroute wird unter macOS setuid root installiert, /sbin/ping nicht, also muss Traceroute Privilegien brauchen, die Ping nicht braucht; die App Sandbox gewährt solche Privilegien nicht; also kein Traceroute in einer App-Store-App. Jeder Schritt klingt vernünftig, und die Schlussfolgerung ist trotzdem falsch, denn die Prämisse verwechselt den vom BSD-Traceroute gewählten Sondentyp mit Traceroute als Technik. Dieses Binary sondiert mit UDP-Datagrammen und braucht einen Raw-Socket, um die dadurch ausgelösten ICMP-Fehler zu lesen, daher das setuid. Sondieren Sie stattdessen mit ICMP Echo, und die Antworten treffen auf demselben Datagramm-ICMP-Socket ein, den Ping schon ohne Privilegien nutzt. setsockopt(IP_TTL) ist kein privilegierter Aufruf.
SSHive steuert also überhaupt kein Systembinary. Es öffnet socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP), setzt die TTL, sendet drei Echo Requests je Hop und liest, was zurückkommt: ein Time Exceeded, das einen Router benennt, eine Echo Reply, die heißt, dass das Ziel geantwortet hat, oder innerhalb von zwei Sekunden nichts, was als Sternchen erscheint. Das wurde unter sandbox-exec mit den echten Entitlements der App gemessen, bevor irgendetwas davon ausgeliefert wurde, und es zeigte eine Falle, die eine Wiederholung wert ist: Mit com.apple.security.network.client allein geht die Sonde hinaus und die Antwort wird mit EPERM abgewiesen, ein stiller Fehlschlag, der genau wie ein filterndes Netz aussieht. com.apple.security.network.server wird ebenfalls gebraucht. SSHive deklariert beide, weshalb die App-Store-Version in der Sandbox überhaupt eine echte Trace liefert statt einer Spalte voller Sternchen.
iOS kommt über denselben Weg an denselben Punkt. Network.framework stellt TCP, UDP, QUIC und TLS bereit und überhaupt kein ICMP, aber es ist nicht die einzige verfügbare API: Die BSD-Socket-Schicht darunter nimmt denselben Datagramm-ICMP-Socket an, und Apples eigenes SimplePing-Beispiel führt das seit Jahren vor. Die iPhone- und iPad-Versionen führen dieselbe Schleife über dreißig Hops und drei Sonden aus wie der Mac.
Kennen Sie die Grenzen, bevor Sie sich darauf stützen. Die Hop-Obergrenze liegt fest bei 30, es gibt keine Schalter für Protokoll, Port oder Sondenzahl, und keine ASN- oder Geolokalisierungs-Anreicherung. Weil die Sonden ICMP Echo statt UDP sind, kann eine Firewall, die das eine erlaubt und das andere verwirft, ein anderes Sternchenmuster erzeugen als /usr/sbin/traceroute; keines der beiden Ergebnisse ist falsch, und die beiden zu vergleichen ist gelegentlich genau die Art, wie man die Firewall findet.