Skip to content

Commit 33fe1e7

Browse files
authored
Merge pull request #292 from onelogin/deprecated_algorithm_detection
Add rejectDeprecatedAlgorithm settings. Define DEPRECATED_ALGORITHMS …
2 parents 99d6060 + edfd11c commit 33fe1e7

File tree

15 files changed

+123
-12
lines changed

15 files changed

+123
-12
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,12 @@ In addition to the required settings data (idp, sp), extra settings can be defin
507507
// 'http://www.w3.org/2001/04/xmlenc#sha256'
508508
// 'http://www.w3.org/2001/04/xmldsig-more#sha384'
509509
// 'http://www.w3.org/2001/04/xmlenc#sha512'
510-
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
510+
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
511+
512+
// If the toolkit receive a message signed with a
513+
// deprecated algoritm (defined at the constant class)
514+
// will raise an error and reject the message
515+
"rejectDeprecatedAlgorithm": true
511516
},
512517

513518
// Contact information template, it is recommended to supply

demo-bottle/saml/advanced_settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"wantAssertionsEncrypted": false,
1313
"allowSingleLabelDomains": false,
1414
"signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
15-
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
15+
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
16+
"rejectDeprecatedAlgorithm": true
1617
},
1718
"contactPerson": {
1819
"technical": {

demo-django/saml/advanced_settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"wantAssertionsEncrypted": false,
1313
"allowSingleLabelDomains": false,
1414
"signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
15-
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
15+
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
16+
"rejectDeprecatedAlgorithm": true
1617
},
1718
"contactPerson": {
1819
"technical": {

demo-flask/saml/advanced_settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"wantAssertionsEncrypted": false,
1313
"allowSingleLabelDomains": false,
1414
"signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
15-
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
15+
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
16+
"rejectDeprecatedAlgorithm": true
1617
},
1718
"contactPerson": {
1819
"technical": {

demo_pyramid/demo_pyramid/saml/advanced_settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"wantAssertionsEncrypted": false,
1313
"allowSingleLabelDomains": false,
1414
"signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
15-
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
15+
"digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
16+
"rejectDeprecatedAlgorithm": true
1617
},
1718
"contactPerson": {
1819
"technical": {

src/onelogin/saml2/constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,6 @@ class OneLogin_Saml2_Constants(object):
116116
AES256_CBC = 'http://www.w3.org/2001/04/xmlenc#aes256-cbc'
117117
RSA_1_5 = 'http://www.w3.org/2001/04/xmlenc#rsa-1_5'
118118
RSA_OAEP_MGF1P = 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'
119+
120+
# Define here the deprecated algorithms
121+
DEPRECATED_ALGORITHMS = [DSA_SHA1, RSA_SHA1, SHA1]

src/onelogin/saml2/errors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class OneLogin_Saml2_ValidationError(Exception):
113113
WRONG_NUMBER_OF_SIGNATURES = 43
114114
RESPONSE_EXPIRED = 44
115115
AUTHN_CONTEXT_MISMATCH = 45
116+
DEPRECATED_SIGNATURE_METHOD = 46
117+
DEPRECATED_DIGEST_METHOD = 47
116118

117119
def __init__(self, message, code=0, errors=None):
118120
"""

src/onelogin/saml2/logout_request.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ def is_valid(self, request_data, raise_exceptions=False):
335335
if 'lowercase_urlencoding' in request_data.keys():
336336
lowercase_urlencoding = request_data['lowercase_urlencoding']
337337

338+
security = self.__settings.get_security_data()
338339
if self.__settings.is_strict():
339340
res = OneLogin_Saml2_Utils.validate_xml(dom, 'saml-schema-protocol-2.0.xsd', self.__settings.is_debug_active())
340341
if not isinstance(res, Document):
@@ -343,8 +344,6 @@ def is_valid(self, request_data, raise_exceptions=False):
343344
OneLogin_Saml2_ValidationError.INVALID_XML_FORMAT
344345
)
345346

346-
security = self.__settings.get_security_data()
347-
348347
current_url = OneLogin_Saml2_Utils.get_self_url_no_query(request_data)
349348

350349
# Check NotOnOrAfter
@@ -395,6 +394,14 @@ def is_valid(self, request_data, raise_exceptions=False):
395394
else:
396395
sign_alg = get_data['SigAlg']
397396

397+
reject_deprecated_alg = security.get('rejectDeprecatedAlgorithm', False)
398+
if reject_deprecated_alg:
399+
if sign_alg in OneLogin_Saml2_Constants.DEPRECATED_ALGORITHMS:
400+
raise OneLogin_Saml2_ValidationError(
401+
'Deprecated signature algorithm found: %s' % sign_alg,
402+
OneLogin_Saml2_ValidationError.DEPRECATED_SIGNATURE_METHOD
403+
)
404+
398405
signed_query = 'SAMLRequest=%s' % OneLogin_Saml2_Utils.get_encoded_parameter(get_data, 'SAMLRequest', lowercase_urlencoding=lowercase_urlencoding)
399406
if 'RelayState' in get_data:
400407
signed_query = '%s&RelayState=%s' % (signed_query, OneLogin_Saml2_Utils.get_encoded_parameter(get_data, 'RelayState', lowercase_urlencoding=lowercase_urlencoding))

src/onelogin/saml2/logout_response.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
9090
if 'lowercase_urlencoding' in request_data.keys():
9191
lowercase_urlencoding = request_data['lowercase_urlencoding']
9292

93+
security = self.__settings.get_security_data()
9394
if self.__settings.is_strict():
9495
res = OneLogin_Saml2_Utils.validate_xml(self.document, 'saml-schema-protocol-2.0.xsd', self.__settings.is_debug_active())
9596
if not isinstance(res, Document):
@@ -98,8 +99,6 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
9899
OneLogin_Saml2_ValidationError.INVALID_XML_FORMAT
99100
)
100101

101-
security = self.__settings.get_security_data()
102-
103102
in_response_to = self.get_in_response_to()
104103
# Check if the InResponseTo of the Logout Response matches the ID of the Logout Request (requestId) if provided
105104
if request_id is not None and in_response_to and in_response_to != request_id:
@@ -145,6 +144,14 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
145144
else:
146145
sign_alg = get_data['SigAlg']
147146

147+
reject_deprecated_alg = security.get('rejectDeprecatedAlgorithm', False)
148+
if reject_deprecated_alg:
149+
if sign_alg in OneLogin_Saml2_Constants.DEPRECATED_ALGORITHMS:
150+
raise OneLogin_Saml2_ValidationError(
151+
'Deprecated signature algorithm found: %s' % sign_alg,
152+
OneLogin_Saml2_ValidationError.DEPRECATED_SIGNATURE_METHOD
153+
)
154+
148155
signed_query = 'SAMLResponse=%s' % OneLogin_Saml2_Utils.get_encoded_parameter(get_data, 'SAMLResponse', lowercase_urlencoding=lowercase_urlencoding)
149156
if 'RelayState' in get_data:
150157
signed_query = '%s&RelayState=%s' % (signed_query, OneLogin_Saml2_Utils.get_encoded_parameter(get_data, 'RelayState', lowercase_urlencoding=lowercase_urlencoding))

src/onelogin/saml2/response.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
104104
has_signed_response = '{%s}Response' % OneLogin_Saml2_Constants.NS_SAMLP in signed_elements
105105
has_signed_assertion = '{%s}Assertion' % OneLogin_Saml2_Constants.NS_SAML in signed_elements
106106

107+
security = self.__settings.get_security_data()
107108
if self.__settings.is_strict():
108109
no_valid_xml_msg = 'Invalid SAML Response. Not match the saml-schema-protocol-2.0.xsd'
109110
res = OneLogin_Saml2_Utils.validate_xml(
@@ -130,7 +131,6 @@ def is_valid(self, request_data, request_id=None, raise_exceptions=False):
130131
OneLogin_Saml2_ValidationError.INVALID_XML_FORMAT
131132
)
132133

133-
security = self.__settings.get_security_data()
134134
current_url = OneLogin_Saml2_Utils.get_self_url_no_query(request_data)
135135

136136
in_response_to = self.get_in_response_to()
@@ -688,6 +688,9 @@ def process_signed_elements(self):
688688
"""
689689
sign_nodes = self.__query('//ds:Signature')
690690

691+
security = self.__settings.get_security_data()
692+
reject_deprecated_alg = security.get('rejectDeprecatedAlgorithm', False)
693+
691694
signed_elements = []
692695
verified_seis = []
693696
verified_ids = []
@@ -736,6 +739,26 @@ def process_signed_elements(self):
736739
)
737740
verified_seis.append(sei)
738741

742+
# Check the signature and digest algorithm
743+
if reject_deprecated_alg:
744+
sig_method_node = OneLogin_Saml2_Utils.query(sign_node, './/ds:SignatureMethod')
745+
if sig_method_node:
746+
sig_method = sig_method_node[0].get("Algorithm")
747+
if sig_method in OneLogin_Saml2_Constants.DEPRECATED_ALGORITHMS:
748+
raise OneLogin_Saml2_ValidationError(
749+
'Deprecated signature algorithm found: %s' % sig_method,
750+
OneLogin_Saml2_ValidationError.DEPRECATED_SIGNATURE_METHOD
751+
)
752+
753+
dig_method_node = OneLogin_Saml2_Utils.query(sign_node, './/ds:DigestMethod')
754+
if dig_method_node:
755+
dig_method = dig_method_node[0].get("Algorithm")
756+
if dig_method in OneLogin_Saml2_Constants.DEPRECATED_ALGORITHMS:
757+
raise OneLogin_Saml2_ValidationError(
758+
'Deprecated digest algorithm found: %s' % dig_method,
759+
OneLogin_Saml2_ValidationError.DEPRECATED_DIGEST_METHOD
760+
)
761+
739762
signed_elements.append(signed_element)
740763

741764
if signed_elements:

0 commit comments

Comments
 (0)