c – 通过网络发送指向静态功能的指针是否安全?

前端之家收集整理的这篇文章主要介绍了c – 通过网络发送指向静态功能的指针是否安全?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在考虑一些我必须在C中实现的RPC代码,我想知道将它通过网络发送到相同的二进制代码是否安全(以及在哪些假设下)(假设它完全相同并且它们在同一个二进制代码上运行)建筑).我猜虚拟内存在这里应该有所不同.

我只是出于好奇而问它,因为它在任何情况下都是一个糟糕的设计,但我想知道它是否在理论上是可行的(如果它可以扩展到除了程序可能包含的函数之外的其他类型的静态数据指针).

解决方法

一般来说,由于很多原因它并不安全,但是它的作用有限.首先,我将假设您在协议中使用某种签名或加密来确保数据流的完整性;如果没有,你已经有严重的安全问题,只能通过传递函数指针来复合.

如果在连接的两端运行完全相同的程序二进制文件,如果该函数在主程序中(或在从静态库链接代码中)而不在共享库中,并且如果程序未构建为位置 – 独立可执行文件(PIE),那么函数指针在两端都是相同的,并且通过网络传递它应该工作.请注意,这些是非常严格的条件,必须记录为使用您的程序的一部分,并且它们非常脆弱;例如,如果有人在一侧升级软件并忘记同时升级连接另一端的版本,那么事情将会发生可怕和危险的破坏.

我会避免这种类型的低级RPC完全支持更高级别的命令结构或抽象RPC框架,但如果你真的想这样做,一种稍微安全的方法是传递函数名称并使用dlsym或等效的看看他们.如果符号驻留在主程序二进制文件而不是库中,那么根据您的平台,您可能需要-rdynamic(GCC)或类似选项以使它们可用于dlsym. libffi也可能是一个抽象的有用工具.

此外,如果您想避免依赖于dlsym或libffi,您可以将自己的“符号表”硬编码在二进制文件中作为静态const线性表或哈希表映射符号名称函数指针. ELF中用于此目的的哈希表格式非常易于理解和实现,因此我可能会考虑在此基础上实现.

猜你在找的C&C++相关文章