From: Dan Carpenter <dan.carpenter@linaro.org>
To: Wenchao Hao <haowenchao22@gmail.com>
Cc: Wenchao Hao <haowenchao2@huawei.com>,
Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>,
Vinod Koul <vkoul@kernel.org>,
"James E.J. Bottomley" <jejb@linux.ibm.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Douglas Gilbert <dgilbert@interlog.com>,
dmaengine@vger.kernel.org, linux-scsi@vger.kernel.org,
kernel-janitors@vger.kernel.org
Subject: Re: [PATCH 1/2] scsi: scsi_debug: fix some bugs in sdebug_error_write()
Date: Mon, 23 Oct 2023 16:39:40 +0300 [thread overview]
Message-ID: <44b0eca3-57c1-4edd-ab35-c389dc976273@kadam.mountain> (raw)
In-Reply-To: <CAOptpSMTgGwyFkn8o6qAEnUKXh+_mOr8dQKAZUWfM_4QEnxzxw@mail.gmail.com>
On Sat, Oct 21, 2023 at 06:10:44PM +0800, Wenchao Hao wrote:
> On Fri, Oct 20, 2023 at 10:15 PM Dan Carpenter <dan.carpenter@linaro.org> wrote:
> >
> > There are two bug in this code:
>
> Thanks for your fix, some different points of view as follows.
>
> > 1) If count is zero, then it will lead to a NULL dereference. The
> > kmalloc() will successfully allocate zero bytes and the test for
> > "if (buf[0] == '-')" will read beyond the end of the zero size buffer
> > and Oops.
>
> This sysfs interface is usually used by cmdline, mostly, "echo" is used
> to write it and "echo" always writes with '\n' terminated, which would
> not cause a write with count=0.
>
You are saying "sysfs" but this is debugfs. Sysfs is completely
different. Also saying that 'and "echo" always writes with '\n'
terminated' is not true either even in sysfs...
> While in terms of security, we should add a check for count==0
> condition and return EINVAL.
Checking for zero is a valid approach. I considered that but my way
was cleaner.
>
> > 2) The code does not ensure that the user's string is properly NUL
> > terminated which could lead to a read overflow.
> >
>
> I don't think so, the copy_from_user() would limit the accessed length
> to count, so no read overflow would happen.
>
> Userspace's write would allocate a buffer larger than it actually
> needed(usually 4K), but the buffer would not be cleared, so some
> dirty data would be passed to the kernel space.
>
> We might have following pairs of parameters for sdebug_error_write:
>
> ubuf: "0 -10 0x12\n0 0 0x2 0x6 0x4 0x2"
> count=11
>
> the valid data in ubuf is "0 -10 -x12\n", others are dirty data.
> strndup_user() would return EINVAL for this pair which caused
> a correct write to fail.
>
> You can recurrent the above error with my script attached.
You're looking for the buffer overflow in the wrong place.
drivers/scsi/scsi_debug.c
1026 if (copy_from_user(buf, ubuf, count)) {
^^^
We copy data from the user but it is not NUL terminated.
1027 kfree(buf);
1028 return -EFAULT;
1029 }
1030
1031 if (buf[0] == '-')
1032 return sdebug_err_remove(sdev, buf, count);
1033
1034 if (sscanf(buf, "%d", &inject_type) != 1) {
^^^
This will read beyond the end of the buffer. sscanf() relies on a NUL
terminator to know when then end of the string is.
1035 kfree(buf);
1036 return -EINVAL;
1037 }
Obviously the user in this situation is like a hacker who wants to do
something bad, not a normal users. For a normal user this code is fine
as you say.
You will need to test this with .c code instead of shell if you want to
see the bug.
regards,
dan carpenter
next prev parent reply other threads:[~2023-10-23 13:39 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-20 14:15 [PATCH 1/2] scsi: scsi_debug: fix some bugs in sdebug_error_write() Dan Carpenter
2023-10-21 10:10 ` Wenchao Hao
2023-10-23 13:39 ` Dan Carpenter [this message]
2023-10-24 17:09 ` Wenchao Hao
2023-10-25 4:11 ` Dan Carpenter
2023-10-25 6:10 ` Wenchao Hao
2023-10-25 7:07 ` Dan Carpenter
2023-11-03 18:00 ` Wenchao Hao
2023-11-03 18:13 ` Wenchao Hao
2023-11-06 13:44 ` Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44b0eca3-57c1-4edd-ab35-c389dc976273@kadam.mountain \
--to=dan.carpenter@linaro.org \
--cc=Eugeniy.Paltsev@synopsys.com \
--cc=dgilbert@interlog.com \
--cc=dmaengine@vger.kernel.org \
--cc=haowenchao22@gmail.com \
--cc=haowenchao2@huawei.com \
--cc=jejb@linux.ibm.com \
--cc=kernel-janitors@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox