keystoneauth auth plugins should not use etree XML parsing

Bug #1534284 reported by Brant Knudson
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Security Advisory
Won't Fix
Undecided
Unassigned
keystoneauth
Triaged
Medium
Unassigned
python-keystoneclient
Won't Fix
Undecided
Brant Knudson

Bug Description

XML parsing is surprisingly difficult and fraught with danger, for example entity expansion makes it easy to cause a lot of memory to be used and therefore crash your system. keystoneclient is using etree parsing which has these potential issues, although in the case of keystoneclient it's the response from the IdP which I think is generally trusted.

This is in python-keystoneclient/keystoneclient/contrib/auth/v3/saml2.py

There's a defusedxml parser that has protections against these attacks and should therefore be used instead if possible - https://pypi.python.org/pypi/defusedxml - the docs for this page also include some examples of other possible attacks.

This was caught by bandit 0.17.0.

I'm going to start this out as private security so we can think about it some more before it goes public, even though it's probably not something that needs an issue since I think the source is generally trusted. If you can't trust your IdP then who can you trust?

Revision history for this message
Tristan Cacqueray (tristan-cacqueray) wrote :

Since this report concerns a possible security risk, an incomplete security advisory task has been added while the core security reviewers for the affected project or projects confirm the bug and discuss the scope of any vulnerability along with potential solutions.

Changed in ossa:
status: New → Incomplete
description: updated
Revision history for this message
Tristan Cacqueray (tristan-cacqueray) wrote :

So this affect the saml2 authentication plugin and the exploit needs to first impersonate an identity provider in order to answer with malicious xml content ?

Revision history for this message
Brant Knudson (blk-u) wrote :

It can either be the Service Provider response or the Identity Provider response. These values are both parsed using lxml.etree.XML.

Revision history for this message
Brant Knudson (blk-u) wrote :

keystoneauth has this same code.

Revision history for this message
Tristan Cacqueray (tristan-cacqueray) wrote :

Adding keystone-coresec for further investigation.

So in order to impersonate Service Provider response or the Identity Provider response, these endpoints need to be in http right ? If so, this is likely a C1 type of bug (according to https://security.openstack.org/vmt-process.html#incident-report-taxonomy ).

Revision history for this message
Jeremy Stanley (fungi) wrote :

So does this mean that (say in a federated auth model) any malicious actor at a configured IdP can crash services calling into keystoneauth?

Revision history for this message
Brant Knudson (blk-u) wrote :

Jeremy - my understanding is that, yes, if you control the SP or the IdP then you can crash any application using keystoneauth / keystoneclient when the system is configured for SAML authentication (federation) by crafting a response to exploit the expansion function in lxml.etree. It's possible the SP/IdP might even be able to read a file off the system via external entity expansion... I'll have to look at the code some more... the client takes the value sent to it and then modifies it for reuse without getting rid of stuff that would be invalid or ignored as far as I can tell.

If somebody controls the SP and/or IdP then there's probably all sorts of other badness that they can get up to that's worse than crashing the applications. Keystone does try to protect the deployment from some of these things (for example, the mapping needs to be valid and will therefore limit what the SP and IdP can get up to... a sane configuration would prevent the SP/IdP from becoming admin through the mapping).

So, keystone will protect against some bad actions by SP/IdP. The deployer might think that this makes them "safe" and trust their external IdP. The SP/IdP admin could exploit this to crash their (or their customers') systems (or read files off their systems?) by crafting bad responses.

Tristan - I wouldn't object to a C1 classification. I don't know of a real exploit here, this is all speculative.

Revision history for this message
Brant Knudson (blk-u) wrote :
Revision history for this message
Morgan Fainberg (mdrnstm) wrote :

So, this likely can't crash keystone but could cause issues with the client. Depends on how apache_saml2 processing handles this problem.

This is not likely to hit anything outside of client(s). It doesn't change the risk of ugly things.

Revision history for this message
Morgan Fainberg (mdrnstm) wrote :

This also likely can be made public, but I'm happy to let brant think that over a bit more.

Revision history for this message
Morgan Fainberg (mdrnstm) wrote :

Ah you did say it was only consumers of ksa not keystoneserver. Sorry.

Revision history for this message
Tristan Cacqueray (tristan-cacqueray) wrote :

I've removed the privacy settings and put the OSSA task as Won't Fix based on above comments. This can be put back to incomplete if the situation changes.

description: updated
Changed in ossa:
status: Incomplete → Won't Fix
information type: Private Security → Public
tags: added: security
Changed in keystoneauth:
status: New → Triaged
importance: Undecided → Medium
Revision history for this message
Morgan Fainberg (mdrnstm) wrote :

Marking this as "wont fix" against KSC as it shouldn't be needed long term (Session, AuthPlugins, and CLI are all being removed soon/are deprecated)

Changed in python-keystoneclient:
status: New → Won't Fix
summary: - keystoneclient should not use etree XML parsing
+ keystoneauth auth plugins should not use etree XML parsing
Revision history for this message
Jamie Lennox (jamielennox) wrote :

Unfortunately defusedxml is not part of global-requirements and that's not a battle i care to have. However we are also wanting to move away from lxml to remove the C dependencies that lxml bring. So alternative options would be appreciated.

For a shorter term fix, googling the issue brings up [1], suggesting we can do:

    from lxml import etree
    parser = etree.XMLParser(resolve_entities=False)

I think (i haven't looked closely) that this should be safe for SAML. Can we update bandit to check for this specifically?

[1] http://mikeknoop.com/lxml-xxe-exploit/

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to keystoneauth (master)

Fix proposed to branch: master
Review: https://review.openstack.org/536761

Changed in keystoneauth:
assignee: nobody → Kairat Kushaev (kkushaev)
status: Triaged → In Progress
Changed in keystoneauth:
assignee: Kairat Kushaev (kkushaev) → Pavlo Shchelokovskyy (pshchelo)
Revision history for this message
Morgan Fainberg (mdrnstm) wrote :

Unassigning due to inactivity

Changed in keystoneauth:
status: In Progress → Triaged
assignee: Pavlo Shchelokovskyy (pshchelo) → nobody
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Change abandoned on keystoneauth (master)

Change abandoned by "Gage Hugo <email address hidden>" on branch: master
Review: https://review.opendev.org/c/openstack/keystoneauth/+/536761
Reason: Abandoning since there hasn't been any recent activity, if anyone wants to continue this work, please feel free to restore this or create a new change.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.