Thread (2 messages) 2 messages, 2 authors, 2021-09-10

Re: [PATCH v2 6/8] arm64: Import latest memcpy()/memmove() implementation

flat view

From: Peter Collingbourne <hidden>
Date: 2021-09-10 20:38:06

On Fri, Sep 10, 2021 at 4:42 AM Robin Murphy [off-list ref] wrote:
On 2021-09-10 01:35, Peter Collingbourne wrote:
quoted
Hi Robin,

(apologies for breaking the threading, I wasn't subscribed to
linux-arm-kernel when you sent this)

It looks like this patch breaks the KASAN unit tests when running in
HW tags mode. You can construct a config that reproduces the problem
with something like:

make O=out defconfig
scripts/config --file out/.config -e CONFIG_KUNIT -e CONFIG_KASAN -e
CONFIG_KASAN_HW_TAGS -e CONFIG_KASAN_KUNIT_TEST
yes '' | make O=out syncconfig

With that the "kmalloc_memmove_invalid_size" test fails and causes the
kernel panic below.

What appears to be going on is that whereas the old memcpy
implementation ends up returning early after not copying very much
data if supplied a "negative" size as a side effect of using
conditional branches that implement signed comparisons (e.g. b.ge on
line 75), the new implementation does not exit early and attempts to
copy a large amount of data backwards 4 bytes (after having disabled
MTE early on as a result of a tag mismatch) until it hits a read-only
page and causes a panic.
If the test depends on the implementation of memmove() being buggy, it's
clearly not a very good test :/
quoted
I'm not sure what the correct fix should be. It seems that at least
when KASAN is enabled we should be able to catch these invalid memcpys
somehow, print an error report and ideally abort the entire operation.
But we should do so without causing a performance impact in the usual
case.
Not sure I follow - the top of the log below clearly shows that KASASN
*is* detecting and reporting a bad access. The fact that code intended
to deliberately corrupt memory goes on to corrupt memory doesn't seem
particularly surprising to me. A bug exists (intentionally or otherwise)
which led to that invalid access being attempted, and KASAN can't
magically change that.
That makes sense. So we want to make sure that:

a) memmove overflows trigger an error report
b) we can safely continue execution

It seems the best way to ensure both of these properties is to have
the memmove do an out-of-bounds read -- all writes would then be into
the correct allocation. That way, we should see an error report but no
memory corruption. We can do that by changing the memmove call to only
copy "size" bytes.

When I was about to send my patch I noticed that Andrey already sent a
fix for this in commit 1b0668be62cf that disables the memmove test
when KASAN HW tags is enabled. I reckon there's still some value in
testing a) in HW tags mode, so I went ahead and had my patch also
revert his.

Peter

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help