Re: [PATCH RFC 1/2] CIFS: Fix signing for SMB2/3

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

 



I will merge this one ASAP into for-next

On Mon, Jun 4, 2018 at 6:17 PM, ronnie sahlberg
<ronniesahlberg@xxxxxxxxx> wrote:
> Thanks.
>
> I think it was patch #8 that broke it.  It would have been unbroken
> again in one of the later patches in 9-14 when we add the plumbing to
> push the
> NBSS generation further down the stack. I.e. Delay generating the NBSS
> 4 byte length until just immediately writing the vectors to the
> socket.
>
> This is good enough for now. I will rebase the remaining patches ontop
> of for-next and this patch test and resend later this week.
> (Optionally, Steve, you could fold Aurelien's patch into patch #8 you
> merged into for-next.)
>
>
> On Tue, Jun 5, 2018 at 6:29 AM, Aurelien Aptel <aaptel@xxxxxxxx> wrote:
>> It seems Ronnie's preamble removal broke signing.
>>
>> the signing functions are called when:
>>
>> A) we send a request (to sign it)
>> B) when we recv a response (to check the signature).
>>
>> On code path A, the smb2 header is in iov[1] but on code path B, the
>> smb2 header is in iov[0] (and there's only one vector).
>>
>> So we have different iov indexes for the smb2 header but the signing
>> function always use index 1. Fix this by checking the nb of io vectors
>> in the signing function as a hint.
>>
>> Signed-off-by: Aurelien Aptel <aaptel@xxxxxxxx>
>> ---
>>  fs/cifs/cifsencrypt.c   |  8 +++-----
>>  fs/cifs/cifsproto.h     |  2 +-
>>  fs/cifs/smb2transport.c | 12 ++++++++----
>>  3 files changed, 12 insertions(+), 10 deletions(-)
>>
>> diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
>> index a6ef088e057b..d3e14d1fc0b5 100644
>> --- a/fs/cifs/cifsencrypt.c
>> +++ b/fs/cifs/cifsencrypt.c
>> @@ -37,6 +37,7 @@
>>  #include <crypto/aead.h>
>>
>>  int __cifs_calc_signature(struct smb_rqst *rqst,
>> +                       int start,
>>                         struct TCP_Server_Info *server, char *signature,
>>                         struct shash_desc *shash)
>>  {
>> @@ -45,10 +46,7 @@ int __cifs_calc_signature(struct smb_rqst *rqst,
>>         struct kvec *iov = rqst->rq_iov;
>>         int n_vec = rqst->rq_nvec;
>>
>> -       if (n_vec < 2 || iov[0].iov_len != 4)
>> -               return -EIO;
>> -
>> -       for (i = 1; i < n_vec; i++) {
>> +       for (i = start; i < n_vec; i++) {
>>                 if (iov[i].iov_len == 0)
>>                         continue;
>>                 if (iov[i].iov_base == NULL) {
>> @@ -119,7 +117,7 @@ static int cifs_calc_signature(struct smb_rqst *rqst,
>>                 return rc;
>>         }
>>
>> -       return __cifs_calc_signature(rqst, server, signature,
>> +       return __cifs_calc_signature(rqst, 1, server, signature,
>>                                      &server->secmech.sdescmd5->shash);
>>  }
>>
>> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
>> index 7933c5f9c076..7f0c773d5f6b 100644
>> --- a/fs/cifs/cifsproto.h
>> +++ b/fs/cifs/cifsproto.h
>> @@ -544,7 +544,7 @@ int cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
>>                            struct cifs_sb_info *cifs_sb,
>>                            const unsigned char *path, char *pbuf,
>>                            unsigned int *pbytes_written);
>> -int __cifs_calc_signature(struct smb_rqst *rqst,
>> +int __cifs_calc_signature(struct smb_rqst *rqst, int start,
>>                         struct TCP_Server_Info *server, char *signature,
>>                         struct shash_desc *shash);
>>  enum securityEnum cifs_select_sectype(struct TCP_Server_Info *,
>> diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c
>> index 2c671123a6bf..349d5ccf854c 100644
>> --- a/fs/cifs/smb2transport.c
>> +++ b/fs/cifs/smb2transport.c
>> @@ -171,7 +171,9 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
>>         unsigned char smb2_signature[SMB2_HMACSHA256_SIZE];
>>         unsigned char *sigptr = smb2_signature;
>>         struct kvec *iov = rqst->rq_iov;
>> -       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[1].iov_base;
>> +       int iov_hdr_index = rqst->rq_nvec > 1 ? 1 : 0;
>> +       struct smb2_sync_hdr *shdr =
>> +               (struct smb2_sync_hdr *)iov[iov_hdr_index].iov_base;
>>         struct cifs_ses *ses;
>>
>>         ses = smb2_find_smb_ses(server, shdr->SessionId);
>> @@ -202,7 +204,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
>>                 return rc;
>>         }
>>
>> -       rc = __cifs_calc_signature(rqst, server, sigptr,
>> +       rc = __cifs_calc_signature(rqst, iov_hdr_index,  server, sigptr,
>>                 &server->secmech.sdeschmacsha256->shash);
>>
>>         if (!rc)
>> @@ -412,7 +414,9 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
>>         unsigned char smb3_signature[SMB2_CMACAES_SIZE];
>>         unsigned char *sigptr = smb3_signature;
>>         struct kvec *iov = rqst->rq_iov;
>> -       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[1].iov_base;
>> +       int iov_hdr_index = rqst->rq_nvec > 1 ? 1 : 0;
>> +       struct smb2_sync_hdr *shdr =
>> +               (struct smb2_sync_hdr *)iov[iov_hdr_index].iov_base;
>>         struct cifs_ses *ses;
>>
>>         ses = smb2_find_smb_ses(server, shdr->SessionId);
>> @@ -443,7 +447,7 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
>>                 return rc;
>>         }
>>
>> -       rc = __cifs_calc_signature(rqst, server, sigptr,
>> +       rc = __cifs_calc_signature(rqst, iov_hdr_index, server, sigptr,
>>                                    &server->secmech.sdesccmacaes->shash);
>>
>>         if (!rc)
>> --
>> 2.13.6
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Thanks,

Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux