Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp2626392rwb; Sat, 24 Sep 2022 11:45:29 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4Z5ZIMP/O82DNupChRH0QzUh/9viMvKL7XwSkEJv13JRjkIN7R/+UDju7c3tYsLcn8fdc1 X-Received: by 2002:a50:ee15:0:b0:457:38e:9d76 with SMTP id g21-20020a50ee15000000b00457038e9d76mr3052835eds.242.1664045129471; Sat, 24 Sep 2022 11:45:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664045129; cv=none; d=google.com; s=arc-20160816; b=I5kPi4b8ORQ+zv2jEjr05ljdYn/y26njdm1nn5B9hc/Uj/DEt54Fg1c2Yz19h7d1Vu n1AHuwQy/3GA9Kt5R4S0gHUfoNYgJ0xPxglhZEmXXV2p+YbNgaN+ZcuRycvA1f5xHJwb LvCTY85rZTq56SC/tO2B4hv6CORQ3z/7bYpwBsQDDLQ4MWq/QdJx5lepIb7OE81wrUET NW5iI+BtWh+3Mv2Kkx4nRyg0OjjG4uRXxPdjUlKZA3aNp675ZOcAxha5oIpOocc7J7dd pjrWkMCz9sFufD6VpLnAzBzRAwVxk+/yxFCYVCGHOmR6fpOf/tWU0dmh7KfwaKzMlISq m4Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=wCZqMmRS53sAUXuFaKIWMcHMmvAGs3N+TjAFGrnshio=; b=pLrmmG6IBdTzgDEdn6WT4k8caIcK1BcrkSsUg7e8f5ZEcMOyBMAut9YTHsyu2Q2e1G WKckT4p8skDxcb6mD2KozWGiSfM/6Et/pUBjQIBcPDi8X/9J8+PqJVt0KlHLxL73dAw2 X4ExdnFgdKIy+YPTNUYSQ4FgTgEmR/qD+y3YKLA6e3EIOLXt/GTArPJS7rsdJgzeQECZ 75mj4x0Ag/mCvFEl9HGL/hiDWX5lJw/K5bCObRwBy+zGlmf35j3o7gA7RbOqfnQk3SuY QiuXXRL8hguNR85iWKZ74eIJu/Tg8DP/Ko4uOeutoaxj+ZN3JdeQ38OQzjU6vhFQ9DO2 8XpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b="G8sO/LbZ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t5-20020a50ab45000000b00450d429ec79si11330522edc.535.2022.09.24.11.45.03; Sat, 24 Sep 2022 11:45:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b="G8sO/LbZ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233939AbiIXSck (ORCPT + 99 others); Sat, 24 Sep 2022 14:32:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47240 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233588AbiIXScd (ORCPT ); Sat, 24 Sep 2022 14:32:33 -0400 Received: from out2.migadu.com (out2.migadu.com [188.165.223.204]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69F943A4BF for ; Sat, 24 Sep 2022 11:32:32 -0700 (PDT) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1664044350; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wCZqMmRS53sAUXuFaKIWMcHMmvAGs3N+TjAFGrnshio=; b=G8sO/LbZF5z3kI5Kifxt5ZbKg8A1tSsCYv+pkp8rEqdgvBhC9QeVYnLDdk41giAQgzuoZS 1pt3hKM0m7qNgN/2XBvAg2nX1YCrxL6lMvDMpOzsrpYe52MYyjb3cFmJ2Sm7Xy1Wk/a6v4 KfEkT8zqRq/iA15eJmveNb+JR8MFQeo= From: andrey.konovalov@linux.dev To: Marco Elver , Alexander Potapenko Cc: Andrey Konovalov , Dmitry Vyukov , Andrey Ryabinin , kasan-dev@googlegroups.com, Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov Subject: [PATCH mm 3/3] kasan: migrate workqueue_uaf test to kunit Date: Sat, 24 Sep 2022 20:31:53 +0200 Message-Id: <2815073f2be37e554f7f0fd7b1d10e9742be6ce3.1664044241.git.andreyknvl@google.com> In-Reply-To: <653d43e9a6d9aad2ae148a941dab048cb8e765a8.1664044241.git.andreyknvl@google.com> References: <653d43e9a6d9aad2ae148a941dab048cb8e765a8.1664044241.git.andreyknvl@google.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: linux.dev X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andrey Konovalov Migrate the workqueue_uaf test to the KUnit framework. Initially, this test was intended to check that Generic KASAN prints auxiliary stack traces for workqueues. Nevertheless, the test is enabled for all modes to make that KASAN reports bad accesses in the tested scenario. The presence of auxiliary stack traces for the Generic mode needs to be inspected manually. Signed-off-by: Andrey Konovalov --- mm/kasan/kasan_test.c | 40 +++++++++++++++++++++++++++++------- mm/kasan/kasan_test_module.c | 30 --------------------------- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/mm/kasan/kasan_test.c b/mm/kasan/kasan_test.c index 005776325e20..71cb402c404f 100644 --- a/mm/kasan/kasan_test.c +++ b/mm/kasan/kasan_test.c @@ -1134,6 +1134,14 @@ static void kmalloc_double_kzfree(struct kunit *test) KUNIT_EXPECT_KASAN_FAIL(test, kfree_sensitive(ptr)); } +/* + * The two tests below check that Generic KASAN prints auxiliary stack traces + * for RCU callbacks and workqueues. The reports need to be inspected manually. + * + * These tests are still enabled for other KASAN modes to make sure that all + * modes report bad accesses in tested scenarios. + */ + static struct kasan_rcu_info { int i; struct rcu_head rcu; @@ -1148,13 +1156,6 @@ static void rcu_uaf_reclaim(struct rcu_head *rp) ((volatile struct kasan_rcu_info *)fp)->i; } -/* - * Check that Generic KASAN prints auxiliary stack traces for RCU callbacks. - * The report needs to be inspected manually. - * - * This test is still enabled for other KASAN modes to make sure that all modes - * report bad accesses in tested scenarios. - */ static void rcu_uaf(struct kunit *test) { struct kasan_rcu_info *ptr; @@ -1170,6 +1171,30 @@ static void rcu_uaf(struct kunit *test) rcu_barrier()); } +static void workqueue_uaf_work(struct work_struct *work) +{ + kfree(work); +} + +static void workqueue_uaf(struct kunit *test) +{ + struct workqueue_struct *workqueue; + struct work_struct *work; + + workqueue = create_workqueue("kasan_workqueue_test"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, workqueue); + + work = kmalloc(sizeof(struct work_struct), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, work); + + INIT_WORK(work, workqueue_uaf_work); + queue_work(workqueue, work); + destroy_workqueue(workqueue); + + KUNIT_EXPECT_KASAN_FAIL(test, + ((volatile struct work_struct *)work)->data); +} + static void vmalloc_helpers_tags(struct kunit *test) { void *ptr; @@ -1502,6 +1527,7 @@ static struct kunit_case kasan_kunit_test_cases[] = { KUNIT_CASE(kasan_bitops_tags), KUNIT_CASE(kmalloc_double_kzfree), KUNIT_CASE(rcu_uaf), + KUNIT_CASE(workqueue_uaf), KUNIT_CASE(vmalloc_helpers_tags), KUNIT_CASE(vmalloc_oob), KUNIT_CASE(vmap_tags), diff --git a/mm/kasan/kasan_test_module.c b/mm/kasan/kasan_test_module.c index 4688cbcd722d..7be7bed456ef 100644 --- a/mm/kasan/kasan_test_module.c +++ b/mm/kasan/kasan_test_module.c @@ -62,35 +62,6 @@ static noinline void __init copy_user_test(void) kfree(kmem); } -static noinline void __init kasan_workqueue_work(struct work_struct *work) -{ - kfree(work); -} - -static noinline void __init kasan_workqueue_uaf(void) -{ - struct workqueue_struct *workqueue; - struct work_struct *work; - - workqueue = create_workqueue("kasan_wq_test"); - if (!workqueue) { - pr_err("Allocation failed\n"); - return; - } - work = kmalloc(sizeof(struct work_struct), GFP_KERNEL); - if (!work) { - pr_err("Allocation failed\n"); - return; - } - - INIT_WORK(work, kasan_workqueue_work); - queue_work(workqueue, work); - destroy_workqueue(workqueue); - - pr_info("use-after-free on workqueue\n"); - ((volatile struct work_struct *)work)->data; -} - static int __init test_kasan_module_init(void) { /* @@ -101,7 +72,6 @@ static int __init test_kasan_module_init(void) bool multishot = kasan_save_enable_multi_shot(); copy_user_test(); - kasan_workqueue_uaf(); kasan_restore_multi_shot(multishot); return -EAGAIN; -- 2.25.1