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.
quelle
Antworten:
Werfen wir einen Blick auf den Quellcode für Apples
ping
Implementierung. Insbesondere sehen wir Folgendes:getuid
Gibt 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 ,
ping
dass root benötigen, und für diejenigen , werden Sie eine „Operation verboten“ erhalten. Zum Beispiel: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:
quelle