oauth2.0 严重 漏洞 - 使用 算法 none 阻止 Azure 广告 授权

hfwmuf9z  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(169)

我们 正在 . NET 6.0 中 使用 Azure 广告 授权 。 存在 算法 类型 不能 为 空 的 严重 漏洞 。
这里 的 guide 解释 了 为什么 这 是 一 个 严重 的 漏洞 ( 大声 向 作者 寻求 详细 解释 )
这 是 我们 的 实现 :

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(configuration); 

    app.UseAuthentication();
    app.UseAuthorization();

中 的 每 一 个
我们 遇到 的 所有 引用 都 要求 验证 签名 。 现在 我们 不 使用 任何 密钥 或 证书 通过 生成 随机 HSA 或 RSA 密钥 来 验证 签名 。 有点 被 这个 漏洞 卡住 了 。

mutmk8jj

mutmk8jj1#

该 库 将 使用 RSA 密钥 验证 令牌 。 它 会 在 应用 启动 时 自动 加载 公钥 , 例如 https://login.microsoftonline.com/common/discovery/v2.0/keys 。 这些 公钥 用于 验证 令牌 的 签名 。 它 不会 接受 没有 签名 的 令牌 , 除非 你 覆盖 这些 设置 。 ( 至少 它 真 的 不 应该 )

xggvc2p6

xggvc2p62#

我们 必须 手动 检查 算法 是否 为 " 无 " 。 以下 是 我们 从 安全 团队 获得 通过 的 实现 :

var jwtData = new DataMap<string>();
        if (Request?.Headers != null)
        {
            _ = AuthenticationHeaderValue.TryParse(Request.Headers[HeaderNames.Authorization], out AuthenticationHeaderValue authValue);
            if (authValue?.Scheme == "Bearer")
            {
                // Decode JWT and extract the claims.
                string token = authValue.Parameter;

                var jwtHandler = new JwtSecurityTokenHandler();
                if (jwtHandler.CanReadToken(token))
                {
                    JwtSecurityToken validJwt = GetValidJWT(jwtHandler, token);
                    var claims = validJwt.Claims;
                    foreach (var claim in claims)
                    {
                        jwtData[claim.Type] = claim.Value;
                    }
                    _jwtData = jwtData;
                }
                else
                {
                    jwtData[authValue.Scheme] = token ?? "";
                }
            }
        }

    protected JwtSecurityToken GetValidJWT(JwtSecurityTokenHandler jwtSecurityTokenHandler, string token)
    {
        JwtSecurityToken validJwt = jwtSecurityTokenHandler.ReadJwtToken(token);
        //Validate algorithm
        if (validJwt == null)
        {
            throw new ArgumentException("Invalid JWT");
        }

        if (!validJwt.Header.Alg.Equals("RS256"))
        {
            throw new ArgumentException("Algorithm must be RS256");
        }
        return validJwt;

    }

中 的 每 一 个

相关问题