Python Pyramid 捕获空字节攻击

问题描述

我有一个带有 fail2ban 的 Pyramid Web 应用程序,它被设置为监禁 10 个连续的 404 状态(即探测漏洞的机器人)、Sentry 错误日志记录,据我所知,没有安全漏洞。但是,每隔几天我就会收到一个由空字节攻击引起的 502 通知。这是无害的,但它变得非常令人厌烦,因此我忽略了一个奇怪但合法的人类用户生成的 502 状态。

在我的设置中,Pyramid 中的空字节攻击在 url 调度级别引发 URLDecodeError ('utf-8' codec can't decode byte 0xc0 in position 16: invalid start byte),因此不会路由到 notfound_view_config 装饰视图。

有什么方法可以在 Pyramid 中捕获请求中的 %EF/%BF 还是应该在 Apache 中阻止它们?

解决方法

Steve Piercy 的评论已转换为答案: A search in the Pyramid issue tracker yields several related resultsfirst hit 提供了一种处理方法。

简而言之,视图构造函数类 exception_view_config(ExceptionClass,renderer) 捕获它的行为类似于 notfound_view_configforbidden_view_config(与 view_config 相比,它们没有传递声明的路由)。>

因此 404 视图可能如下所示:

from pyramid.view import notfound_view_config
from pyramid.exceptions import URLDecodeError
from pyramid.view import exception_view_config

@exception_view_config(context=URLDecodeError,renderer='json')
@notfound_view_config(renderer='json')
def notfound_view(request):
    request.response.status = 404
    return {"status": "error"}

这可以通过访问浏览器 http://0.0.0.0:??/%EF%BF 来测试(其中 ?? 是服务的端口)。

然而,还有两个额外的考虑。

  • 它不能很好地与调试工具栏(本地配置 ini 文件中的 pyramid.includes = pyramid_debugtoolbar)配合使用。
  • 此外,如果访问 request.path_info 等任何动态属性,则会引发错误。因此,在视图中的任何操作(例如使用数据等)之前,响应要么是最小格式的,要么是为 request.environ['PATH_INFO'] 分配一个新值。 然而,视图调用发生在 debugtoolbar 错误发生之后,因此第一点仍然与 request.environ['PATH_INFO'] = 'hacked' 保持一致。

奖金

由于这无疑是一种攻击,因此可以对其进行自定义,以便与 fail2ban 配合使用,在第一次出现时使用 described here(例如 418)阻止黑客 IP 为 unique status code