From: Vincenzo Frascino <vincenzo.frascino@arm.com>
To: linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Dmitry Vyukov <dvyukov@google.com>,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Alexander Potapenko <glider@google.com>,
Marco Elver <elver@google.com>,
Evgenii Stepanov <eugenis@google.com>,
Branislav Rankov <Branislav.Rankov@arm.com>,
Andrey Konovalov <andreyknvl@google.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Subject: [PATCH v14 8/8] kselftest/arm64: Verify that TCO is enabled in load_unaligned_zeropad()
Date: Mon, 8 Mar 2021 16:14:34 +0000 [thread overview]
Message-ID: <20210308161434.33424-9-vincenzo.frascino@arm.com> (raw)
In-Reply-To: <20210308161434.33424-1-vincenzo.frascino@arm.com>
load_unaligned_zeropad() and __get/put_kernel_nofault() functions can
read passed some buffer limits which may include some MTE granule with a
different tag.
When MTE async mode is enable, the load operation crosses the boundaries
and the next granule has a different tag the PE sets the TFSR_EL1.TF1
bit as if an asynchronous tag fault is happened:
==================================================================
BUG: KASAN: invalid-access
Asynchronous mode enabled: no access details available
CPU: 0 PID: 1 Comm: init Not tainted 5.12.0-rc1-ge1045c86620d-dirty #8
Hardware name: FVP Base RevC (DT)
Call trace:
dump_backtrace+0x0/0x1c0
show_stack+0x18/0x24
dump_stack+0xcc/0x14c
kasan_report_async+0x54/0x70
mte_check_tfsr_el1+0x48/0x4c
exit_to_user_mode+0x18/0x38
finish_ret_to_user+0x4/0x15c
==================================================================
Verify that Tag Check Override (TCO) is enabled in these functions before
the load and disable it afterwards to prevent this to happen.
Note: The issue has been observed only with an MTE enabled userspace.
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Reported-by: Branislav Rankov <Branislav.Rankov@arm.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
.../arm64/mte/check_read_beyond_buffer.c | 78 +++++++++++++++++++
1 file changed, 78 insertions(+)
create mode 100644 tools/testing/selftests/arm64/mte/check_read_beyond_buffer.c
diff --git a/tools/testing/selftests/arm64/mte/check_read_beyond_buffer.c b/tools/testing/selftests/arm64/mte/check_read_beyond_buffer.c
new file mode 100644
index 000000000000..eb03cd52a58e
--- /dev/null
+++ b/tools/testing/selftests/arm64/mte/check_read_beyond_buffer.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2020 ARM Limited
+
+#define _GNU_SOURCE
+
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/auxv.h>
+#include <sys/mman.h>
+#include <sys/prctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "kselftest.h"
+#include "mte_common_util.h"
+#include "mte_def.h"
+
+#define NUM_DEVICES 8
+
+static char *dev[NUM_DEVICES] = {
+ "/proc/cmdline",
+ "/fstab.fvp",
+ "/dev/null",
+ "/proc/mounts",
+ "/proc/filesystems",
+ "/proc/cmdline",
+ "/proc/device-tre", /* incorrect path */
+ "",
+};
+
+#define FAKE_PERMISSION 0x88000
+#define MAX_DESCRIPTOR 0xffffffff
+
+int mte_read_beyond_buffer_test(void)
+{
+ int fd[NUM_DEVICES];
+ unsigned int _desc, _dev;
+
+ for (_desc = 0; _desc <= MAX_DESCRIPTOR; _desc++) {
+ for (_dev = 0; _dev < NUM_DEVICES; _dev++) {
+#ifdef _TEST_DEBUG
+ printf("[TEST]: openat(0x%x, %s, 0x%x)\n", _desc, dev[_dev], FAKE_PERMISSION);
+#endif
+
+ fd[_dev] = openat(_desc, dev[_dev], FAKE_PERMISSION);
+ }
+
+ for (_dev = 0; _dev <= NUM_DEVICES; _dev++)
+ close(fd[_dev]);
+ }
+
+ return KSFT_PASS;
+}
+
+int main(int argc, char *argv[])
+{
+ int err;
+
+ err = mte_default_setup();
+ if (err)
+ return err;
+
+ ksft_set_plan(1);
+
+ evaluate_test(mte_read_beyond_buffer_test(),
+ "Verify that TCO is enabled correctly if a read beyond buffer occurs\n");
+
+ mte_restore_setup();
+ ksft_print_cnts();
+
+ return ksft_get_fail_cnt() == 0 ? KSFT_PASS : KSFT_FAIL;
+}
--
2.30.0
next prev parent reply other threads:[~2021-03-08 16:16 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-08 16:14 [PATCH v14 0/8] arm64: ARMv8.5-A: MTE: Add async mode support Vincenzo Frascino
2021-03-08 16:14 ` [PATCH v14 1/8] arm64: mte: Add asynchronous " Vincenzo Frascino
2021-03-08 16:14 ` [PATCH v14 2/8] kasan: Add KASAN mode kernel parameter Vincenzo Frascino
2021-03-08 16:14 ` [PATCH v14 3/8] arm64: mte: Drop arch_enable_tagging() Vincenzo Frascino
2021-03-11 10:38 ` Catalin Marinas
2021-03-08 16:14 ` [PATCH v14 4/8] kasan: Add report for async mode Vincenzo Frascino
2021-03-08 16:14 ` [PATCH v14 5/8] arm64: mte: Enable TCO in functions that can read beyond buffer limits Vincenzo Frascino
2021-03-08 18:09 ` Mark Rutland
2021-03-09 10:26 ` Vincenzo Frascino
2021-03-08 21:58 ` kernel test robot
2021-03-09 0:28 ` kernel test robot
2021-03-09 22:40 ` kernel test robot
2021-03-08 16:14 ` [PATCH v14 6/8] arm64: mte: Enable async tag check fault Vincenzo Frascino
2021-03-08 16:14 ` [PATCH v14 7/8] arm64: mte: Report async tag faults before suspend Vincenzo Frascino
2021-03-08 16:14 ` Vincenzo Frascino [this message]
2021-03-11 13:25 ` [PATCH v14 8/8] kselftest/arm64: Verify that TCO is enabled in load_unaligned_zeropad() Catalin Marinas
2021-03-11 15:00 ` Vincenzo Frascino
2021-03-11 16:28 ` Catalin Marinas
2021-03-11 16:34 ` Vincenzo Frascino
2021-03-08 21:02 ` [PATCH v14 0/8] arm64: ARMv8.5-A: MTE: Add async mode support Andrey Konovalov
2021-03-09 10:11 ` Vincenzo Frascino
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=20210308161434.33424-9-vincenzo.frascino@arm.com \
--to=vincenzo.frascino@arm.com \
--cc=Branislav.Rankov@arm.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@google.com \
--cc=aryabinin@virtuozzo.com \
--cc=catalin.marinas@arm.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=eugenis@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=will@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;
as well as URLs for NNTP newsgroup(s).