Re: [bug-report] drivers/media/platform/am437x/: illegal value of enum in vpfe_ccdc_set_params

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

 



Hi Changming

On Sun, Mar 8, 2020 at 3:32 AM Changming Liu
<liu.changm@xxxxxxxxxxxxxxxx> wrote:
>
> This email was sent due to the previous one was rejected because of it's in HTML form.
>
> From: Changming Liu
> Sent: Saturday, March 7, 2020 8:33 PM
> To: prabhakar.csengg@xxxxxxxxx
> Cc: linux-media@xxxxxxxxxxxxxxx; yaohway@xxxxxxxxx
> Subject: [bug-report] drivers/media/platform/am437x/: illegal value of enum in vpfe_ccdc_set_params
>
> Hi Lad,
> Greetings, I'm a first-year PhD student who is interested in the usage of UBSan in linux kernel. With some experiments, I've found that, a unsigned underflow might cause undesired behavior in
> drivers/media/platform/am437x/am437x-vpfe.c function vpfe_ccdc_set_params.
>
> More specifically, after the execution of
> x = copy_from_user(&raw_params, params, sizeof(raw_params));
> the raw_params are filled with data from user space.
>
> Then diving into function vpfe_ccdc_validate_param, when calling function ccdc_data_size_max_bit, at
> max_data = ccdc_data_size_max_bit(ccdcparam->data_sz);
> the enum member, named data_sz, of structure ccdcparam is compared with 7, otherwise data_sz is subtracted from 15, as in
> return sz == VPFE_CCDC_DATA_8BITS ? 7 : 15 - sz;
>
> The potential problem with this snippet of code is that, although in function ccdc_data_size_max_bit, ccdcparam->data_sz is treated as an enumeration with the range from 0 to 7 according to the definition of enum vpfe_ccdc_data_size, however it's essentially an unsigned 32 bit integer from user space. As a consequence, the return value of function ccdc_data_size_max_bit might be any value from 0 to 255 due to the unsigned underflow and truncation.
>
> It's worth noting that, although the usage of function of ccdc_gamma_width_max_bit has similar underflow problem, i.e. the value of ccdcparam->alaw.gamma_wd is also an unsigned 32 bit from user space, while itself is a enum type. However it's checked in
> if (ccdcparam->alaw.gamma_wd > VPFE_CCDC_GAMMA_BITS_09_0 ||
>     max_gamma > max_data) {
>                 vpfe_dbg(1, vpfe, "Invalid data line select\n");
>                 return -EINVAL;
> }
> This if clause exclude all illegal values and keep the enum variable in range, I wonder if it's necessary to apply the similar check to ccdcparam->data_sz to keep the its value legal as well.
>
> Due to the lack of knowledge of the interaction between this module and the user space, I'm not able to assess if this is a security-related issue. Judging from the appearance, a malicious user can possibly manipulate the return value of ccdc_data_size_max_bit and make the check of "max_gamma > max_data" always pass. I'd be more than happy to hear your valuable opinions and provide more information if needed. If such a check is unnecessary, I would appreciate it if I can know why, this can help me understand linux a lot!
>
Totally agree (good catch!), vpfe_ccdc_validate_param() should be more
stringent on checking the user space params. Would you create a patch
fixing it ?

Cheers,
--Prabhakar

> Looking forward to your response!
>
> Best regards,
> Changming Liu




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux