]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephx: Fix multiple segfaults due to attempts to encrypt or decrypt 11930/head
authorBrad Hubbard <bhubbard@redhat.com>
Tue, 14 Jun 2016 07:34:44 +0000 (17:34 +1000)
committerNathan Cutler <ncutler@suse.com>
Sat, 12 Nov 2016 10:35:59 +0000 (11:35 +0100)
an empty secret and a null CryptoKeyHandler

Fixes: http://tracker.ceph.com/issues/16266
Signed-off-by: Brad Hubbard <bhubbard@redhat.com>
(cherry picked from commit 009e777fbd18602e5fd66f97bdad95e977e6fecc)

src/auth/Crypto.h
src/auth/cephx/CephxClientHandler.cc
src/auth/cephx/CephxProtocol.cc

index 3bfc5aabd17a8174c837c5b9dee0d16c9c986a32..478f07357160ead98e6128773eed28f070347a04 100644 (file)
@@ -107,10 +107,12 @@ public:
   int create(CephContext *cct, int type);
   int encrypt(CephContext *cct, const bufferlist& in, bufferlist& out,
               std::string *error) const {
+    assert(ckh); // Bad key?
     return ckh->encrypt(in, out, error);
   }
   int decrypt(CephContext *cct, const bufferlist& in, bufferlist& out,
               std::string *error) const {
+    assert(ckh); // Bad key?
     return ckh->decrypt(in, out, error);
   }
 
index ff32a425757b6526e7fb46385fc5cf9fb62f1d14..7c1f550fc81c1984f045a90169e3c85f65dbd3aa 100644 (file)
@@ -46,6 +46,12 @@ int CephxClientHandler::build_request(bufferlist& bl) const
       return -ENOENT;
     }
 
+    // is the key OK?
+    if (!secret.get_secret().length()) {
+      ldout(cct, 20) << "secret for entity " << cct->_conf->name << " is invalid" << dendl;
+      return -EINVAL;
+    }
+
     CephXAuthenticate req;
     get_random_bytes((char *)&req.client_challenge, sizeof(req.client_challenge));
     std::string error;
index f57f06358644dd53b1710d44445835870cd07c22..43d39b1259a4883d56e12f822d4c721cb161d0a5 100644 (file)
@@ -61,7 +61,10 @@ bool cephx_build_service_ticket_blob(CephContext *cct, CephXSessionAuthInfo& inf
           << " ticket_info.ticket.name=" << ticket_info.ticket.name.to_str() << dendl;
   blob.secret_id = info.secret_id;
   std::string error;
-  encode_encrypt_enc_bl(cct, ticket_info, info.service_secret, blob.blob, error);
+  if (!info.service_secret.get_secret().length())
+    error = "invalid key";  // Bad key?
+  else
+    encode_encrypt_enc_bl(cct, ticket_info, info.service_secret, blob.blob, error);
   if (!error.empty()) {
     ldout(cct, -1) << "cephx_build_service_ticket_blob failed with error "
          << error << dendl;
@@ -429,7 +432,10 @@ bool cephx_verify_authorizer(CephContext *cct, KeyStore *keys,
     }
   }
   std::string error;
-  decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket.blob, error);
+  if (!service_secret.get_secret().length())
+    error = "invalid key";  // Bad key?
+  else
+    decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket.blob, error);
   if (!error.empty()) {
     ldout(cct, 0) << "verify_authorizer could not decrypt ticket info: error: "
       << error << dendl;