对用户落实有效的权限管理
1.9 ID_improperAuthorization
需落实有效的权限管理,相关措施包括但不限于:
- 落实授权与认证机制,提供多因素认证
- 遵循最小特权原则,对资源和相关算法设置合理的访问或执行权限
- 避免仅在客户端认证而非服务端认证
- 检查请求是否符合用户的权限设定,拒绝无权限的请求
- 用户放弃某项权限后,应确保相关权限不再生效
- 遵循合理的“认证 - 执行”顺序,避免复杂度攻击或早期放大攻击
- 保证信道完整性,对相关用户进行充分的身份认证,避免中间人攻击
- 验证通信通道的源和目的地,拒绝非预期的请求和应答
- 避免攻击者使用重放攻击等手段绕过身份认证或干扰正常运营
- 避免不恰当地信任反向 DNS(关注 DNS Cache Poisoning)
- 避免过于严格且易触发的账户锁定机制,使攻击者通过锁定账户干扰正常运营
权限管理与安全直接相关,应落实严格的评审、测试以及攻防演练。
示例:
Result foo() {
auto req = getRequest();
auto res = sqlQuery(
"select * from db where key='%s'", req["key"] // Non-compliant
);
return res;
}
设例中 req 对应用户请求,sqlQuery 将请求中的 key 字段替换格式化占位符后执行查询,这个模式存在多种问题,应先判断用户是否具有读取数据库相关字段的权限,而且还应判断 req["key"] 的值是否安全,详见 ID_hijack。
又如:
void bar(User* user) {
auto buf = read_large_file();
if (is_admin(user)) { // Non-compliant
do_something(buf);
}
}
设例中 read_large_file 读取大型文件,is_admin 进行身份认证,在身份认证之前访问资源使得攻击者不必获取有效账号即可消耗系统资源,从而对系统造成干扰,所以应该在访问资源之前进行身份认证。