作者:阿花-我们寝室的猫 | 来源:互联网 | 2023-05-27 10:58
对于使用Google Protocol Buffers C++实现的用户,它如何处理恶意或格式错误的邮件?它会崩溃或继续运行吗?我的应用程序肯定会在某些时候收到恶意数据,我不希望每次收到格式错误的邮件时都会崩溃.这是我在这个问题上找到的唯一答案(谷歌邮件列表).
在代码发布之前,专门针对安全问题进行了审核.至少对于C++和Java实现,有各种安全措施来防止损坏或恶意数据.protobuf库提供的整体消息大小也有限制(CodedInputStream :: SetTotalBytesLimit); 它还提供了一个递归限制,以防止深层嵌套的消息吹出堆栈.还有其他内部实现细节可以避免内存耗尽(最明显的是接收指示长度分隔的巨大值的消息).
Richard Hodg..
12
我在一个非常注重安全的面向Web的应用程序中使用c ++ google协议缓冲区.
查看生成的代码,所有反序列化工作都委托给每个消息::MergePartialFromCodedStream
方法中的自动生成代码.这些方法是通过对数据类型和长度的全面检查生成的,到目前为止我们没有遇到任何问题.
您可能希望自行关闭的一个攻击区域是protobuf数据的框架 - 协议缓冲区本身不会将序列化消息的整体大小序列化为任何类型的标准化标头中的流,因此您可能希望(因为我) do)将所有协议缓冲区消息包装在一个帧中.为了我的目的,帧头只包含一个消息大小,这意味着我可以在尝试从线路上读取消息之前确定消息的内存要求,更不用说解码它了.
此时可以进行简单检查以拒绝消息(或丢弃连接),如果大小不可行.
可以进一步开展工作,将这个框架包装在一个公钥包络方案中,以防止你的会话被中间人劫持,如果这是一个问题.
的消息(例如一个字符串得到太长)内的缓冲区溢出不能发生,因为bytes
和string
字段内部由表示std::string
,当数据被附加到其上,其自动增长其内存占用量.
然而:
无法保证恶意客户端不会寻求对包含无效数据的有效消息进行编码.例如,如果您的服务器应用程序从数据字符串中获取方法名称,查找其地址并调用它,那么这是一个明显的攻击向量.
如果不全面检查操作是否被特别允许,则不应允许客户端数据查找服务器代码.
一些必须做的事情的例子:
允许客户端在文本字段中向您发送SQL
允许客户端发送的命令行,你随后传递给system()
,exec()
,spawn()
等...
允许客户端向您发送共享库的名称和其中的函数名称...
等等.
1> Richard Hodg..:
我在一个非常注重安全的面向Web的应用程序中使用c ++ google协议缓冲区.
查看生成的代码,所有反序列化工作都委托给每个消息::MergePartialFromCodedStream
方法中的自动生成代码.这些方法是通过对数据类型和长度的全面检查生成的,到目前为止我们没有遇到任何问题.
您可能希望自行关闭的一个攻击区域是protobuf数据的框架 - 协议缓冲区本身不会将序列化消息的整体大小序列化为任何类型的标准化标头中的流,因此您可能希望(因为我) do)将所有协议缓冲区消息包装在一个帧中.为了我的目的,帧头只包含一个消息大小,这意味着我可以在尝试从线路上读取消息之前确定消息的内存要求,更不用说解码它了.
此时可以进行简单检查以拒绝消息(或丢弃连接),如果大小不可行.
可以进一步开展工作,将这个框架包装在一个公钥包络方案中,以防止你的会话被中间人劫持,如果这是一个问题.
的消息(例如一个字符串得到太长)内的缓冲区溢出不能发生,因为bytes
和string
字段内部由表示std::string
,当数据被附加到其上,其自动增长其内存占用量.
然而:
无法保证恶意客户端不会寻求对包含无效数据的有效消息进行编码.例如,如果您的服务器应用程序从数据字符串中获取方法名称,查找其地址并调用它,那么这是一个明显的攻击向量.
如果不全面检查操作是否被特别允许,则不应允许客户端数据查找服务器代码.
一些必须做的事情的例子:
允许客户端在文本字段中向您发送SQL
允许客户端发送的命令行,你随后传递给system()
,exec()
,spawn()
等...
允许客户端向您发送共享库的名称和其中的函数名称...
等等.
我同意这个答案.我要补充一点:作为一个安全人员,我永远不会断言我的代码是100%安全的.但作为大多数Protobuf C++和Java库的作者,我可以告诉您,我从未意识到此代码中存在任何安全漏洞.:)