Як macOS дозволяє стандартним користувачам пінг


2

У мене тут досить глибоке запитання, на яке я сподіваюся, що хтось може відповісти. У macOS постійні користувачі можуть пінг і root. Зазвичай кореневий доступ потрібен для відкриття необробленого сокета, необхідного для запуску ping. Я помітив в Linux, що це зазвичай здійснюється шляхом додавання розширених атрибутів у файл програми ping, щоб дозволити доступ до кореневого рівня для відкриття необроблених сокетів (раніше це робилося просто встановивши встановлений біт на програмі ping, дозволивши йому робити що-небудь у своєму програмуванні як root).

Я переглянув / sbin / ping на macOS (High Sierra, зокрема), і такі атрибути не встановлені, і жоден з них не встановлений. Отже, що робить macOS для того, щоб дозволити звичайним користувачам (не-root) користуватися пінгом? Посилають ICMP пакети через TCP або UDP? Якщо так (або якщо є інший механізм, якого я просто відсутній), можете вказати мені на деякі документи? Будь-яка допомога буде вдячна.


ICMP знаходиться на один рівень нижче транспортного шару (TCP, UDP ...)!
кланомат

1
Чи можете ви задокументувати "нормально, для відкриття необробленого сокета потрібен кореневий доступ". Це, мабуть, просто macOS не відповідає вашим очікуванням, і я хотів би уникнути закриття цього, оскільки це нечітко / шукати посилання на сайт. Простіше кажучи, модель безпеки не вимагає заборон, які Linux вибрав.
bmike

Ви запитуєте, як пінг як стандартний користувач або як Apple дозволяє звичайним користувачам пінг? Просто для ясності.
Мелвін Джефферсон

@bmike - Я не впевнений, що ви маєте на увазі під "пошуком посилань на сайти". Я не бачив правила в Stack Exchange, яке забороняє / відмовляє від посилань на інші сайти. Навпаки, це звичайна і корисна практика. Можливо, я неправильно трактую ваше твердження, тому якщо у вас є посилання (на місці), в якому написано це та інші правила, які мені потрібно знати, я би вдячний.
le_jawa

Відповіді:


4

Давайте розглянемо вихідний код для pingреалізації Apple . Помітно, ми бачимо це:

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

getuidповертає 0, якщо root. Отже, цей код говорить: "відкрий сокет у DGRAM (режим дейтаграми), якщо ми не root. Якщо ми root, відкрий як сирий".

Отже, сира розетка використовується лише тоді, коли ви маєте корінь. Пакет піктограми IMCP - це стандартний пакет DGRAM і не потребує необроблених сокетів.

Однак є деякі прапори, які можна передавати для pingцього, вимагаючи root, і для них ви отримаєте "Операція не дозволена". Наприклад:

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

Коли запускається як root, я не вважаю, що операція не дозволена. Таким чином, реалізація Apple дозволить вам виконувати стандартні операції ping, які не потребують root, але вимагають запускати як root для певних прапорів та операцій.

Залежно від того, чи є ви root, він може встановити деякі додаткові параметри сокета:

if (uid == 0)
    (void)setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&hold,
        sizeof(hold));

Я не мав уявлення, що Apple випустила цей вихідний код. Фантастичний! І це відповідає на моє запитання, дякую велике.
le_jawa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.