为什么输入错误密码后会有很大的延迟?


89

我注意到关于密码的一件奇怪的事(根据我的说法)。例如,如果我在登录时输入了错误的密码,则系统会提示我几秒钟的延迟。当我尝试sudo使用错误的密码时,我还必须等待外壳说“抱歉,再试一次”。

我想知道为什么“识别”不正确的密码需要这么长时间?在我使用的多个发行版(甚至OSX)上都可以看到这一点,所以我认为这不是发行版特定的东西。


我注意到,这不仅在终端中出现,而且在启动后或笔记本电脑处于睡眠模式时在初始会话登录中也注意到。解锁正确的密码是瞬间的,但是很高兴看到这个问题:)
krozaine

Answers:


92

这是安全的事情,实际上并不需要花费很长时间。解决的2个漏洞:

  1. 这会限制登录尝试,这意味着有人无法像尝试破解它一样快地砸系统(每秒1M次尝试?我不知道)。

  2. 如果它在验证您的凭据不正确后立即执行此操作,则可以使用它花费的时间使凭据无效,以帮助您猜测部分凭据是否正确,从而大大减少了猜测时间。

为了防止这两件事,系统只需要花费一定的时间就可以了,我想您可以使用PAM配置等待时间(请参阅Michaels answer)。

安全工程(2ed,亚马逊 | 1ed,免费)对这些问题给出了更好的解释。


4
// offtopic g它不是bug,
而是

2
您的会员链接已自动重写为SE,顺便说一句。
明胶2010年

1
@Tshepang:请参阅第2章,尤其是第2.4节和第2.5.3.3节。
吉尔斯(Gilles)2010年

4
比较密码哈希时,早期和晚期故障之间的差异以纳秒为单位。通过正确的编码(恒定时间存储器比较),根本没有区别。这没有理由增加延迟。
CodesInChaos

2
我同意CodesInChaos:答案的第二点是错误的。实际发生的情况如下:1.计算输入的哈希值;2.将该哈希值与存储的哈希值进行比较(即使已找到差异,也将其每个字节);请注意,这两个步骤绝不会变慢或变慢,这取决于您输入的密码是否正确。(并且正如其他人已经指出的那样,如果可能的话,增加睡眠时间不能解决定时攻击问题)
例如

41

这是有意的,试图限制暴力破解。通常,您可以通过在其中查找FAIL_DELAY配置项/etc/login.defs并更改其值来修改它(3默认情况下,我的默认值为秒),尽管该文件中的注释听起来像PAM至少会强制执行2第二次延迟。


9
这不仅可以防止暴力破解。但由于知道在何处进行配置而获得了加分。
xenoterracide

5
我认为fail_delay也可以在中配置/etc/pam.d/login。寻找pam_faildelay.so delay=
Steven D

8
是什么导致您无法为sudo编写包装程序,一旦尝试在0.1秒内不起作用,该包装程序将启动新的sudo实例?
Janus Troelsen 2014年

11

在现代linux系统上,原因是pam_unix.so施加了这样的延迟。如先前所报道,通过更改FAIL_DELAY,可以将其配置为两秒钟/etc/login.defs。如果要进一步减少延迟,则必须给pam_unix.so提供“ nodelay”选项。例如,在我的系统上,如果您从跟踪包含/etc/pam.d/sudo,您将发现必须编辑以下行/etc/pam.d/system-auth

auth      required  pam_unix.so     try_first_pass nullok

并将其更改为:

auth      required  pam_unix.so     try_first_pass nullok nodelay

不幸的是,我的Linux发行版(arch)配置事物的方式是,sshd使用了system-auth包含相同文件的文件system-remote-login

尽管可以安全地消除sudo上的延迟,因为它是已记录的,仅由本地用户使用,并且无论如何都可以被本地攻击者绕过,但您可能不想消除远程登录的这种延迟。您当然可以通过编写一个自定义sudo来解决此问题,该自定义sudo不仅包含共享的系统身份验证文件。

我个人认为sudo的延迟(忽略SIGINT)是一个很大的错误。这意味着知道自己输入错误密码的用户将无法终止进程并感到沮丧。当然,您仍然可以使用Ctrl-Z停止sudo,因为sudo不能捕获SIGTSTP,并且在停止后,可以使用kill -9(SIGKILL)将其杀死。这很烦人。因此,这意味着自动攻击可能会以超高速率触发伪终端上的警报。但是这种延迟使合法用户感到沮丧,并鼓励他们暂停其根shell而不是退出它们,以避免再次使用sudo。


1
与Fedora相同。很棒的分析
Freedom_Ben 2016年

辉煌的答案。我还认为FAIL_DELAY在现代桌面系统中已过时。您应该依靠分区/硬盘驱动器加密而已。通常,没有第二个用户可能尝试暴力破解root密码。但是,潜在的恶意程序可能滥用不安全的FAIL_DELAY,从而获得root用户访问权限。
phil294

将pam-unix设置为nodelay将会将等待时间设置为0,然后FAIL_DELAY被忽略。
phil294

为什么不禁用延迟,然后禁用远程密码登录(仅SSH)?如果不引入任何安全漏洞,就不能解决问题吗?
Radon Rosborough
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.