Wie ermöglicht macOS Standardbenutzern das Ping?

Ich habe hier eine ziemlich tiefgründige Frage, die hoffentlich jemand beantworten kann. In macOS können normale Benutzer sowohl pingen als auch rooten. Normalerweise ist Root-Zugriff erforderlich, um den Raw-Socket zu öffnen, der zum Ausführen von Ping erforderlich ist. Ich habe unter Linux festgestellt, dass dies normalerweise durch Hinzufügen erweiterter Attribute zur Ping-Programmdatei erreicht wird, um Zugriff auf Root-Ebene zum Öffnen von Raw-Sockets zu ermöglichen (in der Vergangenheit wurde dies getan, indem einfach das setuid-Bit im Ping-Programm gesetzt wurde, um es zuzulassen irgendetwas in seiner Programmierung als root zu tun).

Ich habe mir /sbin/ping auf macOS (insbesondere High Sierra) angesehen, und keine solchen Attribute sind festgelegt, und keines von beiden ist setuid. Was tut macOS also, um Standardbenutzern (Nicht-Root-Benutzern) das Ping zu ermöglichen? Senden sie ICMP-Pakete über TCP oder UDP? Wenn ja (oder wenn es einen anderen Mechanismus gibt, den ich komplett vermisse), können Sie mir einige Dokumente zeigen? Jede Hilfe wäre willkommen.

ICMP liegt eine Ebene unterhalb der Transportschicht (TCP, UDP...)!
Könnten Sie dokumentieren, dass „normalerweise Root-Zugriff erforderlich ist, um den Raw-Socket zu öffnen“. Dies scheint einfach 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.
Fragen Sie, wie Sie als Standardbenutzer pingen können oder wie Apple Standardbenutzern das Ping ermöglicht? Nur für etwas Klarheit.
@bmike - Ich bin mir nicht sicher, was Sie mit "Suche nach externen Referenzen" meinen. Ich habe in Stack Exchange keine Regel gesehen, die das Verlinken auf andere Websites verbietet / davon abhält. Im Gegenteil, das ist eine gängige und nützliche Praxis. Vielleicht interpretiere ich Ihre Aussage falsch, also wenn Sie einen (vor Ort) Link haben, der das und andere Regeln, die ich wissen muss, erklärt, würde ich es schätzen.

Antworten (1)

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: "Öffnen Sie den Socket in DGRAM (Datagrammmodus), wenn wir nicht root sind. Wenn wir root sind, öffnen Sie ihn als Raw".

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

Es gibt jedoch einige Flags, an die übergeben werden kannping , für die root erforderlich ist, und für diese erhalten Sie ein "Operation Not Permitted". Zum Beispiel:

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

Wenn ich als Root ausgeführt werde, bekomme ich die Operation nicht erlaubt. Mit der Implementierung von Apple können Sie also Standard-Ping-Operationen ausführen, für die kein Root erforderlich ist, für die Sie jedoch bestimmte Flags und Operationen als Root ausführen müssen.

Abhängig davon, ob Sie root sind, können einige zusätzliche Socket-Optionen festgelegt werden:

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