Received: by 10.223.185.111 with SMTP id b44csp133648wrg; Fri, 9 Mar 2018 02:24:17 -0800 (PST) X-Google-Smtp-Source: AG47ELs/lldpUbTIXK+Agfhv6j+HHziFJed3lzr6ZZNK8nrY+JJYEvFJ0/I3FHeWavFmOkZR/wm6 X-Received: by 10.99.117.76 with SMTP id f12mr24409269pgn.410.1520591057255; Fri, 09 Mar 2018 02:24:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520591057; cv=none; d=google.com; s=arc-20160816; b=fkzW4tocnljw7vspjGsW71h+0TfNKbEf018xpz4G822MlfsCWlfX6L2btsL1ieoV9q KejKvI7uZ+mVf3g2Uz3wZjsLnIlXw/YtoOG6U3vTNE/UR4zJswN57YVbC9M6ORQw/p66 yfH0tmKWSARU2ruZcyYruTvkpd0jN5rwkXN7HONLeiccdMhbWliiQIU6u3+fIVtLNgMp D6vVK4TGua5tendVaBgWVpWOxGdXAZU4ZdfcQ6A6PYF/y5LCapChNywJffURC0Yu/s9q mcqHRTpZ+XK5ilu6qoOI1IxL+G6lAd9RxlvT4uIJwKzfNH68mNsdp1LA9KxSh/d+Iwxp qQ6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=412aKYKrKGBJ1QtNgMtMxCcCpdBW8gZGjra/C2spuSc=; b=vpZe6mQiT9kSF5CZQPhkwloS3Dajm34+IYIi48bNhZoJWlYGZuo3+2lpQw0ua9olog P1rvTb2wB43C7SwfxcanhwHi9HN/G3xwcoQmxS8syTq8/5pODF0jRv/TzHsJxbf3zzVG 1cyGvlsKANFESwEeY3Hu1aZ42zxR8/FYGF7Pt0qXUllGKKt8Z+r77K6dDq8xVUwQTjq+ H+qYyL0TrAAqOdoeBbkp0yv8e8lU3iehElqSmOXbSiSQH4oJsXF94gDDb5czWrUNaYju psmiv23i5PSl8UjJso8yGaaf8xDcUbXjgIdoanl9aQ4Z9+MAd3aMBvn4KYIPqyU/0VRJ BbHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=s3EOrIyz; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e92-v6si592499pld.736.2018.03.09.02.24.02; Fri, 09 Mar 2018 02:24:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=s3EOrIyz; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751102AbeCIKWz (ORCPT + 99 others); Fri, 9 Mar 2018 05:22:55 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:44829 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750948AbeCIKWy (ORCPT ); Fri, 9 Mar 2018 05:22:54 -0500 Received: by mail-pg0-f65.google.com with SMTP id l4so3380986pgp.11 for ; Fri, 09 Mar 2018 02:22:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :user-agent; bh=412aKYKrKGBJ1QtNgMtMxCcCpdBW8gZGjra/C2spuSc=; b=s3EOrIyzhOquPzccKMjEAzQRcPL3ZrJIupKJOr4kv8pwzWK0COsdAcBmghjVmaqBTY qkTfbuzvLiGg0rJAOpGwgY4wq9MWblNaIKM4amvcBJKtXToykAvj6uniEeHAUCF7bR3m sBHRcicKejBMkbzUEjqoKh+Fgfvpz3JIw5DHT3WyEy3PcPullezqKomUg77gbjPxKJST +pdIZhhaGiZB6XT2hNnfbko/SQIHIdGkLQkQFa+d1EaIKBrzRTFFAHC8VGnCH0iuwh7x TPzwmuGJSiCCxUwAVs4+c4rLX78/F2W5fPpGdLoFap8O6T0zaez3efe/t8GTPMzRvsfX bN3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=412aKYKrKGBJ1QtNgMtMxCcCpdBW8gZGjra/C2spuSc=; b=rIpMISqD5f1Lc4h+2oCQUSSiVzux0D4i/tir+KCykri83zM/e+337jjNpKq5GFClmf kh1+oBCS7FMov5x5clAY0sBmF9Kw4Xbm3tsSs7X1iaY7O/rLd71iCPnYdObYtY+SA8dU Yw2z0jBWUIF3sZjWOgY3cp9AjgCTBzPn2z/dbsXbSfqRvdfTz+uA501DqFZzK9fjSD8Q C0KBW2tzSArXaQDajO3sXPPozVGJyB0s1S1SZU+bD2uKVR5D2Q1pKBpQigXXRmzo4lCs IWXThGCbDKIYVMJQ06M4RoqHLJsOgVBR2ub7i+TCZpx4hz+rd3tgL0jfQOuxEdzd5GEG nosg== X-Gm-Message-State: APf1xPDMXaoyJ5UVRfEGfKfvvBjb9+hSlVVKEn8K/8xE9B/gBtqTW5fo LePolDcwxC+sGi50Sp7W61JDgg== X-Received: by 10.99.123.79 with SMTP id k15mr24061382pgn.173.1520590973546; Fri, 09 Mar 2018 02:22:53 -0800 (PST) Received: from pjb1027-Latitude-E5410 ([58.227.15.43]) by smtp.gmail.com with ESMTPSA id g16sm2418665pfd.23.2018.03.09.02.22.51 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Fri, 09 Mar 2018 02:22:53 -0800 (PST) Date: Fri, 9 Mar 2018 19:22:47 +0900 From: Jinbum Park To: linux-kernel@vger.kernel.org, kernel-hardening@lists.openwall.com Cc: akpm@linux-foundation.org, aryabinin@virtuozzo.com, dvyukov@google.com, keescook@chromium.org Subject: [PATCH] lib: Add testing module for UBSAN Message-ID: <20180309102247.GA2944@pjb1027-Latitude-E5410> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a test module for UBSAN. It triggers all undefined behaviors that linux supports now, and detect them. All test-cases have passed by compiling with gcc-5.5.0. If use gcc-4.9.x, misaligned, out-of-bounds, object-size-mismatch will not be detected. Because gcc-4.9.x doesn't support them. Signed-off-by: Jinbum Park --- lib/Kconfig.ubsan | 7 +++ lib/Makefile | 2 + lib/test_ubsan.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 lib/test_ubsan.c diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan index a669c19..19d42ea 100644 --- a/lib/Kconfig.ubsan +++ b/lib/Kconfig.ubsan @@ -46,3 +46,10 @@ config UBSAN_NULL help This option enables detection of memory accesses via a null pointer. + +config TEST_UBSAN + tristate "Module for testing for undefined behavior detection" + depends on m && UBSAN + help + This is a test module for UBSAN. + It triggers various undefined behavior, and detect it. diff --git a/lib/Makefile b/lib/Makefile index c25957d1..f3503f8 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -54,6 +54,8 @@ obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o obj-$(CONFIG_TEST_KASAN) += test_kasan.o CFLAGS_test_kasan.o += -fno-builtin +obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o +UBSAN_SANITIZE_test_ubsan.o := y obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o obj-$(CONFIG_TEST_LKM) += test_module.o diff --git a/lib/test_ubsan.c b/lib/test_ubsan.c new file mode 100644 index 0000000..58dedff --- /dev/null +++ b/lib/test_ubsan.c @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include + +typedef void(*test_ubsan_fp)(void); + +static void test_ubsan_add_overflow(void) +{ + volatile int val = INT_MAX; + + val += 2; +} + +static void test_ubsan_sub_overflow(void) +{ + volatile int val = INT_MIN; + volatile int val2 = 2; + + val -= val2; +} + +static void test_ubsan_mul_overflow(void) +{ + volatile int val = INT_MAX / 2; + + val *= 3; +} + +static void test_ubsan_negate_overflow(void) +{ + volatile int val = INT_MIN; + + val = -val; +} + +static void test_ubsan_divrem_overflow(void) +{ + volatile int val = 16; + volatile int val2 = 0; + + val /= val2; +} + +static void test_ubsan_vla_bound_not_positive(void) +{ + volatile int size = -1; + char buf[size]; + + (void)buf; +} + +static void test_ubsan_shift_out_of_bounds(void) +{ + volatile int val = -1; + int val2 = 10; + + val2 <<= val; +} + +static void test_ubsan_out_of_bounds(void) +{ + volatile int i = 4, j = 5; + volatile int arr[i]; + + arr[j] = i; +} + +static void test_ubsan_load_invalid_value(void) +{ + volatile char *dst, *src; + bool val, val2, *ptr; + char c = 4; + + dst = (char *)&val; + src = &c; + *dst = *src; + + ptr = &val2; + val2 = val; +} + +static void test_ubsan_null_ptr_deref(void) +{ + volatile int *ptr = NULL; + int val; + + val = *ptr; +} + +void test_ubsan_misaligned_access(void) +{ + volatile char arr[5] __aligned(4) = {1, 2, 3, 4, 5}; + volatile int *ptr, val = 6; + + ptr = (int *)(arr + 1); + *ptr = val; +} + +static void test_ubsan_object_size_mismatch(void) +{ + /* "((aligned(8)))" helps this not into be misaligned for ptr-access. */ + volatile int val __aligned(8) = 4; + volatile long long *ptr, val2; + + ptr = (long long *)&val; + val2 = *ptr; +} + +static const test_ubsan_fp test_ubsan_array[] = { + test_ubsan_add_overflow, + test_ubsan_sub_overflow, + test_ubsan_mul_overflow, + test_ubsan_negate_overflow, + test_ubsan_divrem_overflow, + test_ubsan_vla_bound_not_positive, + test_ubsan_shift_out_of_bounds, + test_ubsan_out_of_bounds, + test_ubsan_load_invalid_value, + //test_ubsan_null_ptr_deref, /* exclude it because there is a crash */ + test_ubsan_misaligned_access, + test_ubsan_object_size_mismatch, +}; + +static int __init test_ubsan_init(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(test_ubsan_array); i++) + test_ubsan_array[i](); + + (void)test_ubsan_null_ptr_deref; /* to avoid unsed-function warning */ + return 0; +} +module_init(test_ubsan_init); + +static void __exit test_ubsan_exit(void) +{ + /* do nothing */ +} +module_exit(test_ubsan_exit); + +MODULE_AUTHOR("Jinbum Park "); +MODULE_LICENSE("GPL v2"); -- 1.9.1