diff mbox series

[v2,08/17] efi_loader: signature: fix a size check against revocation list

Message ID 20200609050947.17861-9-takahiro.akashi@linaro.org
State Superseded, archived
Delegated to: Heinrich Schuchardt
Headers show
Series efi_loader: rework/improve UEFI secure boot code | expand

Commit Message

AKASHI Takahiro June 9, 2020, 5:09 a.m. UTC
Since the size check against an entry in efi_search_siglist() is
incorrect, this function will never find out a to-be-matched certificate
and its associated revocation time in the signature list.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 lib/efi_loader/efi_signature.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Heinrich Schuchardt July 3, 2020, 11 a.m. UTC | #1
On 09.06.20 07:09, AKASHI Takahiro wrote:
> Since the size check against an entry in efi_search_siglist() is
> incorrect, this function will never find out a to-be-matched certificate
> and its associated revocation time in the signature list.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> ---
>  lib/efi_loader/efi_signature.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/lib/efi_loader/efi_signature.c b/lib/efi_loader/efi_signature.c
> index a05c75472721..f22dc151971f 100644
> --- a/lib/efi_loader/efi_signature.c
> +++ b/lib/efi_loader/efi_signature.c
> @@ -434,10 +434,11 @@ static bool efi_search_siglist(struct x509_certificate *cert,
>  		 *	time64_t revocation_time;
>  		 * };
>  		 */
> -		if ((sig_data->size == SHA256_SUM_LEN) &&
> -		    !memcmp(sig_data->data, hash, SHA256_SUM_LEN)) {
> +		if ((sig_data->size >= SHA256_SUM_LEN + sizeof(time64_t)) &&
> +		    !memcmp(sig_data->data, msg, SHA256_SUM_LEN)) {
>  			memcpy(revoc_time, sig_data->data + SHA256_SUM_LEN,
>  			       sizeof(*revoc_time));
> +			EFI_PRINT("revocation time: %llu\n", *revoc_time);

*revoc_time is of type __s64. So this must be %lld. Cf.

include/linux/time.h:156

Best regards

Heinrich

>  			found = true;
>  			goto out;
>  		}
>
AKASHI Takahiro July 8, 2020, 1:12 a.m. UTC | #2
On Fri, Jul 03, 2020 at 01:00:21PM +0200, Heinrich Schuchardt wrote:
> On 09.06.20 07:09, AKASHI Takahiro wrote:
> > Since the size check against an entry in efi_search_siglist() is
> > incorrect, this function will never find out a to-be-matched certificate
> > and its associated revocation time in the signature list.
> >
> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > ---
> >  lib/efi_loader/efi_signature.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/efi_loader/efi_signature.c b/lib/efi_loader/efi_signature.c
> > index a05c75472721..f22dc151971f 100644
> > --- a/lib/efi_loader/efi_signature.c
> > +++ b/lib/efi_loader/efi_signature.c
> > @@ -434,10 +434,11 @@ static bool efi_search_siglist(struct x509_certificate *cert,
> >  		 *	time64_t revocation_time;
> >  		 * };
> >  		 */
> > -		if ((sig_data->size == SHA256_SUM_LEN) &&
> > -		    !memcmp(sig_data->data, hash, SHA256_SUM_LEN)) {
> > +		if ((sig_data->size >= SHA256_SUM_LEN + sizeof(time64_t)) &&
> > +		    !memcmp(sig_data->data, msg, SHA256_SUM_LEN)) {
> >  			memcpy(revoc_time, sig_data->data + SHA256_SUM_LEN,
> >  			       sizeof(*revoc_time));
> > +			EFI_PRINT("revocation time: %llu\n", *revoc_time);
> 
> *revoc_time is of type __s64. So this must be %lld. Cf.
> 
> include/linux/time.h:156

I know that because I added the definition.
Interestingly, linux added another type, timeu64_t, later on
to avoid an overflow in some calculation.

While I don't think the current format is harmful, I will change it.

-Takahiro Akashi


> Best regards
> 
> Heinrich
> 
> >  			found = true;
> >  			goto out;
> >  		}
> >
>
AKASHI Takahiro July 8, 2020, 1:30 a.m. UTC | #3
On Wed, Jul 08, 2020 at 10:12:38AM +0900, AKASHI Takahiro wrote:
> On Fri, Jul 03, 2020 at 01:00:21PM +0200, Heinrich Schuchardt wrote:
> > On 09.06.20 07:09, AKASHI Takahiro wrote:
> > > Since the size check against an entry in efi_search_siglist() is
> > > incorrect, this function will never find out a to-be-matched certificate
> > > and its associated revocation time in the signature list.
> > >
> > > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > > ---
> > >  lib/efi_loader/efi_signature.c | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/lib/efi_loader/efi_signature.c b/lib/efi_loader/efi_signature.c
> > > index a05c75472721..f22dc151971f 100644
> > > --- a/lib/efi_loader/efi_signature.c
> > > +++ b/lib/efi_loader/efi_signature.c
> > > @@ -434,10 +434,11 @@ static bool efi_search_siglist(struct x509_certificate *cert,
> > >  		 *	time64_t revocation_time;
> > >  		 * };
> > >  		 */
> > > -		if ((sig_data->size == SHA256_SUM_LEN) &&
> > > -		    !memcmp(sig_data->data, hash, SHA256_SUM_LEN)) {
> > > +		if ((sig_data->size >= SHA256_SUM_LEN + sizeof(time64_t)) &&
> > > +		    !memcmp(sig_data->data, msg, SHA256_SUM_LEN)) {
> > >  			memcpy(revoc_time, sig_data->data + SHA256_SUM_LEN,
> > >  			       sizeof(*revoc_time));
> > > +			EFI_PRINT("revocation time: %llu\n", *revoc_time);
> > 
> > *revoc_time is of type __s64. So this must be %lld. Cf.
> > 
> > include/linux/time.h:156
> 
> I know that because I added the definition.
> Interestingly, linux added another type, timeu64_t, later on
> to avoid an overflow in some calculation.
> 
> While I don't think the current format is harmful, I will change it.

Oops, I have already changed the format to "0x%llx" locally.
I will stick to this.


> -Takahiro Akashi
> 
> 
> > Best regards
> > 
> > Heinrich
> > 
> > >  			found = true;
> > >  			goto out;
> > >  		}
> > >
> >
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_signature.c b/lib/efi_loader/efi_signature.c
index a05c75472721..f22dc151971f 100644
--- a/lib/efi_loader/efi_signature.c
+++ b/lib/efi_loader/efi_signature.c
@@ -434,10 +434,11 @@  static bool efi_search_siglist(struct x509_certificate *cert,
 		 *	time64_t revocation_time;
 		 * };
 		 */
-		if ((sig_data->size == SHA256_SUM_LEN) &&
-		    !memcmp(sig_data->data, hash, SHA256_SUM_LEN)) {
+		if ((sig_data->size >= SHA256_SUM_LEN + sizeof(time64_t)) &&
+		    !memcmp(sig_data->data, msg, SHA256_SUM_LEN)) {
 			memcpy(revoc_time, sig_data->data + SHA256_SUM_LEN,
 			       sizeof(*revoc_time));
+			EFI_PRINT("revocation time: %llu\n", *revoc_time);
 			found = true;
 			goto out;
 		}