]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: add check for invalid name in btf_name_valid_section()
authorJeongjun Park <aha310510@gmail.com>
Sat, 31 Aug 2024 05:47:02 +0000 (14:47 +0900)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 4 Sep 2024 18:56:34 +0000 (11:56 -0700)
If the length of the name string is 1 and the value of name[0] is NULL
byte, an OOB vulnerability occurs in btf_name_valid_section() and the
return value is true, so the invalid name passes the check.

To solve this, you need to check if the first position is NULL byte and
if the first character is printable.

Suggested-by: Eduard Zingerman <eddyz87@gmail.com>
Fixes: bd70a8fb7ca4 ("bpf: Allow all printable characters in BTF DATASEC names")
Signed-off-by: Jeongjun Park <aha310510@gmail.com>
Link: https://lore.kernel.org/r/20240831054702.364455-1-aha310510@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
kernel/bpf/btf.c

index e3377dd61f7ecdba922883c294217e6dd1ef3017..a4e4f8d43ecf04124c593fe52bd81a4aab44e943 100644 (file)
@@ -823,9 +823,11 @@ static bool btf_name_valid_section(const struct btf *btf, u32 offset)
        const char *src = btf_str_by_offset(btf, offset);
        const char *src_limit;
 
+       if (!*src)
+               return false;
+
        /* set a limit on identifier length */
        src_limit = src + KSYM_NAME_LEN;
-       src++;
        while (*src && src < src_limit) {
                if (!isprint(*src))
                        return false;