漏洞概述 该漏洞涉及在解析SAML(Security Assertion Markup Language)断言时,未能正确验证签名和加密断言的完整性。攻击者可能通过构造恶意SAML断言,绕过身份验证机制,从而获取未授权访问权限。 影响范围 受影响组件:LibXML2/SAML/ProtocolAssertion.pm 影响版本:具体版本未明确,但补丁显示了对多个方法的修改,包括 、 、 、 、 、 、 、 、 、 等。 修复方案 1. 更新代码: - 修改 文件中的相关方法,确保在解析SAML断言时正确验证签名和加密断言的完整性。 - 具体修改包括: - 在 方法中,增加对断言目的地的验证。 - 在 和 方法中,增加对时间条件的验证。 - 在 方法中,增加对NameID的验证。 - 在 方法中,增加对认证语句的验证。 - 在 方法中,增加对实际发行者的验证。 - 在 方法中,增加对可信签名引用的验证。 - 在 方法中,增加对加密断言的验证。 - 在 方法中,增加对XML签名的验证。 - 在 方法中,增加对从XML创建断言时的验证。 2. 代码示例: ```perl sub get_actual_destination { my ($class, $xpath, $saml_value) = @_; my $destination = $xpath->findvalue('/samlp:Response/saml:Assertion/saml:Conditions/saml:AudienceRestriction/saml:Audience'); return $class->assert_saml_value($xpath, $destination, '/samlp:Response/saml:Assertion/saml:Conditions/saml:AudienceRestriction/saml:Audience'); } sub get_not_before { my ($class, $xpath, $xpath_base) = @_; my $saml_value = $xpath->findvalue($xpath_base . '/saml:Conditions/saml:NotBefore'); if (my $saml_value = $xpath->findvalue($xpath_base . '/saml:Conditions/saml:NotBefore')) { $saml_value = DateTime->Format::ISO8601->parse_datetime($saml_value); } else { $saml_value = DateTime->now(); } return $saml_value; } sub get_not_after { my ($class, $xpath, $xpath_base) = @_; my $saml_value = $xpath->findvalue($xpath_base . '/saml:Conditions/saml:NotAfter'); if (my $saml_value = $xpath->findvalue($xpath_base . '/saml:Conditions/saml:NotAfter')) { $saml_value = DateTime->Format::ISO8601->parse_datetime($saml_value); } else { $saml_value = DateTime->now() + 3600; } return $saml_value; } sub get_nameid { my ($class, $xpath) = @_; my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID'); if (my $saml_value = $xpath->findvalue('/saml:Response/saml:Assertion/saml:Subject/saml:NameID')) { $saml_value = $saml_value->get_node(1); } else { $saml_value = $xpat