如何限制我从linux共享库生成的资源句柄给一个客户端

问题描述 投票:0回答:1

我有一个共享库,在成功连接请求后,该库将整数句柄分发给客户端。类似于:

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

随后的操作需要使用该句柄来访问进一步的操作:

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

[我突然想到,第二个客户端可以通过向接口提供合理的句柄值来劫持连接。如何将句柄唯一地链接到发出原始请求的客户端?有没有办法从客户端获取进程ID并进行检查?

[内部,我使用std :: map将句柄链接到shared_ptr对象。所有这些都在用户空间中。

在C ++中的Linux上编码。

c++ linux security shared-libraries handle
1个回答
0
投票

Linux和Windows都已经解决了这个问题-您可以查看它们的实现以获取可行的方法。

简而言之,使用多个表。

当引用内核给出的句柄时,系统需要确保流氓进程不能仅仅窃取您的文件句柄并访问您的数据。为此,系统创建一个每个进程的句柄表,其中仅包含与您的进程相关的句柄。如果流氓进程窃取了您的一个句柄并尝试使用它,则他们将无法访问您的数据-操作系统将为其句柄表建立索引,却一无所获,也找不到其资源之一。

您可以先通过进程ID查找句柄表,然后通过提供的句柄查找结构,来复制此行为。如果句柄表映射中不存在进程ID,则返回错误。否则,在句柄引用的结构上运行该函数(如果存在)。

© www.soinside.com 2019 - 2024. All rights reserved.