diff mbox series

[BlueZ] btmon-logger: Fix stack corruption

Message ID 20240121100328.1200839-1-mk@lab.zgora.pl
State New
Headers show
Series [BlueZ] btmon-logger: Fix stack corruption | expand

Commit Message

Mariusz Kozlowski Jan. 21, 2024, 10:03 a.m. UTC
Version 3 capability masks are 64 bits in size.
---
 tools/btmon-logger.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

bluez.test.bot@gmail.com Jan. 21, 2024, 11:06 a.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=818351

---Test result---

Test Summary:
CheckPatch                    PASS      0.44 seconds
GitLint                       PASS      0.31 seconds
BuildEll                      PASS      23.70 seconds
BluezMake                     PASS      693.93 seconds
MakeCheck                     PASS      12.21 seconds
MakeDistcheck                 PASS      157.89 seconds
CheckValgrind                 PASS      220.46 seconds
CheckSmatch                   PASS      324.72 seconds
bluezmakeextell               PASS      105.36 seconds
IncrementalBuild              PASS      649.47 seconds
ScanBuild                     PASS      937.56 seconds



---
Regards,
Linux Bluetooth
Luiz Augusto von Dentz Jan. 22, 2024, 6:27 p.m. UTC | #2
Hi Mariusz,

On Sun, Jan 21, 2024 at 5:04 AM Mariusz Kozłowski <mk@lab.zgora.pl> wrote:
>
> Version 3 capability masks are 64 bits in size.
> ---
>  tools/btmon-logger.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c
> index a770ad575..1f6db3751 100644
> --- a/tools/btmon-logger.c
> +++ b/tools/btmon-logger.c
> @@ -161,14 +161,14 @@ extern int capset(struct __user_cap_header_struct *header,
>  static void drop_capabilities(void)
>  {
>         struct __user_cap_header_struct header;
> -       struct __user_cap_data_struct cap;
> +       struct __user_cap_data_struct cap[_LINUX_CAPABILITY_U32S_3];

Ok, but this doesn't change the field, it makes it an array, or are
you talking about the following note:

Note that 64-bit capabilities use datap[0] and datap[1], whereas
32-bit capabilities use only datap[0].

In that case Ive just pointed out to this note to explain why this is needed.

>         unsigned int mask;
>         int err;
>
>         header.version = _LINUX_CAPABILITY_VERSION_3;
>         header.pid = 0;
>
> -       err = capget(&header, &cap);
> +       err = capget(&header, cap);
>         if (err) {
>                 perror("Unable to get current capabilities");
>                 return;
> @@ -177,11 +177,11 @@ static void drop_capabilities(void)
>         /* not needed anymore since monitor socket is already open */
>         mask = ~CAP_TO_MASK(CAP_NET_RAW);
>
> -       cap.effective &= mask;
> -       cap.permitted &= mask;
> -       cap.inheritable &= mask;
> +       cap[0].effective &= mask;
> +       cap[0].permitted &= mask;
> +       cap[0].inheritable &= mask;
>
> -       err = capset(&header, &cap);
> +       err = capset(&header, cap);
>         if (err)
>                 perror("Failed to set capabilities");
>  }
> --
> 2.34.1
>
>
Mariusz Kozlowski Jan. 23, 2024, 8:12 a.m. UTC | #3
Hi Luiz,

 > Hi Mariusz, 
 >  
 > On Sun, Jan 21, 2024 at 5:04 AM Mariusz Kozłowski mk@lab.zgora.pl> wrote: 
 > > 
 > > Version 3 capability masks are 64 bits in size. 
 > > --- 
 > >  tools/btmon-logger.c | 12 ++++++------ 
 > >  1 file changed, 6 insertions(+), 6 deletions(-) 
 > > 
 > > diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c 
 > > index a770ad575..1f6db3751 100644 
 > > --- a/tools/btmon-logger.c 
 > > +++ b/tools/btmon-logger.c 
 > > @@ -161,14 +161,14 @@ extern int capset(struct __user_cap_header_struct *header, 
 > >  static void drop_capabilities(void) 
 > >  { 
 > >         struct __user_cap_header_struct header; 
 > > -       struct __user_cap_data_struct cap; 
 > > +       struct __user_cap_data_struct cap[_LINUX_CAPABILITY_U32S_3]; 
 >  
 > Ok, but this doesn't change the field, it makes it an array, or are 
 > you talking about the following note: 
 >  
 > Note that 64-bit capabilities use datap[0] and datap[1], whereas 
 > 32-bit capabilities use only datap[0]. 
 >  
 > In that case Ive just pointed out to this note to explain why this is needed. 
 
For version 3 caps (64 bit masks) a single struct __user_cap_data_struct is not
big enough and capget() writes past the end of cap structure on the stack. To
accomodate version 3 cap masks the cap structure needs to be 2x bigger.

 > >         unsigned int mask; 
 > >         int err; 
 > > 
 > >         header.version = _LINUX_CAPABILITY_VERSION_3; 
 > >         header.pid = 0; 
 > > 
 > > -       err = capget(&header, &cap); 
 > > +       err = capget(&header, cap); 
 > >         if (err) { 
 > >                 perror("Unable to get current capabilities"); 
 > >                 return; 
 > > @@ -177,11 +177,11 @@ static void drop_capabilities(void) 
 > >         /* not needed anymore since monitor socket is already open */ 
 > >         mask = ~CAP_TO_MASK(CAP_NET_RAW); 
 > > 
 > > -       cap.effective &= mask; 
 > > -       cap.permitted &= mask; 
 > > -       cap.inheritable &= mask; 
 > > +       cap[0].effective &= mask; 
 > > +       cap[0].permitted &= mask; 
 > > +       cap[0].inheritable &= mask; 
 > > 
 > > -       err = capset(&header, &cap); 
 > > +       err = capset(&header, cap); 
 > >         if (err) 
 > >                 perror("Failed to set capabilities"); 
 > >  } 
 > > -- 
 > > 2.34.1 
 > > 
 > > 
 >  
 >  
 > -- 
 > Luiz Augusto von Dentz 
 >  
 >
Mariusz Kozlowski Feb. 12, 2024, 8:30 a.m. UTC | #4
Hi Luiz,

---- On Tue, 23 Jan 2024 09:12:50 +0100 Mariusz Kozlowski  wrote ---

 > Hi Luiz, 
 >  
 >  > Hi Mariusz, 
 >  > 
 >  > On Sun, Jan 21, 2024 at 5:04 AM Mariusz Kozłowski mk@lab.zgora.pl> wrote: 
 >  > > 
 >  > > Version 3 capability masks are 64 bits in size. 
 >  > > --- 
 >  > >  tools/btmon-logger.c | 12 ++++++------ 
 >  > >  1 file changed, 6 insertions(+), 6 deletions(-) 
 >  > > 
 >  > > diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c 
 >  > > index a770ad575..1f6db3751 100644 
 >  > > --- a/tools/btmon-logger.c 
 >  > > +++ b/tools/btmon-logger.c 
 >  > > @@ -161,14 +161,14 @@ extern int capset(struct __user_cap_header_struct *header, 
 >  > >  static void drop_capabilities(void) 
 >  > >  { 
 >  > >         struct __user_cap_header_struct header; 
 >  > > -       struct __user_cap_data_struct cap; 
 >  > > +       struct __user_cap_data_struct cap[_LINUX_CAPABILITY_U32S_3]; 
 >  > 
 >  > Ok, but this doesn't change the field, it makes it an array, or are 
 >  > you talking about the following note: 
 >  > 
 >  > Note that 64-bit capabilities use datap[0] and datap[1], whereas 
 >  > 32-bit capabilities use only datap[0]. 
 >  > 
 >  > In that case Ive just pointed out to this note to explain why this is needed. 
 >  
 > For version 3 caps (64 bit masks) a single struct __user_cap_data_struct is not 
 > big enough and capget() writes past the end of cap structure on the stack. To 
 > accomodate version 3 cap masks the cap structure needs to be 2x bigger. 
 
What is the status of this patch? I don't see it either accepted or rejected.

 >  > >         unsigned int mask; 
 >  > >         int err; 
 >  > > 
 >  > >         header.version = _LINUX_CAPABILITY_VERSION_3; 
 >  > >         header.pid = 0; 
 >  > > 
 >  > > -       err = capget(&header, &cap); 
 >  > > +       err = capget(&header, cap); 
 >  > >         if (err) { 
 >  > >                 perror("Unable to get current capabilities"); 
 >  > >                 return; 
 >  > > @@ -177,11 +177,11 @@ static void drop_capabilities(void) 
 >  > >         /* not needed anymore since monitor socket is already open */ 
 >  > >         mask = ~CAP_TO_MASK(CAP_NET_RAW); 
 >  > > 
 >  > > -       cap.effective &= mask; 
 >  > > -       cap.permitted &= mask; 
 >  > > -       cap.inheritable &= mask; 
 >  > > +       cap[0].effective &= mask; 
 >  > > +       cap[0].permitted &= mask; 
 >  > > +       cap[0].inheritable &= mask; 
 >  > > 
 >  > > -       err = capset(&header, &cap); 
 >  > > +       err = capset(&header, cap); 
 >  > >         if (err) 
 >  > >                 perror("Failed to set capabilities"); 
 >  > >  } 

Thanks,
Mariusz
diff mbox series

Patch

diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c
index a770ad575..1f6db3751 100644
--- a/tools/btmon-logger.c
+++ b/tools/btmon-logger.c
@@ -161,14 +161,14 @@  extern int capset(struct __user_cap_header_struct *header,
 static void drop_capabilities(void)
 {
 	struct __user_cap_header_struct header;
-	struct __user_cap_data_struct cap;
+	struct __user_cap_data_struct cap[_LINUX_CAPABILITY_U32S_3];
 	unsigned int mask;
 	int err;
 
 	header.version = _LINUX_CAPABILITY_VERSION_3;
 	header.pid = 0;
 
-	err = capget(&header, &cap);
+	err = capget(&header, cap);
 	if (err) {
 		perror("Unable to get current capabilities");
 		return;
@@ -177,11 +177,11 @@  static void drop_capabilities(void)
 	/* not needed anymore since monitor socket is already open */
 	mask = ~CAP_TO_MASK(CAP_NET_RAW);
 
-	cap.effective &= mask;
-	cap.permitted &= mask;
-	cap.inheritable &= mask;
+	cap[0].effective &= mask;
+	cap[0].permitted &= mask;
+	cap[0].inheritable &= mask;
 
-	err = capset(&header, &cap);
+	err = capset(&header, cap);
 	if (err)
 		perror("Failed to set capabilities");
 }