Скажем, мой кусок кода сканирует каталог ./plugins
и загружает .dll
S/.so
S с известным символом («функции» здесь) для того, чтобы расширить свою functionnality, как это:Как я могу защитить загружаемые плагины?
main.c
#include <stdlib.h> #include <dirent.h> #include <string.h> #include <stdio.h> #include <dlfcn.h> int main(void) { DIR *dir; struct dirent *entry; dir = opendir("./plugins"); if (dir == NULL) return -1; while ((entry = readdir(dir)) != NULL) { void *handle; char path[PATH_MAX]; int (*function)(char *); if (strstr(entry->d_name, ".so") == NULL) continue; if (snprintf(path, sizeof(path), "./%s", entry->d_name) >= sizeof(path)) continue; handle = dlopen(path, RTLD_LAZY); if (handle == NULL) continue; // Better: report the error with `dlerror()' function = (int (*)(char *)) dlsym(handle, "function"); if (function != NULL) fprintf(stdout, "function: %d\n", function("example")); else fprintf(stderr, "symbol-not-found: %s\n", entry->d_name); dlclose(handle); } closedir(dir); return 0; }
Это может привести к серьезному вопросу безопасности: Если мое приложение работает как корень, или имеет право администратора, это означает, что любой непривилегированных злоумышленник может выполнить код в качестве привилегированного пользователя, производя общий объект, содержащий функцию с именем, как известный символ (h ere, function
).
Что я могу сделать для защиты своей папки plugins
? Как я могу проверить, безопасны ли загруженные объекты?
Это продолжение this question.
Не могли бы вы объяснить, почему вы заботитесь о безопасности плагинов? –
Это общая проблема. Безопасность должна иметь в виду каждый разработчик программного обеспечения, будь то безопасность его приложения или всей системы. Здесь вся система может быть взломана злоумышленником из-за моего кода. – Magix
Но почему вы не доверяете плагину? –