告诉用户哪些输入字符有效/无效是一个安全漏洞吗?

信息安全 Web应用程序 脆弱性 朦胧 数据验证 错误处理
2021-08-29 18:52:28

对于网站上的输入验证,向用户准确披露给定字段的有效或无效字符是否存在任何安全问题?

CWE-200: Information Exposure表示应该尽量不披露“可能对攻击有用但攻击者通常无法获得的信息”。一个具体的例子是防止系统暴露堆栈跟踪(由CWE-209 解决:通过错误消息暴露信息)。

是否应该确保错误消息含糊不清,例如“您输入的文本包含无效字符”?

包含用于验证客户端代码(例如 JavaScript)中的输入的正则表达式是否是一个安全漏洞,攻击者可以看到?另一种方法是在服务器端验证输入,这会在一定程度上降低可用性,因为它需要更多的后端通信(例如,它可能导致站点响应和显示错误更慢)。

或者这是一种“通过默默无闻的安全”的形式,因为用户/攻击者可以通过重复提交不同的字符以查看它们是否产生错误来推断哪些字符是有效的?

是否值得通过用户体验来降低攻击速度?

我应该注意,据我所知,OWASP 的Input Validation Cheat SheetData Validation development guide没有提供关于这个主题的方向。

编辑 2020-01-17:

关于为什么要进行任何输入验证,有几个问题(包括我努力撰写评论的答案已被删除) 。

首先,感谢@Loek 对 OWASP 的应用程序安全验证标准的评论,该标准在第 21 页和第 22 页提供了密码指导:“验证没有密码组合规则限制允许的字符类型。应该没有要求用于大写或小写或数字或特殊字符。”。

我认为我们都同意限制密码中的字符通常是一个坏主意(请参阅@Merchako 的回答)。正如@emory 指出的那样,这可能不是一个硬性规定(例如,我看到许多移动应用程序使用更易于使用的辅助“PIN”来保护应用程序,即使其他人有权登录设备。)当我问这个问题时,我并没有真正想到密码,但这是评论和答案的一个方向。因此,出于这个问题的目的,让我们将其视为非密码字段。

输入验证是网站、Web 服务和应用程序“深度防御”的一部分,以防止注入攻击。如 OWASP 所述,注入攻击“可能导致数据丢失、损坏或向未授权方披露、责任丧失或拒绝访问。注入有时会导致主机完全接管。业务影响取决于应用程序和数据。”

有关更多详细信息,请参阅 OWASP 的 #1 漏洞、A1-InjectionCWE-20:不正确的输入验证请注意,他们都说输入验证不是一种完整的防御,而是软件产品“深度防御”的一层。

4个回答

... 这可能在攻击中有用,但通常对攻击者不可用

无效输入字符的知识很有用,但攻击者只需几次尝试即可轻松找到。因此,这些信息并不是真正的秘密,让所有用户都不知道到底出了什么问题并不能真正阻止攻击者,它只会让无辜的用户远离他们,因为他们无法继续。

为用户创造一种心理上令人沮丧的情况可能会使他们做出不太安全的决定。例如,他们尝试用瑞典语编写密码,但您的输入拒绝了该字符å而没有解释。他们没有选择不带 的不同的好密码å,而是举手使用password123——一个很容易被字典攻击打败的密码。

因此,您试图通过默默无闻来创建一个“更安全”的系统,但是一旦我们考虑到用户行为,它实际上就不太安全了。

有效字符最终可以通过系统的方式发现。隐藏它们不值得您对用户行为造成的损害。


如需进一步阅读,请参阅Sean Smith 等人的“ Security and Cognitive Bias: Exploring the Role of the Mind ”和“使用 Cognitive Behavioral Agent-Based Modeling 测量密码策略的安全影响”。

这取决于。

如果消息从普通用户的角度描述了错误,例如“第 3 个字符必须是数字”,则它不是安全漏洞。但是显示用于验证的正则表达式意味着公开实现细节,这可能是一个弱点,例如,一些库广泛使用递归调用,一些表达式可能导致堆栈溢出或高内存和 CPU 使用率,这可能导致 DoS。

CWE-200 将信息披露定义为仅当用户没有被明确授权访问该信息时的弱点。您正在考虑用户输入。意味着,允许用户输入此信息,因此允许查看此信息,并且自然允许他查看与此输入相关的任何验证错误消息。

堆栈跟踪以及其他技术消息可以提供有关应用程序中使用的技术的信息(例如,使用什么库的版本)、环境信息(例如目录布局和权限、操作系统类型和版本)等。攻击者可以使用此信息有效地选择针对这些特定技术、库、操作系统等的漏洞利用。这就是为什么向用户披露此类信息可能是一个弱点。

不向用户解释他的输入有什么问题绝对是糟糕的用户体验,但不是安全改进。

不要将其与类似情况混淆,当数据是敏感的并且与之相关的任何验证都可能是敏感的。例如,如果用户在您期望一年的字段中输入字母,那么向用户解释此类错误是安全的。但是,如果用户输入一个电子邮件地址并且您检查该地址是否已在您的系统中注册,那么任何信息(地址已知,地址未知)都可能是一个弱点。这就是为什么当您要实施验证消息或任何其他有关用户输入的反馈时,请评估后果。但是,默认情况下禁止所有字段的任何反馈可能是一个糟糕的用户体验,带有虚假的安全感。

这只是为了提高系统的可用性而需要进行安全权衡的众多场景之一。

但是,显示堆栈跟踪(错误处理能力差)与声明输入字段中预期或禁止的字符之间存在巨大差异。

对于大多数情况,人们可以争辩说,如果有其他安全机制,例如限制密码尝试,那么在输入字段中声明哪些字符是预期的或禁止的根本不是安全漏洞。

可以使用威胁建模框架确定这是一个可接受的系统风险。