From nobody Sun Feb 8 04:34:00 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB07712AAEF for ; Wed, 8 May 2024 17:31:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715189515; cv=none; b=FxWvfsb7HA/3+1W8S8WQYdBt9iC/INhs9tk7DDSVQ8lazEBu8eOsBcvmAngyNvzp8H/Hm489bRsACuyQ/tZ+ozN10QN4/UeCCOwGH2R+nmHD51/FVTmJe80Oha9yNvPpi58CMAV6KJfEkwPx2flXUobMpM4O682Q0/DA0oLg25k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715189515; c=relaxed/simple; bh=EVV19YgGbcPQsIHd5yk4GzGYcoILxXyLnNlnQWFy9pw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=C4/wEP3Qtf+0WVQWaoxM4di5FXaryvE0LMs7O/YSeuIz2y9mhs16mkCHIV8Z31bm0AupYmAi7hmWmqfK97Ved3DA9q/OcuZvIIdTqwiikR0CEgFI+rZVAvw7qRbGrb6bNh5haZGcCq0rru2dLOQpsGJyXQ4VdX3lfJJnZwjujxE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=TT823LaE; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="TT823LaE" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-1ee38966529so8246305ad.1 for ; Wed, 08 May 2024 10:31:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1715189511; x=1715794311; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ckhcb2/0RYF0Gnhe/jQlCjJECN0VZ08/Fvs6ZKfOACc=; b=TT823LaE2Z4LKXmY/o6l28b988iFT0/bsSW5L6lXPIOXs/YULCFcGE3WfOd071tshz kwNyO5Ka+V6+hZiZiUCej4/w3UtP2G4qpnQwPuMSgdQ89kc3bIbDsWPj83n13VDzCet5 bE2oTZmpkBrcIvXz3Bj4KvQ2xdfJfbDgp8B28= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715189511; x=1715794311; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ckhcb2/0RYF0Gnhe/jQlCjJECN0VZ08/Fvs6ZKfOACc=; b=iW5dXJzGewF2fleFpMHKCm8lgN2OUNLxfXYs0GJVQfNjpQEtm7XHiFInPFeAkAI2bB IErRmKEY5UFBTyQ5av+dhB16dTu3VvPGHRw3DhBY//ShK8O8iuqEvuOAi45oRC9UJHHc JdPARAvDF75GRwNj87a+tfwuFj9Tf7+IjKyBQ4/PMmbwk3qCzYfGVhYGwfP9tY+ueGFi e8o6vEdSHzHyyun+u2vwbQuAHO/kRJnWkU4wsht0BGW0Q+NkC2BB7dlZJDEvrDtlp4wt PYSXw2Y1gA8zgUZ3C12KVT3aK2ithOJ7WhxHWk89xSnEsMXn8mMZzAybxp2b062dZg5d BdSw== X-Forwarded-Encrypted: i=1; AJvYcCV4WHqitK/aBn9lxcOLNeFeYpj5cunEJkRjqP7DYn5MvHpfGX/y8fnm1iXGYs4t70xhsCUlcdu/mOq4E6Ws0HjpoJIPRkrQjTY3auvl X-Gm-Message-State: AOJu0YwyVv1L3R/vj1/2rP1IyIroAOfGHdcthDwt/467wYgN4O+koZvf EysqqXGcM/F+HmLzpZoURg1cb/B5+JkMxgI87tmi1vgVPWUUpWasg37Z2j8Jng== X-Google-Smtp-Source: AGHT+IFe9RE0PlweeOYjLwef5REO+i00c2oo7HJiryhYfaXZtd4BvtB2nxrgXXbdGr6zE8h3r5g01g== X-Received: by 2002:a17:902:dacc:b0:1eb:8299:db35 with SMTP id d9443c01a7336-1eefa58cfe5mr4314535ad.32.1715189510956; Wed, 08 May 2024 10:31:50 -0700 (PDT) Received: from www.outflux.net ([198.0.35.241]) by smtp.gmail.com with ESMTPSA id b3-20020a170902d30300b001e2a479954dsm12129520plc.181.2024.05.08.10.31.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 10:31:50 -0700 (PDT) From: Kees Cook To: "H . J . Lu" Cc: Kees Cook , Chris Kennelly , Eric Biederman , Shuah Khan , Muhammad Usama Anjum , John Hubbard , Fangrui Song , Andrew Morton , Yang Yingliang , linux-mm@kvack.org, linux-kselftest@vger.kernel.org, Mike Rapoport , Rui Salvaterra , Victor Stinner , Jan Palus , Al Viro , Christian Brauner , Jan Kara , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-hardening@vger.kernel.org Subject: [PATCH 1/3] selftests/exec: Build both static and non-static load_address tests Date: Wed, 8 May 2024 10:31:46 -0700 Message-Id: <20240508173149.677910-1-keescook@chromium.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508172848.work.131-kees@kernel.org> References: <20240508172848.work.131-kees@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=6882; i=keescook@chromium.org; h=from:subject; bh=EVV19YgGbcPQsIHd5yk4GzGYcoILxXyLnNlnQWFy9pw=; b=owEBbQKS/ZANAwAKAYly9N/cbcAmAcsmYgBmO7cE7X4mhGALtYnO3LLjThfOhTf4zqWRzUonM YIEVDy8ECGJAjMEAAEKAB0WIQSlw/aPIp3WD3I+bhOJcvTf3G3AJgUCZju3BAAKCRCJcvTf3G3A JqzhEACugoYdfeBq9hllOhN230YzjegmLLmyhu7D4ZUW4opBdmlFfiuiuoZexZQUxlhuR0aHobi Xktw+k9RzRwGjeUQm6DqEFJ5/ypq1MYaS2e7qfeSwkLfsLSeRGnn2N3Ag6eXL/e/cXhkcQTPo9b Vfd0+o5ctjpzD9SDvJKtjz8hG69soCmtgK6rJyovDQslCzC7aDH33Fvri9GB9lyD1Miafv0AZEA 9H8+/ycD1h+4dKxrn5h5DP7ZMGEhcGDSz8BTtvTibEaIEJNsIVsPkfb0FySoNeRpgIlKOcynYKm W5rADoIiq2Js477XNNWD8awi1czVmZBgBP7vXuSdmgQki7LmPUyd3uBH+xc4wZJX7YqTzuU2p6f 0kCwpXgkwxz5lVtdItPdl4q7RHdCBAungFLFpCqNvhxfnOjp4EeOQcPZWWrBJ4VRM6JnLz6AyBi oaadMihDqXQ3DpElP4hIeED20RpP6RnOoxv9NQPTDNLVryc+aqXTTJyaNVDhjFGTZ3lDDrt2YQJ BJuugxHoIMXKzmxjqagdcHEkkEQc3QT+0a7jsiUyJoFqb18rRzPbTRz3p5f5pMt+fBN/tbQxnfY gKd6t/Mj+QNdLzLoBnE1r39sCfnDiklNPn3+eQskJ8fUaFsewNAWbhyjVVux6wK3OnQrrcooaNB Agj16aAcMuOgCnA== X-Developer-Key: i=keescook@chromium.org; a=openpgp; fpr=A5C3F68F229DD60F723E6E138972F4DFDC6DC026 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" After commit 4d1cd3b2c5c1 ("tools/testing/selftests/exec: fix link error"), the load address alignment tests tried to build statically. This was silently ignored in some cases. However, after attempting to further fix the build by switching to "-static-pie", the test started failing. This appears to be due to non-PT_INTERP ET_DYN execs ("static PIE") not doing alignment correctly, which remains unfixed[1]. See commit aeb7923733d1 ("revert "fs/binfmt_elf: use PT_LOAD p_align values for static PIE"") for more details. Provide rules to build both static and non-static PIE binaries, improve debug reporting, and perform several test steps instead of a single all-or-nothing test. However, do not actually enable static-pie tests; alignment specification is only supported for ET_DYN with PT_INTERP ("regular PIE"). Link: https://bugzilla.kernel.org/show_bug.cgi?id=3D215275 [1] Signed-off-by: Kees Cook --- Cc: Chris Kennelly Cc: Eric Biederman Cc: Shuah Khan Cc: Muhammad Usama Anjum Cc: John Hubbard Cc: Fangrui Song Cc: Andrew Morton Cc: Yang Yingliang Cc: linux-mm@kvack.org Cc: linux-kselftest@vger.kernel.org --- tools/testing/selftests/exec/Makefile | 19 +++--- tools/testing/selftests/exec/load_address.c | 67 +++++++++++++++++---- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/exec/Makefile b/tools/testing/selftest= s/exec/Makefile index fb4472ddffd8..619cff81d796 100644 --- a/tools/testing/selftests/exec/Makefile +++ b/tools/testing/selftests/exec/Makefile @@ -3,8 +3,13 @@ CFLAGS =3D -Wall CFLAGS +=3D -Wno-nonnull CFLAGS +=3D -D_GNU_SOURCE =20 +ALIGNS :=3D 0x1000 0x200000 0x1000000 +ALIGN_PIES :=3D $(patsubst %,load_address.%,$(ALIGNS)) +ALIGN_STATIC_PIES :=3D $(patsubst %,load_address.static.%,$(ALIGNS)) +ALIGNMENT_TESTS :=3D $(ALIGN_PIES) + TEST_PROGS :=3D binfmt_script.py -TEST_GEN_PROGS :=3D execveat load_address_4096 load_address_2097152 load_a= ddress_16777216 non-regular +TEST_GEN_PROGS :=3D execveat non-regular $(ALIGNMENT_TESTS) TEST_GEN_FILES :=3D execveat.symlink execveat.denatured script subdir # Makefile is a run-time dependency, since it's accessed by the execveat t= est TEST_FILES :=3D Makefile @@ -28,9 +33,9 @@ $(OUTPUT)/execveat.symlink: $(OUTPUT)/execveat $(OUTPUT)/execveat.denatured: $(OUTPUT)/execveat cp $< $@ chmod -x $@ -$(OUTPUT)/load_address_4096: load_address.c - $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=3D0x1000 -pie -static $< = -o $@ -$(OUTPUT)/load_address_2097152: load_address.c - $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=3D0x200000 -pie -static $= < -o $@ -$(OUTPUT)/load_address_16777216: load_address.c - $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=3D0x1000000 -pie -static = $< -o $@ +$(OUTPUT)/load_address.0x%: load_address.c + $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=3D$(lastword $(subst ., ,= $@)) \ + -fPIE -pie $< -o $@ +$(OUTPUT)/load_address.static.0x%: load_address.c + $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=3D$(lastword $(subst ., ,= $@)) \ + -fPIE -static-pie $< -o $@ diff --git a/tools/testing/selftests/exec/load_address.c b/tools/testing/se= lftests/exec/load_address.c index 17e3207d34ae..8257fddba8c8 100644 --- a/tools/testing/selftests/exec/load_address.c +++ b/tools/testing/selftests/exec/load_address.c @@ -5,11 +5,13 @@ #include #include #include +#include #include "../kselftest.h" =20 struct Statistics { unsigned long long load_address; unsigned long long alignment; + bool interp; }; =20 int ExtractStatistics(struct dl_phdr_info *info, size_t size, void *data) @@ -26,11 +28,20 @@ int ExtractStatistics(struct dl_phdr_info *info, size_t= size, void *data) stats->alignment =3D 0; =20 for (i =3D 0; i < info->dlpi_phnum; i++) { + unsigned long long align; + + if (info->dlpi_phdr[i].p_type =3D=3D PT_INTERP) { + stats->interp =3D true; + continue; + } + if (info->dlpi_phdr[i].p_type !=3D PT_LOAD) continue; =20 - if (info->dlpi_phdr[i].p_align > stats->alignment) - stats->alignment =3D info->dlpi_phdr[i].p_align; + align =3D info->dlpi_phdr[i].p_align; + + if (align > stats->alignment) + stats->alignment =3D align; } =20 return 1; // Terminate dl_iterate_phdr. @@ -38,27 +49,57 @@ int ExtractStatistics(struct dl_phdr_info *info, size_t= size, void *data) =20 int main(int argc, char **argv) { - struct Statistics extracted; - unsigned long long misalign; + struct Statistics extracted =3D { }; + unsigned long long misalign, pow2; + bool interp_needed; + char buf[1024]; + FILE *maps; int ret; =20 ksft_print_header(); - ksft_set_plan(1); + ksft_set_plan(4); + + /* Dump maps file for debugging reference. */ + maps =3D fopen("/proc/self/maps", "r"); + if (!maps) + ksft_exit_fail_msg("FAILED: /proc/self/maps: %s\n", strerror(errno)); + while (fgets(buf, sizeof(buf), maps)) { + ksft_print_msg("%s", buf); + } + fclose(maps); =20 + /* Walk the program headers. */ ret =3D dl_iterate_phdr(ExtractStatistics, &extracted); if (ret !=3D 1) ksft_exit_fail_msg("FAILED: dl_iterate_phdr\n"); =20 - if (extracted.alignment =3D=3D 0) - ksft_exit_fail_msg("FAILED: No alignment found\n"); - else if (extracted.alignment & (extracted.alignment - 1)) - ksft_exit_fail_msg("FAILED: Alignment is not a power of 2\n"); + /* Report our findings. */ + ksft_print_msg("load_address=3D%#llx alignment=3D%#llx\n", + extracted.load_address, extracted.alignment); + + /* If we're named with ".static." we expect no INTERP. */ + interp_needed =3D strstr(argv[0], ".static.") =3D=3D NULL; + + /* Were we built as expected? */ + ksft_test_result(interp_needed =3D=3D extracted.interp, + "%s INTERP program header %s\n", + interp_needed ? "Wanted" : "Unwanted", + extracted.interp ? "seen" : "missing"); + + /* Did we find an alignment? */ + ksft_test_result(extracted.alignment !=3D 0, + "Alignment%s found\n", extracted.alignment ? "" : " NOT"); + + /* Is the alignment sane? */ + pow2 =3D extracted.alignment & (extracted.alignment - 1); + ksft_test_result(pow2 =3D=3D 0, + "Alignment is%s a power of 2: %#llx\n", + pow2 =3D=3D 0 ? "" : " NOT", extracted.alignment); =20 + /* Is the load address aligned? */ misalign =3D extracted.load_address & (extracted.alignment - 1); - if (misalign) - ksft_exit_fail_msg("FAILED: alignment =3D %llu, load_address =3D %llu\n", - extracted.alignment, extracted.load_address); + ksft_test_result(misalign =3D=3D 0, "Load Address is %saligned (%#llx)\n", + misalign ? "MIS" : "", misalign); =20 - ksft_test_result_pass("Completed\n"); ksft_finished(); } --=20 2.34.1