即使您启用 CAPTCHA 和速率限制登录,暴力破解是否可能构成威胁?

信息安全 验证 蛮力 验证码
2021-08-21 19:40:27

假设在系统上启用了 CAPTCHA 并启用了帐户锁定控制(连续五次尝试失败后,帐户将被锁定 15 分钟)。

蛮力仍然是一个可能的威胁吗?

4个回答

您描述的保护是您应该考虑的好的保护,但仍然可能存在弱点:

  • 许多验证码可以由机器人解决,或者您可以轻松地花钱请人为您解决问题(有公司出售该服务)。
  • 帐户锁定是一个好主意,但如果您基于 IP 执行此操作,则可以访问僵尸网络的人可以从不同 IP 重试登录单个帐户,直到他们进入。
  • 如果您的数据库泄露,离线蛮力仍然是一个问题。如果攻击者可以访问密码哈希,他们可以在自己的系统上尝试所有他们想要的。这就是为什么你应该使用好的散列。

或许。

这取决于您如何定义“蛮力”。

X 次错误尝试后的锁定对于保护攻击者追踪单个目标的帐户非常有用。

还有另一种情况,攻击者选择了一些常用密码“password、password123 等”。他们不会攻击单个用户,而是在系统中他们知道的每个帐户上尝试使用 4 个常用密码。

User: Jim
PW: password, password123, letmein, secret

User: Bob
PW: password, password123, letmein, secret

User: Alice
PW: password, password123, letmein, secret

这在攻击者希望获取凭据以在暗网上转售或横向转移到可能已重复使用密码的其他服务的情况下更为常见。

我建议你添加一些东西来计算整体无效登录的比率,而不仅仅是在每个帐户或 IP 级别上。

这是另一种意义上的威胁。如果您在 5 次尝试失败后锁定帐户 15 分钟,那么您实际上已经内置了 DoS 机制。

假设我真的不想闯入,但只要造成破坏我就可以了,没问题。只需使用随机用户名每秒进行几千次登录。嘿,我什至不会费心做 CAPTCHA,谁在乎呢。我想要的只是失败锁定

比在固定数量的故障后的固定时间更好的策略可能是二次(或指数)增长。一些 AVM 路由器会这样做。第一次登录失败,你有 15 秒的锁定时间,下一次失败你有 30 秒,等等。这对合法用户来说少了很多麻烦,给攻击者带来了更多的麻烦。
为了使 DoS 更难,您需要一种涉及 IP 地址和帐户名称的方法,将每个帐户-IP 对的最大延迟限制为一个可容忍的值。否则,合法用户仍然可以轻松且不确定地被 DoSed。不过,指数增长更好地解决了“无限次尝试”问题。

实际上通过蛮力在网上找到一个用户名-密码对是,假设人们不愚蠢,实际上是没有希望的。不幸的是,人们愚蠢,所以你不能假设他们不会拥有十大最愚蠢的密码之一,你必须假设它是可行的。所以,是的,那里也有一点威胁。特别是因为虽然很难在一台服务器上定位一个用户,但在纯粹基于用户名的控制系统上,您可以在同一台服务器上并行定位一千个用户,没有问题(每个得分只有一次失败!)并且您可以在一千台服务器上并行执行此操作。而且,让这个脚本运行数周(数月、数年……),每 15 到 20 分钟重试一次,实际上并不需要任何成本。

因此,虽然对于个人帐户,您作为攻击者的机会非常小,但随着数字加起来几乎无限,您一定会在某个地方击中某人,最终,这是不可避免的。因为否则并行尝试一千个用户是微不足道的,很明显,您需要在计算中考虑 IP 地址。即便如此,它并不能 100% 地抵御拥有数千个僵尸程序的僵尸网络,但它确实会降低攻击的效率,需要更多的工作和管理。更多的工作是好的。

一旦你成为一个严肃的目标,你就无法赢得比赛,但是你越努力让攻击者工作,攻击者就越有可能选择其他人(他是一个更容易的目标)开始。
这与锁定前门而不是敞开大门非常相似。窃贼很容易打破您的窗户,您最终无法阻止他人进入。但是考虑到邻居家的门要打开并且不得不砸碎你的窗户,他可能会选择更简单的方法。更少的费用,相同的利润。

是的,它仍然是一种威胁,因为:

  • CAPTCHA 正在迅速接近安全剧院的地步。有多种服务可以破坏它们(以一定的价格),并且越来越难以找到可以由人类轻松解决但不能由计算机解决的问题。
  • 针对单个用户的蛮力尝试并不是您必须处理的唯一潜在攻击。攻击针对已知帐户名列表尝试使用同一组密码的情况并不少见。对于某些可能拥有少数知名用户名(例如 SSH)的服务来说,看到用户映射攻击也并不少见。
  • 除非您强制执行某种形式的密码质量检查,否则蛮力尝试很可能不需要每 15 分钟尝试 5 次就足以减慢速度。

改进您提出的建议的想法:

  • 如上所述,加强密码质量。在理想情况下,允许 XKCD 密码生成方法等工作(有关此信息,请参阅XKCD #936),更好的是,确保接受任何有效的 Unicode 字符。
  • 由于凭据无效而导致身份验证失败,只返回一个失败代码,而不是为无效用户名和无效密码返回不同的失败代码。非常重要,因为它可以防止用户映射攻击。
  • 提供 MFA 支持。如果您花一些时间进行设置,这实际上并不难正确完成。TOTP MFA 方法(例如 Google Authenticator 应用程序和 Steam 的 MFA 系统提供的方法)通常很容易上手并且相当安全。U2F 也非常安全,但需要进行更多设置。无论如何,如果您采用这种方式,请允许使用多种 MFA 方法(理想情况下是不同类型的混合)。避免任何需要通过电子邮件(这绝对不安全)或短信(它比电子邮件更好,但在收到代码之前可能会有很长的延迟)发送登录代码的任何事情。然后,您的任何启用 MFA 的用户都会在功能上受到保护,免受大多数暴力攻击。
  • 不要只使用静态锁定装置。请改用自适应方法,其中帐户保持锁定状态的时间取决于它最近被锁定的次数。一个具有锁定时间上限的简单指数缩放系统就可以很好地工作。例如,使时间等于15 * 2^n分钟,上限为 2 小时,其中n是过去 24 小时内先前锁定的次数(第一次尝试是 15 分钟锁定,第二次是 30,第三次是 60,第四次是 120) .