Я пишу очень портативный код безопасности. Я пытаюсь избежать недостатков безопасности в служебной программе, например этот, найденный в некоторых версиях sudo
:
... можно стать суперпользователем, запустив
sudo -k
, а затем сбросив системные часы до 01-01-1970.
Это происходит потому, что sudo
полагается на абсолютное время (aka calendar), чтобы определить, был ли время ожидания доступа.
Моя идея - использовать CLOCK_MONOTONIC
, определенный в time.h.
Из стандарта POSIX,
[CLOCK_MONOTONIC] определяется как часы, значение которых не может быть установлено через clock_settime() и которые не могут иметь обратные тактовые импульсы. Максимально возможный такт будет определяться реализацией.
Проблема во многих (наиболее?) системах, CLOCK_MONOTONIC
сбрасывается при перезагрузке. Есть ли какой-либо гарантированный POSIX-способ для определения того, перезагрузилась ли система с момента запуска последней программы?
Один (плохой) способ - проверить, больше или нет сохраненное значение часов больше текущего значения часов, однако это просто сдвигает проблему. В системах, где CLOCK_MONOTONIC
сбрасывается при перезагрузке, может быть короткое окно длины TIMEOUT
, где разрешен доступ.
Что мне не хватает, чтобы избежать этой проблемы?