Wie können Standardbenutzer unter macOS pingen?

2

Ich habe hier eine ziemlich tiefe Frage, die hoffentlich jemand beantworten kann. In macOS können normale Benutzer sowohl Ping- als auch Root-Befehle ausführen. Normalerweise ist Root-Zugriff erforderlich, um den Raw-Socket zu öffnen, der zum Ausführen von Ping erforderlich ist. Unter Linux ist mir aufgefallen, dass dies in der Regel dadurch erreicht wird, dass der Ping-Programmdatei erweiterte Attribute hinzugefügt werden, um den Root-Zugriff zum Öffnen von Raw-Sockets zu ermöglichen (in der Vergangenheit wurde dazu lediglich das setuid-Bit im Ping-Programm gesetzt und zugelassen) um irgendetwas in seiner Programmierung als root zu tun).

Ich habe / sbin / ping unter macOS (High Sierra) angeschaut, und es sind keine derartigen Attribute festgelegt, und es ist auch keine setuid festgelegt. Was macht macOS, um Standardbenutzern (Nicht-Root-Benutzern) das Pingen zu ermöglichen? Senden sie ICMP-Pakete über TCP oder UDP? Wenn ja (oder wenn es einen anderen Mechanismus gibt, den ich nur ganz vermisse), können Sie mich auf einige Dokumente verweisen? Jede Hilfe wäre dankbar.

le_jawa
quelle
ICMP ist eine Ebene unter der Transportschicht (TCP, UDP ...)!
klanomath
1
Könnten Sie dokumentieren, dass "normalerweise Root-Zugriff erforderlich ist, um den Raw-Socket zu öffnen". Dies scheint einfach so zu sein, dass macOS Ihre Erwartungen nicht erfüllt und ich möchte vermeiden, dies als unklar zu schließen / nach externen Referenzen zu suchen. Ganz einfach, das Sicherheitsmodell erfordert nicht die von Linux gewählten Verbote.
bmike
Fragen Sie sich, wie Sie als Standardbenutzer pingen können oder wie Apple Standardbenutzern das Pingen ermöglicht? Nur aus Gründen der Klarheit.
Melvin Jefferson
@bmike - Ich bin mir nicht sicher, was Sie unter "Suche nach externen Referenzen" verstehen. Ich habe keine Regel in Stack Exchange gesehen, die das Verknüpfen mit anderen Sites verbietet / verhindert. Im Gegenteil, das ist eine gängige und nützliche Praxis. Vielleicht interpretiere ich Ihre Aussage falsch. Wenn Sie also einen Link (vor Ort) haben, in dem das und andere Regeln aufgeführt sind, die ich kennen muss, würde ich es begrüßen.
le_jawa

Antworten:

4

Werfen wir einen Blick auf den Quellcode für Apples pingImplementierung. Insbesondere sehen wir Folgendes:

if (getuid())
    s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
else
    s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
sockerrno = errno;

getuidGibt 0 zurück, wenn root. Dieser Code sagt also: "Öffne den Socket in DGRAM (Datagramm-Modus), wenn wir nicht root sind. Wenn wir root sind, öffne als raw".

Ein Raw-Socket wird also nur verwendet, wenn Sie als Root angemeldet sind. Ein IMCP-Ping-Paket ist ein Standard-DGRAM-Paket und erfordert keine Raw-Sockets.

Es gibt jedoch einige Flags, die können zu übergeben werden , pingdass root benötigen, und für diejenigen , werden Sie eine „Operation verboten“ erhalten. Zum Beispiel:

>ping -f
ping: -f flag: Operation not permitted

Bei der Ausführung als root bekomme ich die Operation nicht erlaubt. Mit der Implementierung von Apple können Sie also Standard-Ping-Vorgänge ausführen, für die kein Root-Benutzer erforderlich ist. Für bestimmte Flags und Vorgänge müssen Sie jedoch als Root-Benutzer ausgeführt werden.

Abhängig davon, ob Sie als Root angemeldet sind, werden möglicherweise einige zusätzliche Socket-Optionen festgelegt:

if (uid == 0)
    (void)setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&hold,
        sizeof(hold));
vcsjones
quelle
Ich hatte keine Ahnung, dass Apple diesen Quellcode veröffentlicht hatte. Fantastisch! Und das beantwortet meine Frage, vielen Dank.
le_jawa