VYPR
Low severityNVD Advisory· Published Jun 16, 2015· Updated May 6, 2026

CVE-2015-3010

CVE-2015-3010

Description

ceph-deploy before 1.5.23 uses weak permissions (644) for ceph/ceph.client.admin.keyring, which allows local users to obtain sensitive information by reading the file.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
ceph-deployPyPI
< 1.5.231.5.23

Affected products

1

Patches

1
eee56770393b

Merge pull request #272 from trhoden/wip_key_perms

https://github.com/ceph/ceph-deployTravis RhodenMar 20, 2015via ghsa
2 files changed · +52 46
  • ceph_deploy/gatherkeys.py+39 36 modified
    @@ -30,51 +30,54 @@ def fetch_file(args, frompath, topath, _hosts):
     
     
     def gatherkeys(args):
    -    # client.admin
    -    keyring = '/etc/ceph/{cluster}.client.admin.keyring'.format(
    -        cluster=args.cluster)
    -    r = fetch_file(
    -        args=args,
    -        frompath=keyring,
    -        topath='{cluster}.client.admin.keyring'.format(
    -            cluster=args.cluster),
    -        _hosts=args.mon,
    -        )
    -    if not r:
    -        raise exc.KeyNotFoundError(keyring, args.mon)
    -
    -    # mon.
    -    keyring = '/var/lib/ceph/mon/{cluster}-{{hostname}}/keyring'.format(
    -        cluster=args.cluster)
    -    r = fetch_file(
    -        args=args,
    -        frompath=keyring,
    -        topath='{cluster}.mon.keyring'.format(cluster=args.cluster),
    -        _hosts=args.mon,
    -        )
    -    if not r:
    -        raise exc.KeyNotFoundError(keyring, args.mon)
    +    oldmask = os.umask(077)
    +    try:
    +        # client.admin
    +        keyring = '/etc/ceph/{cluster}.client.admin.keyring'.format(
    +            cluster=args.cluster)
    +        r = fetch_file(
    +            args=args,
    +            frompath=keyring,
    +            topath='{cluster}.client.admin.keyring'.format(
    +                cluster=args.cluster),
    +            _hosts=args.mon,
    +            )
    +        if not r:
    +            raise exc.KeyNotFoundError(keyring, args.mon)
     
    -    # bootstrap
    -    for what in ['osd', 'mds', 'rgw']:
    -        keyring = '/var/lib/ceph/bootstrap-{what}/{cluster}.keyring'.format(
    -            what=what,
    +        # mon.
    +        keyring = '/var/lib/ceph/mon/{cluster}-{{hostname}}/keyring'.format(
                 cluster=args.cluster)
             r = fetch_file(
                 args=args,
                 frompath=keyring,
    -            topath='{cluster}.bootstrap-{what}.keyring'.format(
    -                cluster=args.cluster,
    -                what=what),
    +            topath='{cluster}.mon.keyring'.format(cluster=args.cluster),
                 _hosts=args.mon,
                 )
             if not r:
    -            if what in ['osd', 'mds']:
    -                raise exc.KeyNotFoundError(keyring, args.mon)
    -            else:
    -                LOG.warning(("No RGW bootstrap key found. Will not be able to "
    -                             "deploy RGW daemons"))
    +            raise exc.KeyNotFoundError(keyring, args.mon)
     
    +        # bootstrap
    +        for what in ['osd', 'mds', 'rgw']:
    +            keyring = '/var/lib/ceph/bootstrap-{what}/{cluster}.keyring'.format(
    +                what=what,
    +                cluster=args.cluster)
    +            r = fetch_file(
    +                args=args,
    +                frompath=keyring,
    +                topath='{cluster}.bootstrap-{what}.keyring'.format(
    +                    cluster=args.cluster,
    +                    what=what),
    +                _hosts=args.mon,
    +                )
    +            if not r:
    +                if what in ['osd', 'mds']:
    +                    raise exc.KeyNotFoundError(keyring, args.mon)
    +                else:
    +                    LOG.warning(("No RGW bootstrap key found. Will not be able to "
    +                                 "deploy RGW daemons"))
    +    finally:
    +        os.umask(oldmask)
     
     @priority(40)
     def make(parser):
    
  • ceph_deploy/new.py+13 10 modified
    @@ -211,18 +211,21 @@ def new_mon_keyring(args):
         keypath = '{name}.mon.keyring'.format(
             name=args.cluster,
             )
    -
    +    oldmask = os.umask(077)
         LOG.debug('Writing monitor keyring to %s...', keypath)
    -    tmp = '%s.tmp' % keypath
    -    with file(tmp, 'w') as f:
    -        f.write(mon_keyring)
         try:
    -        os.rename(tmp, keypath)
    -    except OSError as e:
    -        if e.errno == errno.EEXIST:
    -            raise exc.ClusterExistsError(keypath)
    -        else:
    -            raise
    +        tmp = '%s.tmp' % keypath
    +        with open(tmp, 'w', 0600) as f:
    +            f.write(mon_keyring)
    +        try:
    +            os.rename(tmp, keypath)
    +        except OSError as e:
    +            if e.errno == errno.EEXIST:
    +                raise exc.ClusterExistsError(keypath)
    +            else:
    +                raise
    +    finally:
    +        os.umask(oldmask)
     
     
     @priority(10)
    

Vulnerability mechanics

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

References

13

News mentions

0

No linked articles in our index yet.