projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
c1ca8ef
)
fs/ntfs3: Validate attribute name offset
author
Edward Lo
<edward.lo@ambergroup.io>
Fri, 9 Sep 2022 01:04:00 +0000
(09:04 +0800)
committer
Konstantin Komarov
<almaz.alexandrovich@paragon-software.com>
Fri, 30 Sep 2022 14:39:53 +0000
(17:39 +0300)
Although the attribute name length is checked before comparing it to
some common names (e.g., $I30), the offset isn't. This adds a sanity
check for the attribute name offset, guarantee the validity and prevent
possible out-of-bound memory accesses.
[ 191.720056] BUG: unable to handle page fault for address:
ffffebde00000008
[ 191.721060] #PF: supervisor read access in kernel mode
[ 191.721586] #PF: error_code(0x0000) - not-present page
[ 191.722079] PGD 0 P4D 0
[ 191.722571] Oops: 0000 [#1] PREEMPT SMP KASAN NOPTI
[ 191.723179] CPU: 0 PID: 244 Comm: mount Not tainted 6.0.0-rc4 #28
[ 191.723749] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
rel-1.14.0-0-g155821a1990b
-prebuilt.qemu.org 04/01/2014
[ 191.724832] RIP: 0010:kfree+0x56/0x3b0
[ 191.725870] Code: 80 48 01 d8 0f 82 65 03 00 00 48 c7 c2 00 00 00 80 48 2b 15 2c 06 dd 01 48 01 d0 48 c1 e8 0c 48 c1 e0 06 48 03 05 0a 069
[ 191.727375] RSP: 0018:
ffff8880076f7878
EFLAGS:
00000286
[ 191.727897] RAX:
ffffebde00000000
RBX:
0000000000000040
RCX:
ffffffff8528d5b9
[ 191.728531] RDX:
0000777f80000000
RSI:
ffffffff8522d49c
RDI:
0000000000000040
[ 191.729183] RBP:
ffff8880076f78a0
R08:
0000000000000000
R09:
0000000000000000
[ 191.729628] R10:
ffff888008949fd8
R11:
ffffed10011293fd
R12:
0000000000000040
[ 191.730158] R13:
ffff888008949f98
R14:
ffff888008949ec0
R15:
ffff888008949fb0
[ 191.730645] FS:
00007f3520cd7e40
(0000) GS:
ffff88805ba00000
(0000) knlGS:
0000000000000000
[ 191.731328] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 191.731667] CR2:
ffffebde00000008
CR3:
0000000009704000
CR4:
00000000000006f0
[ 191.732568] Call Trace:
[ 191.733231] <TASK>
[ 191.733860] kvfree+0x2c/0x40
[ 191.734632] ni_clear+0x180/0x290
[ 191.735085] ntfs_evict_inode+0x45/0x70
[ 191.735495] evict+0x199/0x280
[ 191.735996] iput.part.0+0x286/0x320
[ 191.736438] iput+0x32/0x50
[ 191.736811] iget_failed+0x23/0x30
[ 191.737270] ntfs_iget5+0x337/0x1890
[ 191.737629] ? ntfs_clear_mft_tail+0x20/0x260
[ 191.738201] ? ntfs_get_block_bmap+0x70/0x70
[ 191.738482] ? ntfs_objid_init+0xf6/0x140
[ 191.738779] ? ntfs_reparse_init+0x140/0x140
[ 191.739266] ntfs_fill_super+0x121b/0x1b50
[ 191.739623] ? put_ntfs+0x1d0/0x1d0
[ 191.739984] ? asm_sysvec_apic_timer_interrupt+0x1b/0x20
[ 191.740466] ? put_ntfs+0x1d0/0x1d0
[ 191.740787] ? sb_set_blocksize+0x6a/0x80
[ 191.741272] get_tree_bdev+0x232/0x370
[ 191.741829] ? put_ntfs+0x1d0/0x1d0
[ 191.742669] ntfs_fs_get_tree+0x15/0x20
[ 191.743132] vfs_get_tree+0x4c/0x130
[ 191.743457] path_mount+0x654/0xfe0
[ 191.743938] ? putname+0x80/0xa0
[ 191.744271] ? finish_automount+0x2e0/0x2e0
[ 191.744582] ? putname+0x80/0xa0
[ 191.745053] ? kmem_cache_free+0x1c4/0x440
[ 191.745403] ? putname+0x80/0xa0
[ 191.745616] do_mount+0xd6/0xf0
[ 191.745887] ? path_mount+0xfe0/0xfe0
[ 191.746287] ? __kasan_check_write+0x14/0x20
[ 191.746582] __x64_sys_mount+0xca/0x110
[ 191.746850] do_syscall_64+0x3b/0x90
[ 191.747122] entry_SYSCALL_64_after_hwframe+0x63/0xcd
[ 191.747517] RIP: 0033:0x7f351fee948a
[ 191.748332] Code: 48 8b 0d 11 fa 2a 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 008
[ 191.749341] RSP: 002b:
00007ffd51cf3af8
EFLAGS:
00000202
ORIG_RAX:
00000000000000a5
[ 191.749960] RAX:
ffffffffffffffda
RBX:
000055b903733060
RCX:
00007f351fee948a
[ 191.750589] RDX:
000055b903733260
RSI:
000055b9037332e0
RDI:
000055b90373bce0
[ 191.751115] RBP:
0000000000000000
R08:
000055b903733280
R09:
0000000000000020
[ 191.751537] R10:
00000000c0ed0000
R11:
0000000000000202
R12:
000055b90373bce0
[ 191.751946] R13:
000055b903733260
R14:
0000000000000000
R15:
00000000ffffffff
[ 191.752519] </TASK>
[ 191.752782] Modules linked in:
[ 191.753785] CR2:
ffffebde00000008
[ 191.754937] ---[ end trace
0000000000000000
]---
[ 191.755429] RIP: 0010:kfree+0x56/0x3b0
[ 191.755725] Code: 80 48 01 d8 0f 82 65 03 00 00 48 c7 c2 00 00 00 80 48 2b 15 2c 06 dd 01 48 01 d0 48 c1 e8 0c 48 c1 e0 06 48 03 05 0a 069
[ 191.756744] RSP: 0018:
ffff8880076f7878
EFLAGS:
00000286
[ 191.757218] RAX:
ffffebde00000000
RBX:
0000000000000040
RCX:
ffffffff8528d5b9
[ 191.757580] RDX:
0000777f80000000
RSI:
ffffffff8522d49c
RDI:
0000000000000040
[ 191.758016] RBP:
ffff8880076f78a0
R08:
0000000000000000
R09:
0000000000000000
[ 191.758570] R10:
ffff888008949fd8
R11:
ffffed10011293fd
R12:
0000000000000040
[ 191.758957] R13:
ffff888008949f98
R14:
ffff888008949ec0
R15:
ffff888008949fb0
[ 191.759317] FS:
00007f3520cd7e40
(0000) GS:
ffff88805ba00000
(0000) knlGS:
0000000000000000
[ 191.759711] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 191.760118] CR2:
ffffebde00000008
CR3:
0000000009704000
CR4:
00000000000006f0
Signed-off-by: Edward Lo <edward.lo@ambergroup.io>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/inode.c
patch
|
blob
|
history
diff --git
a/fs/ntfs3/inode.c
b/fs/ntfs3/inode.c
index b1832b482c175bf295783ffeac376e0c61621a19..8b6fa7cd278486b92e34f4877cb440991a52f6db 100644
(file)
--- a/
fs/ntfs3/inode.c
+++ b/
fs/ntfs3/inode.c
@@
-129,6
+129,9
@@
next_attr:
rsize = attr->non_res ? 0 : le32_to_cpu(attr->res.data_size);
asize = le32_to_cpu(attr->size);
+ if (le16_to_cpu(attr->name_off) + attr->name_len > asize)
+ goto out;
+
switch (attr->type) {
case ATTR_STD:
if (attr->non_res ||