У чому полягає використання "магічних аргументів" у виклику перезавантаження системи Linux?


10

Коли я читав вихідний код Linux, а точніше код системних викликів, натрапив на sys_rebootреалізацію: http://lxr.free-electrons.com/source/kernel/reboot.c#L199 .

199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200                 void __user *, arg)
201 {
202        ...
...    
286 }

У середині є цей специфічний фрагмент коду:

209 
210         /* For safety, we require "magic" arguments. */
211         if (magic1 != LINUX_REBOOT_MAGIC1 ||
212                         (magic2 != LINUX_REBOOT_MAGIC2 &&
213                         magic2 != LINUX_REBOOT_MAGIC2A &&
214                         magic2 != LINUX_REBOOT_MAGIC2B &&
215                         magic2 != LINUX_REBOOT_MAGIC2C))
216                 return -EINVAL;

Цікаво, яку саме "безпеку" вона насправді забезпечує. Я маю на увазі, чи це не допустити зловживань? У цьому випадку, оскільки параметри є загальнодоступними, будь-яка бібліотека чи програма може неправильно використовувати системний виклик, навіть якщо вони зобов'язані передавати параметри. Що я пропустив?


Це, ймовірно, випадкові дзвінки, наприклад, з пошкодження пам’яті або введення помилки в номер syscall. Чи це насправді щось, про що варто турбуватися, не знаю.
дероберт

@derobert Має сенс, але ... чи не всі системні виклики потребують такого захисту? За винятком getpidподібних, звичайно, вони можуть мати непередбачувані наслідки при неправильному використанні. А може бути, у всіх інших системних викликів вже є достатньо параметрів, щоб їх перевірити, щоб зробити їх нешкідливими, якщо вони неправильно викликані. Мені здається, що це дивне уявлення про "безпеку" для мене, хоча ...
lgeorget

Справді. Я не впевнений, чи в один момент Лінус гнав помилку, яка тримала # $ & #! перезавантажити свою машину або якщо хтось просто додав її через те, що вони були параноїком і т. д. Від чого слід захищати, досить зрозуміло; Чому захист від цього потрібен, це хороше питання.
derobert

@derobert Можливо, перехоплення від когось, що звикло до інтегральних мікросхем, де багато чіпів реалізують якусь функцію захисту, щоб увімкнути функцію відключення (потрібно записати біти XYZ у спеціальний реєстр перед тим, як працюватиме інструкція щодо вимкнення). Не впевнений, чи терміни для цього мають сенс,
mbrig

Відповіді:


10

На це питання відповіли в цьому питанні Super User:

В основному, невелике перевернення адреси може змусити програму думати, що вона викликає один системний виклик, коли насправді вона викликає reboot()системний виклик. Оскільки reboot()це дуже руйнівна, не синхронізуюча операція, яка стирає стан системи - таким чином, стираючи докази проблеми біт-фліп, яка в іншому випадку була б викрита як програмна помилка чи паніка - Linux включає додаткові захисти навколо її успішного використання .

Цікаво, що другий набір магічних чисел відповідає дням народження Лінуса та його трьох дочок:


1
Ах, я не думав про перевірку інших сайтів. Я ніколи не думав, що це питання може належати інакше, ніж тут. У будь-якому випадку, дякую за вашу відповідь. :-)
lgeorget
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.