Как ограничить созданный мной дескриптор ресурса одним клиентом из общей библиотеки linux - PullRequest
0 голосов
/ 26 мая 2020

У меня есть разделяемая библиотека, которая выдает целочисленный дескриптор клиенту после успешного запроса на соединение. Что-то вроде:

int ConnectionRequest(const std::string& authorization_token);

Последующие действия должны использовать этот дескриптор для доступа к дальнейшим операциям:

result DoOperation(int handle, const std::string& payload);

Мне пришло в голову, что второй клиент может захватить соединение, просто представив правдоподобное значение дескриптора интерфейса. Как однозначно связать дескриптор с клиентом, который сделал исходный запрос? Есть ли способ получить идентификатор процесса от клиента и проверить его?

Внутри я использую std :: map, чтобы связать дескриптор с объектом shared_ptr. Все это в пользовательском пространстве.

Кодирование на linux на C ++.

1 Ответ

0 голосов
/ 26 мая 2020

И Linux, и Windows уже решили эту проблему - вы можете посмотреть на их реализации, чтобы найти рабочий метод.

Короче говоря, используйте несколько таблиц.

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

Вы можете продублировать это поведение, сначала просмотрев таблицу дескрипторов по идентификатору процесса, а затем просмотрев структуру с предоставленным дескриптором. Если идентификатор процесса не существует в карте таблицы дескрипторов, вернуть ошибку. В противном случае запустите функцию для структуры, на которую ссылается дескриптор, если он существует.

...