[SRU B/D][PATCH 0/1] cifs set_oplock buffer overflow in strcat

Guilherme G. Piccoli gpiccoli at canonical.com
Wed Jul 17 20:13:08 UTC 2019


BugLink: https://bugs.launchpad.net/bugs/1824981

[Impact]

* We got reports of a kernel crash in cifs module with the following signature:

detected buffer overflow in strcat
kernel BUG at <...>/lib/string.c:1052!
invalid opcode: 0000 [#1] SMP PTI
RIP: 0010:fortify_panic+0x13/0x1f
Call Trace:
 smb21_set_oplock_level+0xde/0x190 [cifs]
 smb3_set_oplock_level+0x22/0x90 [cifs]
 smb2_set_fid+0x76/0xb0 [cifs]
 cifs_new_fileinfo+0x268/0x3c0 [cifs]
 ? smb2_get_lease_key+0x40/0x40 [cifs]
 ? cifs_new_fileinfo+0x268/0x3c0 [cifs]
 cifs_open+0x57c/0x8d0 [cifs]
 do_dentry_open+0x1fe/0x320
[...]

* By analyzing the code of smb21_set_oplock_level(), we've noticed the only way
fortify function strcat() would get overflow was if the value of cinode->oplock
got corrupted in a another thread leading to a buffer write bigger then buffer
size. In this function, the 'message' buffer writes are governed by cinode->oplock,
so only a different thread cleaning the oplock value would lead to 'message' overflow.

* By the same time we worked this analysis, a fix was proposed upstream for this
issue in the form of commit 6a54b2e002c9 ("cifs: fix strcat buffer overflow and
reduce raciness in smb21_set_oplock_level()"). The fix is simple and directly
addresses this problem, so we hereby request its SRU into Bionic kernel - it's
already present in linux stable branches.

[Test case]

* Unfortunately we cannot reproduce the issue. The patch proposed here was
validated by us with xfstests (instructions followed from
https://wiki.samba.org/index.php/Xfstesting-cifs) and fio.

* Using xfstest with the exclusions proposed in the link above we managed to get
the same results as a non-patched kernel, i.e., the same tests failed in both
kernels, we didn't get worse results with the patch. Fio also didn't show
noticeable performance regression with the patch.

[Regression potential]

* The patch was validated by the cifs filesystem maintainers and by the
aforementioned tests; also, the scope is restricted to cifs only so the likelihood
of regressions is considered low. The commit introduces no functional changes
and the only affected path was just refactored in a way to prevent overflow
and reduce race potential.


Christoph Probst (1):
  cifs: fix strcat buffer overflow and reduce raciness in
    smb21_set_oplock_level()

 fs/cifs/smb2ops.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

-- 
2.22.0




More information about the kernel-team mailing list