Прежде чем вызывать chmod() для каталога, если вызывающая сторона не владеет каталогом, я бы хотела проверить, имеет ли вызывающая функция CAP_FOWNER.

По результатам поиска кажется, что я должен быть в состоянии проверить возможности CAP_FOWNER, вызвав capable(CAP_FOWNER) - но capable() нет среди моих справочных страниц и, похоже, не экспортируется <linux/capability.h> .

Какой правильный файл включения для capable() или, наоборот, какой самый простой / лучший способ проверить возможности linux?

2
Eric Westbrook 25 Апр 2017 в 04:10

2 ответа

Лучший ответ

Я думаю, что capable() доступен в исходных кодах ядра, но не для общего использования. Если вы пишете драйвер устройства или модуль, он должен быть доступен.

Если вы пишете программу пользовательского пространства, вы можете использовать функции, предоставляемые libcap; см. man capabilites и man libcap. Я бы предложил #include <sys/capability.h> и использовал cap_get_proc() и, возможно, CAP_IS_SUPPORTED(CAP_FOWNER).

Если это не очень хорошо, очевидным обходным решением является попытка chmod() в каталоге и обработка возможного сбоя.

2
mhawke 26 Апр 2017 в 13:13

Прежде чем вызывать chmod () для каталога, я хотел бы проверить, имеет ли вызывающая функция CAP_FOWNER.

У вас есть причина сделать это на стороне приложения? Если процесс вызывает chmod() (или любой другой системный вызов), ядро в любом случае проверит, разрешено ли процессу сделать это, и вернет EPERM или EACCES, если нет. Обнаружение, что это очень простой тест на стороне приложения, и что-то, что приложение должно делать в любом случае, так как приложение может не знать обо всем контроле доступа, выполняемом ядром. (Вспомните, например, SELinux.)

В общем, тестирование сначала звучит очень похоже на время проверки на время использования. С непривилегированным процессом это не проблема, но если ваш процесс выполняет какую-то работу от имени другого пользователя (с фактической привилегией процессов, которая выше, чем он хочет предоставить пользователю), он быстро становится единым целым.

2
ilkkachu 26 Апр 2017 в 13:21