kernel BUG at assoc_array.c:LINE! while adding key to keyring

From: Guozihua (Scott)
Date: Thu Nov 11 2021 - 21:07:55 EST


Hi all,

A BUG_ON error was reported during our FUZZ test recently which happens while trying to insert new key into keyring.

The call stack goes like this:

kernel BUG at assoc_array.c:644!
Internal error: Oops - BUG: 0 [#1] SMP
Process syz-executor.24 (pid: 27933, stack limit = 0x000000004a6537a3)
CPU: 3 PID: 27933 Comm: syz-executor.24 Not tainted 4.19.95 #2
Hardware name: linux,dummy-virt (DT)
pstate: 20400005 (nzCv daif +PAN -UAO)
pc : assoc_array_insert_into_terminal_node+0x924/0x10c8 root/polaris/workspace/kernel/kernel/lib/assoc_array.c:644
lr : assoc_array_insert_into_terminal_node+0x924/0x10c8 root/polaris/workspace/kernel/kernel/lib/assoc_array.c:644
sp : fffff02972e379b0
x29: fffff02972e379b0 x28: 0000000000000011
x27: fffff029659af600 x26: fffff0297812e000
x25: fffff0298c215540 x24: 0000000000000010
x23: fffff0298c215400 x22: 00000000ffffffff
x21: fffff0298c215541 x20: 0000000000000001
x19: 000000000000000f x18: 0000000000000000
x17: 0000000000000000 x16: 0000000000000000
x15: 0000000000000000 x14: 0000000000000000
x13: 0000000000000000 x12: 0000000000000000
x11: 1ffffe052e5c6f1e x10: ffff1e052e5c6f1e
x9 : dfff200000000000 x8 : 0000000000000004
x7 : 0000000000000003 x6 : fffff02972e378f4
x5 : ffff1e052e5c6f1e x4 : 1ffffe0531842aa8
x3 : ffff200084a00000 x2 : ffff200033b46000
x1 : ffffffff83600000 x0 : 000000000000357d
Call trace:
assoc_array_insert_into_terminal_node+0x924/0x10c8 root/polaris/workspace/kernel/kernel/lib/assoc_array.c:644
assoc_array_insert+0x1e8/0x300 root/polaris/workspace/kernel/kernel/lib/assoc_array.c:1005
__key_link_begin+0xc4/0x1e0 root/polaris/workspace/kernel/kernel/security/keys/keyring.c:1227
construct_alloc_key root/polaris/workspace/kernel/kernel/security/keys/request_key.c:375 [inline]
construct_key_and_link root/polaris/workspace/kernel/kernel/security/keys/request_key.c:466 [inline]
request_key_and_link+0x358/0x800 root/polaris/workspace/kernel/kernel/security/keys/request_key.c:580
__do_sys_request_key root/polaris/workspace/kernel/kernel/security/keys/keyctl.c:211 [inline]
__se_sys_request_key root/polaris/workspace/kernel/kernel/security/keys/keyctl.c:156 [inline]
__arm64_sys_request_key+0x174/0x2c0 root/polaris/workspace/kernel/kernel/security/keys/keyctl.c:156
__invoke_syscall root/polaris/workspace/kernel/kernel/arch/arm64/kernel/syscall.c:36 [inline]
invoke_syscall root/polaris/workspace/kernel/kernel/arch/arm64/kernel/syscall.c:48 [inline]
el0_svc_common+0xdc/0x3a0 root/polaris/workspace/kernel/kernel/arch/arm64/kernel/syscall.c:121
el0_svc_handler+0x50/0xb0 root/polaris/workspace/kernel/kernel/arch/arm64/kernel/syscall.c:193
el0_svc+0x14/0x244 root/polaris/workspace/kernel/kernel/arch/arm64/kernel/entry.S:1028
Code: 97e908f1 f9002efb 17fffe0d 97e038d6 (d4210000)
Modules linked in:
---[ end trace 6a3a83359c05a38f ]---

I've dug a little bit into the issue. The issue happened during the split node process when it trys to find two leafs to be put into the new node. If it fails, it gives this BUG_ON error.

I was suspecting a race condition. However when I check the __key_link_begin and key_unlink function there seems to be suffice locking. And the assoc_array seems to be robust.

It seems that this happened once before (https://syzkaller.appspot.com/bug?id=ae9f975f9395c1519048e29bfeb4cd162982eb6d).

Any thoughts? Thanks!

Best Regards,
Zihua Guo