热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoogleProtocolBuffersC++在恶意数据面前实现稳定性和安全性

如何解决《GoogleProtocolBuffersC++在恶意数据面前实现稳定性和安全性》经验,为你挑选了1个好方法。

对于使用Google Protocol Buffers C++实现的用户,它如何处理恶意或格式错误的邮件?它会崩溃或继续运行吗?我的应用程序肯定会在某些时候收到恶意数据,我不希望每次收到格式错误的邮件时都会崩溃.这是我在这个问题上找到的唯一答案(谷歌邮件列表).

在代码发布之前,专门针对安全问题进行了审核.至少对于C++和Java实现,有各种安全措施来防止损坏或恶意数据.protobuf库提供的整体消息大小也有限制(CodedInputStream :: SetTotalBytesLimit); 它还提供了一个递归限制,以防止深层嵌套的消息吹出堆栈.还有其他内部实现细节可以避免内存耗尽(最明显的是接收指示长度分隔的巨大值的消息).

Richard Hodg.. 12

我在一个非常注重安全的面向Web的应用程序中使用c ++ google协议缓冲区.

查看生成的代码,所有反序列化工作都委托给每个消息::MergePartialFromCodedStream方法中的自动生成代码.这些方法是通过对数据类型和长度的全面检查生成的,到目前为止我们没有遇到任何问题.

您可能希望自行关闭的一个攻击区域是protobuf数据的框架 - 协议缓冲区本身不会将序列化消息的整体大小序列化为任何类型的标准化标头中的流,因此您可能希望(因为我) do)将所有协议缓冲区消息包装在一个帧中.为了我的目的,帧头只包含一个消息大小,这意味着我可以在尝试从线路上读取消息之前确定消息的内存要求,更不用说解码它了.

此时可以进行简单检查以拒绝消息(或丢弃连接),如果大小不可行.

可以进一步开展工作,将这个框架包装在一个公钥包络方案中,以防止你的会话被中间人劫持,如果这是一个问题.

的消息(例如一个字符串得到太长)内的缓冲区溢出不能发生,因为bytesstring字段内部由表示std::string,当数据被附加到其上,其自动增长其内存占用量.

然而:

无法保证恶意客户端不会寻求对包含无效数据的有效消息进行编码.例如,如果您的服务器应用程序从数据字符串中获取方法名称,查找其地址并调用它,那么这是一个明显的攻击向量.

如果不全面检查操作是否被特别允许,则不应允许客户端数据查找服务器代码.

一些必须做的事情的例子:

    允许客户端在文本字段中向您发送SQL

    允许客户端发送的命令行,你随后传递给system(),exec(),spawn()等...

    允许客户端向您发送共享库的名称和其中的函数名称...

等等.



1> Richard Hodg..:

我在一个非常注重安全的面向Web的应用程序中使用c ++ google协议缓冲区.

查看生成的代码,所有反序列化工作都委托给每个消息::MergePartialFromCodedStream方法中的自动生成代码.这些方法是通过对数据类型和长度的全面检查生成的,到目前为止我们没有遇到任何问题.

您可能希望自行关闭的一个攻击区域是protobuf数据的框架 - 协议缓冲区本身不会将序列化消息的整体大小序列化为任何类型的标准化标头中的流,因此您可能希望(因为我) do)将所有协议缓冲区消息包装在一个帧中.为了我的目的,帧头只包含一个消息大小,这意味着我可以在尝试从线路上读取消息之前确定消息的内存要求,更不用说解码它了.

此时可以进行简单检查以拒绝消息(或丢弃连接),如果大小不可行.

可以进一步开展工作,将这个框架包装在一个公钥包络方案中,以防止你的会话被中间人劫持,如果这是一个问题.

的消息(例如一个字符串得到太长)内的缓冲区溢出不能发生,因为bytesstring字段内部由表示std::string,当数据被附加到其上,其自动增长其内存占用量.

然而:

无法保证恶意客户端不会寻求对包含无效数据的有效消息进行编码.例如,如果您的服务器应用程序从数据字符串中获取方法名称,查找其地址并调用它,那么这是一个明显的攻击向量.

如果不全面检查操作是否被特别允许,则不应允许客户端数据查找服务器代码.

一些必须做的事情的例子:

    允许客户端在文本字段中向您发送SQL

    允许客户端发送的命令行,你随后传递给system(),exec(),spawn()等...

    允许客户端向您发送共享库的名称和其中的函数名称...

等等.


我同意这个答案.我要补充一点:作为一个安全人员,我永远不会断言我的代码是100%安全的.但作为大多数Protobuf C++和Java库的作者,我可以告诉您,我从未意识到此代码中存在任何安全漏洞.:)
推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
阿花-我们寝室的猫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有