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.
Werfen wir einen Blick auf den Quellcode für Apples ping
Implementierung. 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;
getuid
gibt 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));
klanomath
Fahrrad
Melvin Jefferson
le_jawa