forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fortify: Add compile-time FORTIFY_SOURCE tests
While the run-time testing of FORTIFY_SOURCE is already present in LKDTM, there is no testing of the expected compile-time detections. In preparation for correctly supporting FORTIFY_SOURCE under Clang, adding additional FORTIFY_SOURCE defenses, and making sure FORTIFY_SOURCE doesn't silently regress with GCC, introduce a build-time test suite that checks each expected compile-time failure condition. As this is relatively backwards from standard build rules in the sense that a successful test is actually a compile _failure_, create a wrapper script to check for the correct errors, and wire it up as a dummy dependency to lib/string.o, collecting the results into a log file artifact. Signed-off-by: Kees Cook <[email protected]>
- Loading branch information
Showing
22 changed files
with
226 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7323,6 +7323,15 @@ L: [email protected] | |
S: Maintained | ||
F: drivers/net/ethernet/nvidia/* | ||
|
||
FORTIFY_SOURCE | ||
M: Kees Cook <[email protected]> | ||
L: [email protected] | ||
S: Supported | ||
F: include/linux/fortify-string.h | ||
F: lib/test_fortify/* | ||
F: scripts/test_fortify.sh | ||
K: \b__NO_FORTIFY\b | ||
|
||
FPGA DFL DRIVERS | ||
M: Wu Hao <[email protected]> | ||
R: Tom Rix <[email protected]> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,3 +4,5 @@ | |
/gen_crc32table | ||
/gen_crc64table | ||
/oid_registry_data.c | ||
/test_fortify.log | ||
/test_fortify/*.log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memchr(small, 0x7A, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memchr_inv(small, 0x7A, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memcmp(small, large, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memscan(small, 0x7A, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memcmp(large, small, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memcpy(large, instance.buf, sizeof(large)) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memmove(large, instance.buf, sizeof(large)) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
#include <linux/kernel.h> | ||
#include <linux/printk.h> | ||
#include <linux/slab.h> | ||
#include <linux/string.h> | ||
|
||
void do_fortify_tests(void); | ||
|
||
#define __BUF_SMALL 16 | ||
#define __BUF_LARGE 32 | ||
struct fortify_object { | ||
int a; | ||
char buf[__BUF_SMALL]; | ||
int c; | ||
}; | ||
|
||
#define LITERAL_SMALL "AAAAAAAAAAAAAAA" | ||
#define LITERAL_LARGE "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" | ||
const char small_src[__BUF_SMALL] = LITERAL_SMALL; | ||
const char large_src[__BUF_LARGE] = LITERAL_LARGE; | ||
|
||
char small[__BUF_SMALL]; | ||
char large[__BUF_LARGE]; | ||
struct fortify_object instance; | ||
size_t size; | ||
|
||
void do_fortify_tests(void) | ||
{ | ||
/* Normal initializations. */ | ||
memset(&instance, 0x32, sizeof(instance)); | ||
memset(small, 0xA5, sizeof(small)); | ||
memset(large, 0x5A, sizeof(large)); | ||
|
||
TEST; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memcpy(instance.buf, large_src, sizeof(large_src)) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memmove(instance.buf, large_src, sizeof(large_src)) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
memset(instance.buf, 0x5A, sizeof(large_src)) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strcpy(small, LITERAL_LARGE) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strcpy(small, large_src) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strlcpy(small, large_src, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strlcpy(instance.buf, large_src, sizeof(instance.buf) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strncpy(small, large_src, sizeof(small) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strncpy(instance.buf, large_src, sizeof(instance.buf) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
#define TEST \ | ||
strscpy(instance.buf, large_src, sizeof(instance.buf) + 1) | ||
|
||
#include "test_fortify.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
set -e | ||
|
||
# Argument 1: Source file to build. | ||
IN="$1" | ||
shift | ||
# Extract just the filename for error messages below. | ||
FILE="${IN##*/}" | ||
# Extract the function name for error messages below. | ||
FUNC="${FILE#*-}" | ||
FUNC="${FUNC%%-*}" | ||
FUNC="${FUNC%%.*}" | ||
# Extract the symbol to test for in build/symbol test below. | ||
WANT="__${FILE%%-*}" | ||
|
||
# Argument 2: Where to write the build log. | ||
OUT="$1" | ||
shift | ||
TMP="${OUT}.tmp" | ||
|
||
# Argument 3: Path to "nm" tool. | ||
NM="$1" | ||
shift | ||
|
||
# Remaining arguments are: $(CC) $(c_flags) | ||
|
||
# Clean up temporary file at exit. | ||
__cleanup() { | ||
rm -f "$TMP" | ||
} | ||
trap __cleanup EXIT | ||
|
||
# Function names in warnings are wrapped in backticks under UTF-8 locales. | ||
# Run the commands with LANG=C so that grep output will not change. | ||
export LANG=C | ||
|
||
status= | ||
# Attempt to build a source that is expected to fail with a specific warning. | ||
if "$@" -Werror -c "$IN" -o "$OUT".o 2> "$TMP" ; then | ||
# If the build succeeds, either the test has failed or the | ||
# warning may only happen at link time (Clang). In that case, | ||
# make sure the expected symbol is unresolved in the symbol list. | ||
# If so, FORTIFY is working for this case. | ||
if ! $NM -A "$OUT".o | grep -m1 "\bU ${WANT}$" >>"$TMP" ; then | ||
status="warning: unsafe ${FUNC}() usage lacked '$WANT' symbol in $IN" | ||
fi | ||
else | ||
# If the build failed, check for the warning in the stderr (gcc). | ||
if ! grep -q -m1 "error: call to .\b${WANT}\b." "$TMP" ; then | ||
status="warning: unsafe ${FUNC}() usage lacked '$WANT' warning in $IN" | ||
fi | ||
fi | ||
|
||
if [ -n "$status" ]; then | ||
# Report on failure results, including compilation warnings. | ||
echo "$status" | tee "$OUT" >&2 | ||
else | ||
# Report on good results, and save any compilation output to log. | ||
echo "ok: unsafe ${FUNC}() usage correctly detected with '$WANT' in $IN" >"$OUT" | ||
fi | ||
cat "$TMP" >>"$OUT" |