Samly访问控制漏洞深度分析:会话管理失效引发安全风险

本文详细分析CVE-2024-25718漏洞的技术原理,该漏洞影响Samly 1.4.0之前版本的访问控制机制,由于会话状态管理不当,可能导致用户权限绕过。文章涵盖漏洞成因、影响范围及修复方案。

CVE-2024-25718:Samly访问控制漏洞技术分析

漏洞概述

CVE-2024-25718是一个影响Samly库的严重访问控制漏洞。Samly是一个用于Elixir/Phoenix应用程序的SAML 2.0服务提供商单点登录认证库。该漏洞存在于1.4.0之前的所有版本中,CVSS 3.1基础评分为9.8分(严重级别)。

技术细节

漏洞核心机制

该漏洞的根本原因在于Samly.State.Store.get_assertion/3函数可能返回已过期的会话,而Samly.AuthHandler会使用缓存的会话且不会在会话过期后替换它。这直接干扰了访问控制机制。

具体来说,当用户通过SAML认证后,Samly会创建并存储一个包含用户身份信息的SAML断言(assertion)。这个断言本应具有有效期,并在过期后自动失效。然而,由于漏洞的存在,即使断言已过期,系统仍可能返回并使用这个过期的会话数据。

受影响组件

  • Samly.State.Store模块:负责存储和检索SAML断言状态
  • Samly.AuthHandler模块:处理认证逻辑,使用缓存会话
  • 会话状态管理机制:两种实现方式(ETS存储和会话存储)均受影响

技术影响

  1. 访问控制绕过:攻击者可能利用过期的会话继续访问受限资源
  2. 权限提升:普通用户可能保留不应再有的权限
  3. 会话固定攻击:会话不按预期失效,增加安全风险

漏洞修复

该漏洞已在Samly 1.4.0版本中修复。修复方案主要涉及改进会话状态管理逻辑,确保:

  1. 过期会话不会被返回给调用者
  2. AuthHandler会正确检查会话有效期并获取新的有效会话
  3. 状态存储机制会及时清理过期会话

相关技术背景

Samly库架构

Samly是一个基于Erlang esaml库构建的Elixir Plug库,用于为Plug/Phoenix应用程序提供SAML 2.0服务提供商单点登录功能。它支持多种身份提供商,包括Okta、Ping Identity、OneLogin、ADFS等。

配置示例

Samly的典型配置包括:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
config :samly, Samly.Provider,
  idp_id_from: :path_segment,
  service_providers: [
    %{
      id: "my-sp",
      entity_id: "urn:example.com:my-app",
      certfile: "path/to/certfile.pem",
      keyfile: "path/to/keyfile.pem"
    }
  ],
  identity_providers: [
    %{
      id: "my-idp",
      sp_id: "my-sp",
      base_url: "https://example.com/sso",
      metadata_file: "idp_metadata.xml"
    }
  ]

会话状态存储选项

Samly提供两种会话状态存储机制:

  1. ETS存储:基于Erlang Term Storage,适用于单机部署
  2. 会话存储:基于Plug Sessions,适用于集群部署

两种存储机制都受到此漏洞的影响,都需要升级到1.4.0或更高版本。

安全建议

  1. 立即升级:所有使用Samly库的项目应升级到1.4.0或更高版本
  2. 会话监控:实施额外的会话有效期监控机制
  3. 访问控制复核:检查应用程序的访问控制逻辑是否依赖会话有效期
  4. 安全测试:对修复后的系统进行彻底的安全测试,特别是会话管理相关功能

总结

CVE-2024-25718暴露了Samly库在会话状态管理中的设计缺陷,这个缺陷可能被利用来绕过访问控制机制。通过及时升级到修复版本,并实施额外的安全监控措施,可以有效地缓解这一安全风险。对于使用SAML单点登录的企业应用程序而言,会话管理的安全性至关重要,需要持续关注相关库的安全更新。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计