Re: [PATCH 4.14 018/146] libceph: implement CEPHX_V2 calculation mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 04, 2018 at 01:06:40PM +0100, Ilya Dryomov wrote:
> On Tue, Dec 4, 2018 at 12:01 PM Greg Kroah-Hartman
> <gregkh@xxxxxxxxxxxxxxxxxxx> wrote:
> >
> > 4.14-stable review patch.  If anyone has any objections, please let me know.
> >
> > ------------------
> >
> > commit cc255c76c70f7a87d97939621eae04b600d9f4a1 upstream.
> >
> > Derive the signature from the entire buffer (both AES cipher blocks)
> > instead of using just the first half of the first block, leaving out
> > data_crc entirely.
> >
> > This addresses CVE-2018-1129.
> >
> > Link: http://tracker.ceph.com/issues/24837
> > Signed-off-by: Ilya Dryomov <idryomov@xxxxxxxxx>
> > Reviewed-by: Sage Weil <sage@xxxxxxxxxx>
> > Signed-off-by: Ben Hutchings <ben.hutchings@xxxxxxxxxxxxxxx>
> > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
> > ---
> >  include/linux/ceph/ceph_features.h |  7 +--
> >  net/ceph/auth_x.c                  | 73 +++++++++++++++++++++++-------
> >  2 files changed, 60 insertions(+), 20 deletions(-)
> >
> > diff --git a/include/linux/ceph/ceph_features.h b/include/linux/ceph/ceph_features.h
> > index 59042d5ac520..70f42eef813b 100644
> > --- a/include/linux/ceph/ceph_features.h
> > +++ b/include/linux/ceph/ceph_features.h
> > @@ -165,9 +165,9 @@ DEFINE_CEPH_FEATURE(58, 1, FS_FILE_LAYOUT_V2) // overlap
> >  DEFINE_CEPH_FEATURE(59, 1, FS_BTIME)
> >  DEFINE_CEPH_FEATURE(59, 1, FS_CHANGE_ATTR) // overlap
> >  DEFINE_CEPH_FEATURE(59, 1, MSG_ADDR2) // overlap
> > -DEFINE_CEPH_FEATURE(60, 1, BLKIN_TRACING)  // *do not share this bit*
> > +DEFINE_CEPH_FEATURE(60, 1, OSD_RECOVERY_DELETES) // *do not share this bit*
> > +DEFINE_CEPH_FEATURE(61, 1, CEPHX_V2)             // *do not share this bit*
> >
> > -DEFINE_CEPH_FEATURE(61, 1, RESERVED2)          // unused, but slow down!
> >  DEFINE_CEPH_FEATURE(62, 1, RESERVED)           // do not use; used as a sentinal
> >  DEFINE_CEPH_FEATURE_DEPRECATED(63, 1, RESERVED_BROKEN, LUMINOUS) // client-facing
> >
> > @@ -209,7 +209,8 @@ DEFINE_CEPH_FEATURE_DEPRECATED(63, 1, RESERVED_BROKEN, LUMINOUS) // client-facin
> >          CEPH_FEATURE_SERVER_JEWEL |            \
> >          CEPH_FEATURE_MON_STATEFUL_SUB |        \
> >          CEPH_FEATURE_CRUSH_TUNABLES5 |         \
> > -        CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING)
> > +        CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING | \
> > +        CEPH_FEATURE_CEPHX_V2)
> >
> >  #define CEPH_FEATURES_REQUIRED_DEFAULT   \
> >         (CEPH_FEATURE_NOSRCADDR |        \
> > diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c
> > index ce28bb07d8fd..10eb759bbcb4 100644
> > --- a/net/ceph/auth_x.c
> > +++ b/net/ceph/auth_x.c
> > @@ -9,6 +9,7 @@
> >
> >  #include <linux/ceph/decode.h>
> >  #include <linux/ceph/auth.h>
> > +#include <linux/ceph/ceph_features.h>
> >  #include <linux/ceph/libceph.h>
> >  #include <linux/ceph/messenger.h>
> >
> > @@ -803,26 +804,64 @@ static int calc_signature(struct ceph_x_authorizer *au, struct ceph_msg *msg,
> >                           __le64 *psig)
> >  {
> >         void *enc_buf = au->enc_buf;
> > -       struct {
> > -               __le32 len;
> > -               __le32 header_crc;
> > -               __le32 front_crc;
> > -               __le32 middle_crc;
> > -               __le32 data_crc;
> > -       } __packed *sigblock = enc_buf + ceph_x_encrypt_offset();
> >         int ret;
> >
> > -       sigblock->len = cpu_to_le32(4*sizeof(u32));
> > -       sigblock->header_crc = msg->hdr.crc;
> > -       sigblock->front_crc = msg->footer.front_crc;
> > -       sigblock->middle_crc = msg->footer.middle_crc;
> > -       sigblock->data_crc =  msg->footer.data_crc;
> > -       ret = ceph_x_encrypt(&au->session_key, enc_buf, CEPHX_AU_ENC_BUF_LEN,
> > -                            sizeof(*sigblock));
> > -       if (ret < 0)
> > -               return ret;
> > +       if (!CEPH_HAVE_FEATURE(msg->con->peer_features, CEPHX_V2)) {
> > +               struct {
> > +                       __le32 len;
> > +                       __le32 header_crc;
> > +                       __le32 front_crc;
> > +                       __le32 middle_crc;
> > +                       __le32 data_crc;
> > +               } __packed *sigblock = enc_buf + ceph_x_encrypt_offset();
> > +
> > +               sigblock->len = cpu_to_le32(4*sizeof(u32));
> > +               sigblock->header_crc = msg->hdr.crc;
> > +               sigblock->front_crc = msg->footer.front_crc;
> > +               sigblock->middle_crc = msg->footer.middle_crc;
> > +               sigblock->data_crc =  msg->footer.data_crc;
> > +
> > +               ret = ceph_x_encrypt(&au->session_key, enc_buf,
> > +                                    CEPHX_AU_ENC_BUF_LEN, sizeof(*sigblock));
> > +               if (ret < 0)
> > +                       return ret;
> > +
> > +               *psig = *(__le64 *)(enc_buf + sizeof(u32));
> > +       } else {
> > +               struct {
> > +                       __le32 header_crc;
> > +                       __le32 front_crc;
> > +                       __le32 front_len;
> > +                       __le32 middle_crc;
> > +                       __le32 middle_len;
> > +                       __le32 data_crc;
> > +                       __le32 data_len;
> > +                       __le32 seq_lower_word;
> > +               } __packed *sigblock = enc_buf;
> > +               struct {
> > +                       __le64 a, b, c, d;
> > +               } __packed *penc = enc_buf;
> > +               int ciphertext_len;
> > +
> > +               sigblock->header_crc = msg->hdr.crc;
> > +               sigblock->front_crc = msg->footer.front_crc;
> > +               sigblock->front_len = msg->hdr.front_len;
> > +               sigblock->middle_crc = msg->footer.middle_crc;
> > +               sigblock->middle_len = msg->hdr.middle_len;
> > +               sigblock->data_crc =  msg->footer.data_crc;
> > +               sigblock->data_len = msg->hdr.data_len;
> > +               sigblock->seq_lower_word = *(__le32 *)&msg->hdr.seq;
> > +
> > +               /* no leading len, no ceph_x_encrypt_header */
> > +               ret = ceph_crypt(&au->session_key, true, enc_buf,
> > +                                CEPHX_AU_ENC_BUF_LEN, sizeof(*sigblock),
> > +                                &ciphertext_len);
> > +               if (ret)
> > +                       return ret;
> > +
> > +               *psig = penc->a ^ penc->b ^ penc->c ^ penc->d;
> > +       }
> >
> > -       *psig = *(__le64 *)(enc_buf + sizeof(u32));
> >         return 0;
> >  }
> 
> Hi Greg,
> 
> I thought this series (patches 13 - 18) was dropped from the 4.14 queue.
> If it wasn't, you also need to pick up the following:
> 
> f1d10e046379 libceph: weaken sizeof check in ceph_x_verify_authorizer_reply()
> 130f52f2b203 libceph: check authorizer reply/challenge length before reading
> 
> See our discussion with Sasha:
> 
>   https://www.spinics.net/lists/stable/msg272462.html

Ah, missed that, sorry.  I've queued these patches up now, thanks!

greg k-h



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux