用户控制的数据用于权限检查¶
ID: java/tainted-permissions-check
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-807
- external/cwe/cwe-290
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
在权限检查中使用用户控制的数据可能会允许用户获得对受保护功能或数据的未经授权的访问。
建议¶
在检查用户是否被授权执行特定活动时,不要在权限检查中使用该用户控制的数据。如有必要,始终验证输入,理想情况下应针对预期值的固定列表进行验证。
同样,不要根据用户数据来决定要检查哪个权限。特别是,避免使用计算来决定要检查哪个权限。使用固定权限执行特定操作,而不是生成要检查的权限。
示例¶
此示例使用 Apache Shiro 安全框架,展示了两种指定要检查的权限的方法。第一种方法使用字符串 whatDoTheyWantToDo
来指定要检查的权限。但是,此字符串是从用户输入构建的。这可能允许攻击者强制执行对他们已知拥有权限的权限的检查,而不是应检查的权限。例如,在尝试访问另一个用户的帐户详细信息时,攻击者可能会迫使系统检查他们是否具有访问他们*自身*帐户详细信息的权限,这是不正确的,并且会允许他们执行该操作。第二种更安全的方法使用固定检查,该检查不依赖于用户控制的数据。
public static void main(String[] args) {
String whatDoTheyWantToDo = args[0];
Subject subject = SecurityUtils.getSubject();
// BAD: permissions decision made using tainted data
if(subject.isPermitted("domain:sublevel:" + whatDoTheyWantToDo))
doIt();
// GOOD: use fixed checks
if(subject.isPermitted("domain:sublevel:whatTheMethodDoes"))
doIt();
}
参考¶
SEI CERT Oracle Java 编码标准:SEC02-J. 不要根据不可信来源进行安全检查。
常见弱点枚举:CWE-807。
常见弱点枚举:CWE-290。