中年区块链浏览器如何防止被DoS攻击?( 二 )


https://fake.sample.com/api/v1/blocks?limit=10
以上请求以“limit”参数中指示的数量获取区块信息 。 当限制设置为10时 , 它将返回最后10个区块的信息 。 当数字较小时 , 该请求可以正常工作 。
但是 , 后端可能没有对“limit”参数设置上限 。 当CertiK技术团队将“limit”参数设置为9999999并发送请求时 , 请求在被处理很久之后回复了“504 gateway time-out”错误 。 在服务器处理以上请求的同时 , 其他API的响应时间显着增加 。
9999999也超过了该链中的区块总数 。
假设是后端尝试获取区块链中每个区块的数据 。 如果攻击者发送了大量的高“limit”参数的请求 , 该服务器会无法对正常请求进行响应甚至可能直接崩溃 。
2. 嵌套的GraphQL查询
在调查过程中 , CertiK技术团队遇到了一些使用GraphQL的区块链资源 。 GraphQL是一种用于API的查询语言 。 相比于典型的 REST API 使用多个请求来请求多个资源 , GraphQL以通过一次请求就获取应用所需的所有数据 。 GraphQL的使用率很高 , 但是如果使用过程中没有部署相应的保护措施 , 很可能会存在安全隐患 。
测试区块链浏览器时 , CertiK技术团队发现了其中一个浏览器使用了GraphQL接口 , 其定义的两个类型存在着相互包含的关系 , 这就允许用户构造一个非常复杂的的嵌套查询 。
发送这样的嵌套查询可能会导致服务器上的CPU使用率大幅上升 。 一般情况下 , 几个这样的请求就能使CPU使用率提高到100%以上 , 从而导致服务器无法响应正常用户的请求 。
中年区块链浏览器如何防止被DoS攻击?
本文插图
当服务器处理此类Graphql请求时的CPU使用率
下图的“dos_query”展示了嵌套graphql的例子:
中年区块链浏览器如何防止被DoS攻击?
本文插图
这样恶意的GraphQL请求对服务器造成的影响取决于查询的复杂性和服务器的性能 , 服务器可能在花费很多时间之后最终能够成功响应查询 , 但也有可能由于CPU使用率过高 , 服务器直接崩溃 。 如果你想了解有关GraphQL安全性的更多信息 , 可以访问文章末尾的参考链接1 。
3. 直接暴露的Cosmos RPC API
https://fake.cosmos.api.com/txs?message.action=send&limit=100&tx.minheight=1
上面的Cosmos API从区块1开始搜索100笔发送出去的交易 。 截至目前 , Cosmos主网中已经有2712445个区块 。 在CosmosHub中暴露了RPC API节点里 , 我们找不到任何节点可以处理该请求 。 接受到此请求的服务器在一段时间后 , 将返回“502 Bad Gateway”错误 , 表明请求失败 。
节点的RPC服务器如果在几秒钟内收到数百个上面描述的搜索请求 , 将会对所有的API请求返回以下错误 。 一些节点服务器可以错误中自行恢复 , 而另一些则需要被重启 。
为了使读者更好地理解上述问题并演示其效果 , CertiK技术团队设置了一个完全同步的Cosmos全节点 , 并使用上面提到的查询攻击该节点:“https://fake.cosmos.api.com/txs?message.action=send&limit = 100&tx.minheight = 1” 。
中年区块链浏览器如何防止被DoS攻击?
本文插图
Grafana CPU使用率面板
该图可以分为三个阶段:

  • 节点已启动并正在运行 , 系统的CPU使用率为35%
  • 节点面临DoS攻击 , 系统CPU使用率达到97%
  • 节点崩溃 , 无法将新数据提供给Grafana
该图显示在DoS攻击下 , 服务器在短短几分钟内就崩溃了 。 由于服务器崩溃后无法使用SSH连接到服务器 , 操作员不得不重新启动服务器 。 4.请求处理程序有缺陷https://fake.sample.com/api/v1?feature=Always_time_out CertiK技术团队遇到了一个会不停加载 , 过了一会儿就显示超时的API ,但是向服务器发送多个请求并不会影响其他API的响应时间 。 初步猜测是该特定API的处理方法不占用CPU或内存 。 由于此区块链浏览器不是开源的 , 因此无法获得有关API代码实现的相关信息 , 也无法根据其名称确定该API端点的用途 。尽管攻击此API不太可能使服务器崩溃 , 但攻击者可以通过发送这类“Always hang and time out”请求来占用所有网络连接 , 从而阻止其他用户访问此服务器上的API 。 举个例子 , “sleep_to_handle_request”函数演示了一个请求可以消耗很少的CPU和内存 , 但是会加载很长时间并占用网络连接的情况 。与其他三个服务器完全崩溃 , 或需要很长时间才能恢复的案例相比 , 此案例中的服务器在攻击停止后立即恢复了 。DoS攻击的影响 遇到DoS攻击时 , 易受攻击的服务器将无法响应正常的用户请求 。 一些服务器可以在攻击停止后立即或在一段时间后恢复到正常状态 , 而另一些服务器将完全崩溃并需要重新启动 。无法使用区块链浏览器会给用户带来很大的困扰 。 因为用户无法轻易的获取有关链上活动的信息 。 此外 , 在基于Cosmos的链上 , 如果节点遭受DoS攻击 , 不仅连接的区块链浏览器无法从该节点获取数据 , 用户也无法使用API执行诸如发送代币或将代币委托给验证者的操作 。 建议 任何应用程序都存在被DoS攻击的威胁 , 世界上不存在一种解决方案可以完美的防范DoS攻击 。 但有些方法可以用来增加攻击成本从而使潜在的攻击者难以执行攻击操作 , 并降低区块链浏览器应用中的存在漏洞的概率 。在这里 , CertiK技术团队列出了一些建议 , 以最大程度地减少应用程序被攻击的机率:1.速率限制即使后端API在实现上足够安全 , 攻击者也可以通过向服务器发送大量请求来进行攻击 。 因此 , API在任何情况下都应该设置速率限制来暂时或永久屏蔽恶意IP 。虽然速率限制并不能完全解决问题 , 但操作起来相对便捷 , 可以构成针对DoS攻击的第一道防线 。 2.改良设计和实现良好的程序设计和代码实现能在相同的硬件条件下表现出更好的性能 , 这种效果在与数据库搜索和数据处理相关的功能方面表现得更加突出 。 但是在考虑性能之前 , 首先要确保代码没有错误 。因此 , 在API部署到生产环境前编写单元测试上投入大量时间是非常值得的 , 以此来确保它们能够按预期工作 。 3.输入验证和参数限制不对用户提供的变量进行验证和限制 , 那么攻击者就可以滥用API 。在确定代码能够按预期工作之后 , 下一步要做的是确保攻击者不能利用非常规的输入滥用API 。 类似于获取9999999区块的数据或处理1000级循环的GraphQL查询的请求不应该被允许 。因此 , 所有用户输入均应被视为不可信的 , 服务器应在处理用户输入之前对其进行验证 。在上文提到的案例中 , GraphQL API可以设置最大层数限度以有效防御循环查询的DoS攻击 , 而块数据获取API则可以将最大块数限制为像50这样的合理数值 。开发人员可以根据代码实现和程序设计 , 总结出最合适当前程序的的输入验证和限制的方案 。 4.不要暴露节点RPC并非所有API的代码实现都在开发人员的控制之下 。比如 , 开发人员并不推荐去改Cosmos RPC API的代码 。 Cosmos SDK中某些搜索查询的性能不是很好 , 那么该怎么办? 解决方案之一:围绕Cosmos RPC API创建一层包装API , 并创建一个存储区块链数据的数据库 , 该数据库从节点同步区块链数据 。 外层的包装API向公众公开 , 并接收和处理用户请求 , 随后再将请求传递到Cosmos RPC或在后端数据库中搜索数据 。 添加外层API有效地防止了用户直接与节点RPC API进行交互 。 数据库可以防止节点被搜索查询请求所淹没 , 并且开发人员可以按照他们所希望的方式优化数据库 。在Cosmos论坛上 , 用户“kwunyeung”也提出了一种解决方案:使用HTTP代理(例如Nginx或Caddy)来保护RPC端口 。 总的来说想表达的观点是一致的:RPC端口不能直接向公众公开 , 同时还要采取保护措施 。 5.符合建议的硬件要求即使部署了上述所有防御机制 , 用户还是需要注意运行API服务器或例如Tendermint(详见参考链接2)这样的稳定节点对硬件的最低要求 。 如果服务器在处理来自普通用户访问网站所产生请求就有困难的时候 , 那么管理员需要考虑升级硬件了 。总结 DoS攻击可能会使诸如区块链浏览器之类的应用程序陷入崩溃 , 这对大部分企业来说可以称得上是致命的威胁 。CertiK专业的安全技术团队在应用程序漏洞评估 , 针对诸如Solidity、RUST和Go等不同语言的代码审计 , 以及以太坊 , Cosmos和Substrate等平台的安全维护方面拥有丰富的经验和专业的安全知识 。针对包括区块链浏览器、钱包、交易所、智能合约 , 甚至底层区块链协议的实现在内的区块链相关业务 , 如需进行全面的安全审计 , CertiK拥有多年的实战防护经验及最先进的形式化验证技术 , 将是你最值得信赖的安全专 家 。附录 这是一个示例脚本 , 用于测试Cosmos节点是否容易受到DOS攻击 。 通过修改“url”变量可以测试不同的应用程序 。 请不要对未经许可的应用程序运行 。


推荐阅读