Document
Incoming saml Response are signed, Assertion also are signed and encrypted.
PHP 8.2.16
Problem
Assertion signature not valid after it are modified with this line:
$decrypted->setAttributeNS('http://www.w3.org/2000/xmlns/', $ns, Constants::NS_SAML);
Document parts examples - response and decrypted assertion:
<samlp:Response ID="_07e4c1c6-xxxxxxxxxxxxxxxxxxxxxxxx"
Version="2.0"
IssueInstant="2024-03-15T09:25:10.000Z"
Destination="https://xxxxxxxxxxxxxxxxxxxxxx"
Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
InResponseTo="ONELOGIN_719fa4a0xxxxxxxxxxxxxxxxxxxxxx"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
>
<saml:Assertion ID="_45179449-a9XXXXXXXXXXXXXXXXXX" IssueInstant="2024-03-15T14:22:42.000Z"
Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
Main elements:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
Auth fails at:
if ($hasSignedAssertion && !Utils::validateSign($documentToCheckAssertion, $cert, $fingerprint, $fingerprintalg, Utils::ASSERTION_SIGNATURE_XPATH, $multiCerts)) {
throw new ValidationError(
"Signature validation failed. SAML Response rejected",
ValidationError::INVALID_SIGNATURE
);
}
Opinion:
So i think what it is wrong to modify signed assertion. Maybe responses are also are not 100% perfect, but o can't modify them.
Maybe php bug in function ->hasAttributeNS dose not detect existing xmlns..
&& !$container->hasAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:saml')
In result next function write one more $qualifiedName 'xmlns'
Solutions:
- Remove assertion namespace modification.
- Add option to check in plain text for value.
- Try to find why hasAttributeNS not work.
Document
Incoming saml Response are signed, Assertion also are signed and encrypted.
PHP 8.2.16
Problem
Assertion signature not valid after it are modified with this line:
Document parts examples - response and decrypted assertion:
Main elements:
Auth fails at:
Opinion:
So i think what it is wrong to modify signed assertion. Maybe responses are also are not 100% perfect, but o can't modify them.
Maybe php bug in function ->hasAttributeNS dose not detect existing xmlns..
In result next function write one more $qualifiedName 'xmlns'
Solutions: