VYPR
High severityNVD Advisory· Published Jun 10, 2020· Updated Aug 4, 2024

CVE-2020-10755

CVE-2020-10755

Description

An insecure-credentials flaw was found in all openstack-cinder versions before openstack-cinder 14.1.0, all openstack-cinder 15.x.x versions before openstack-cinder 15.2.0 and all openstack-cinder 16.x.x versions before openstack-cinder 16.1.0. When using openstack-cinder with the Dell EMC ScaleIO or VxFlex OS backend storage driver, credentials for the entire backend are exposed in the `connection_info` element in all Block Storage v3 Attachments API calls containing that element. This flaw enables an end-user to create a volume, make an API call to show the attachment detail information, and retrieve a username and password that may be used to connect to another user's volume. Additionally, these credentials are valid for the ScaleIO or VxFlex OS Management API, should an attacker discover the Management API endpoint. Source: OpenStack project

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

OpenStack Cinder exposes Dell EMC ScaleIO/VxFlex OS backend credentials in the Block Storage v3 Attachments API, allowing any tenant to retrieve valid management credentials.

Vulnerability

Overview

An insecure-credentials flaw in OpenStack Cinder, affecting all versions before 14.1.0, 15.x.x before 15.2.0, and 16.x.x before 16.1.0, exposes backend storage driver credentials when using the Dell EMC ScaleIO or VxFlex OS driver [1]. The vulnerability arises because the Cinder volume service includes the backend's username and password in the connection_info element returned by the Block Storage v3 Attachments API [2]. This occurs regardless of the volume's ownership or the API caller's authorization level.

Exploitation

An authenticated end-user (i.e., any OpenStack tenant user) can exploit this flaw by creating a volume and then calling the Attachments API to show attachment details [2]. The response contains the connection_info field, which includes the plaintext username and password used by the Cinder backend to communicate with the ScaleIO or VxFlex OS storage system. No special privileges beyond standard volume creation and attachment operations are required. The credentials are valid for the ScaleIO/VxFlex OS Management API if the attacker can discover its endpoint [1].

Impact

An attacker who successfully retrieves these credentials can connect to another user's volume, potentially reading or modifying data belonging to other tenants [1]. Moreover, because the same credentials are used for the entire backend, they may also allow administrative access to the storage management API, enabling broader compromise of the storage infrastructure [2]. The flaw compromises the isolation expected in multi-tenant cloud environments.

Mitigation

The recommended remediation involves patching the ScaleIO/VxFlex OS Cinder driver to stop providing the password in API responses, patching the os-brick connector to read the password from a root-only configuration file, and deploying the configuration file to all compute and Cinder nodes [2]. The fix was implemented in openstack-cinder versions 14.1.0, 15.2.0, and 16.1.0, and in the os-brick library commit 4047948f1ac8055a025972ad73ec3ec421450775 [3][4]. Users should upgrade to the patched versions and follow the deployment steps outlined in the OpenStack Security Note (OSSN-0086).

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
cinderPyPI
>= 14.0.0, < 14.1.014.1.0
cinderPyPI
>= 15.0.0, < 15.2.015.2.0
cinderPyPI
>= 16.0.0, < 16.1.016.1.0
os-brickPyPI
>= 2.8.0, < 2.8.62.8.6
os-brickPyPI
>= 2.10.0, < 2.10.42.10.4
os-brickPyPI
>= 3.0.0, < 3.0.23.0.2

Affected products

98

Patches

2
ba785eef5f51

Remove VxFlex OS credentials from connection_properties

https://github.com/openstack/cinderIvan PchelintsevJun 4, 2020via ghsa
2 files changed · +30 3
  • cinder/volume/drivers/dell_emc/scaleio/driver.py+3 3 modified
    @@ -144,9 +144,10 @@ class ScaleIODriver(driver.VolumeDriver):
             2.0.1: Added support for SIO 1.3x in addition to 2.0.x
             2.0.2: Added consistency group support to generic volume groups
             2.0.3: Added cache for storage pool and protection domains info
    +        2.0.3.1: Fix for Bug #1823200. See OSSN-0086 for details.
         """
     
    -    VERSION = "2.0.3"
    +    VERSION = "2.0.3.1"
         # ThirdPartySystems wiki
         CI_WIKI_NAME = "EMC_ScaleIO_CI"
     
    @@ -220,8 +221,7 @@ def __init__(self, *args, **kwargs):
                 'serverIP': self.server_ip,
                 'serverPort': self.server_port,
                 'serverUsername': self.server_username,
    -            'serverPassword': self.server_password,
    -            'serverToken': self.server_token,
    +            'config_group': self.configuration.config_group,
                 'iopsLimit': None,
                 'bandwidthLimit': None,
             }
    
  • doc/source/configuration/block-storage/drivers/dell-emc-scaleio-driver.rst+27 0 modified
    @@ -273,6 +273,33 @@ parameters as follows:
        san_password = SIO_PASSWD
        san_thin_provision = false
     
    +Connector configuration
    +~~~~~~~~~~~~~~~~~~~~~~~
    +
    +Before using attach/detach volume operations VxFlex OS connector must be
    +properly configured. On each node where VxFlex OS SDC is installed do the
    +following:
    +
    +#. Create ``/opt/emc/scaleio/openstack/connector.conf`` if it does not
    +   exist.
    +
    +   .. code-block:: console
    +
    +     $ mkdir -p /opt/emc/scaleio/openstack
    +     $ touch /opt/emc/scaleio/openstack/connector.conf
    +
    +#. For each VxFlex OS section in the ``cinder.conf`` create the same section in
    +   the ``/opt/emc/scaleio/openstack/connector.conf`` and populate it with
    +   passwords. Example:
    +
    +   .. code-block:: ini
    +
    +      [vxflexos]
    +      san_password = SIO_PASSWD
    +
    +      [vxflexos-new]
    +      san_password = SIO2_PASSWD
    +
     Configuration options
     ~~~~~~~~~~~~~~~~~~~~~
     
    
4047948f1ac8

Remove VxFlex OS credentials from connection_properties

https://github.com/openstack/os-brickIvan PchelintsevJun 2, 2020via ghsa
2 files changed · +39 4
  • os_brick/initiator/connectors/scaleio.py+33 2 modified
    @@ -15,6 +15,8 @@
     import json
     import os
     import requests
    +import six
    +from six.moves import configparser
     from six.moves import urllib
     
     from oslo_concurrency import lockutils
    @@ -29,6 +31,7 @@
     
     LOG = logging.getLogger(__name__)
     DEVICE_SCAN_ATTEMPTS_DEFAULT = 3
    +CONNECTOR_CONF_PATH = '/opt/emc/scaleio/openstack/connector.conf'
     synchronized = lockutils.synchronized_with_prefix('os-brick-')
     
     
    @@ -39,6 +42,7 @@ class ScaleIOConnector(base.BaseLinuxConnector):
         VOLUME_NOT_MAPPED_ERROR = 84
         VOLUME_ALREADY_MAPPED_ERROR = 81
         GET_GUID_CMD = ['/opt/emc/scaleio/sdc/bin/drv_cfg', '--query_guid']
    +    GET_PASSWORD_CMD = ['cat', CONNECTOR_CONF_PATH]
     
         def __init__(self, root_helper, driver=None,
                      device_scan_attempts=initiator.DEVICE_SCAN_ATTEMPTS_DEFAULT,
    @@ -221,6 +225,32 @@ def _get_volume_id(self):
                      {'volume_id': volume_id})
             return volume_id
     
    +    def _get_connector_password(self, config_group):
    +        LOG.info("Get ScaleIO connector password from configuration file")
    +
    +        if not os.path.isfile(CONNECTOR_CONF_PATH):
    +            msg = ("ScaleIO connector configuration file "
    +                   "is not found in path %s." % CONNECTOR_CONF_PATH)
    +            raise exception.BrickException(message=msg)
    +
    +        try:
    +            (out, err) = self._execute(*self.GET_PASSWORD_CMD,
    +                                       run_as_root=True,
    +                                       root_helper=self._root_helper)
    +            conf = configparser.ConfigParser()
    +            conf.readfp(six.StringIO(out))
    +            return conf[config_group]["san_password"]
    +        except putils.ProcessExecutionError as e:
    +            msg = _("Error reading ScaleIO connector "
    +                    "configuration file: %s") % e.stderr
    +            LOG.error(msg)
    +            raise exception.BrickException(message=msg)
    +        except Exception as e:
    +            msg = _("Error getting ScaleIO connector password from "
    +                    "configuration file: %s") % e
    +            LOG.error(msg)
    +            raise exception.BrickException(message=msg)
    +
         def _check_response(self, response, request, is_get_request=True,
                             params=None):
             if response.status_code == 401 or response.status_code == 403:
    @@ -269,8 +299,9 @@ def get_config(self, connection_properties):
             self.server_ip = connection_properties['serverIP']
             self.server_port = connection_properties['serverPort']
             self.server_username = connection_properties['serverUsername']
    -        self.server_password = connection_properties['serverPassword']
    -        self.server_token = connection_properties['serverToken']
    +        self.server_password = self._get_connector_password(
    +            connection_properties['config_group'],
    +        )
             self.iops_limit = connection_properties['iopsLimit']
             self.bandwidth_limit = connection_properties['bandwidthLimit']
             device_info = {'type': 'block',
    
  • os_brick/tests/initiator/connectors/test_scaleio.py+6 2 modified
    @@ -47,8 +47,7 @@ def setUp(self):
                 'scaleIO_volume_id': self.vol['provider_id'],
                 'serverPort': 443,
                 'serverUsername': 'test',
    -            'serverPassword': 'fake',
    -            'serverToken': 'fake_token',
    +            'config_group': 'test',
                 'iopsLimit': None,
                 'bandwidthLimit': None
             }
    @@ -84,6 +83,10 @@ def setUp(self):
             self.mock_object(os, 'listdir',
                              return_value=["emc-vol-{}".format(self.vol['id'])])
     
    +        self.get_password_mock = self.mock_object(scaleio.ScaleIOConnector,
    +                                                  '_get_connector_password',
    +                                                  return_value='fake_password')
    +
             # The actual ScaleIO connector
             self.connector = scaleio.ScaleIOConnector(
                 'sudo', execute=self.fake_execute)
    @@ -170,6 +173,7 @@ def test_get_connector_properties(self):
         def test_connect_volume(self):
             """Successful connect to volume"""
             self.connector.connect_volume(self.fake_connection_properties)
    +        self.get_password_mock.assert_called_once()
     
         def test_connect_with_bandwidth_limit(self):
             """Successful connect to volume with bandwidth limit"""
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

10

News mentions

0

No linked articles in our index yet.