lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Mon, 15 Nov 2021 14:09:22 +0100 From: Rasmus Villemoes <linux@...musvillemoes.dk> To: Peter Zijlstra <peterz@...radead.org>, Sami Tolvanen <samitolvanen@...gle.com> Cc: Ard Biesheuvel <ardb@...nel.org>, Mark Rutland <mark.rutland@....com>, X86 ML <x86@...nel.org>, Kees Cook <keescook@...omium.org>, Josh Poimboeuf <jpoimboe@...hat.com>, Nathan Chancellor <nathan@...nel.org>, Nick Desaulniers <ndesaulniers@...gle.com>, Sedat Dilek <sedat.dilek@...il.com>, Steven Rostedt <rostedt@...dmis.org>, linux-hardening@...r.kernel.org, Linux Kernel Mailing List <linux-kernel@...r.kernel.org>, llvm@...ts.linux.dev, joao@...rdrivepizza.com Subject: Re: [PATCH] static_call,x86: Robustify trampoline patching On 30/10/2021 10.16, Peter Zijlstra wrote: > On Sat, Oct 30, 2021 at 09:47:58AM +0200, Peter Zijlstra wrote: > So fundamentally I think the whole notion that the address of a function > is something different than 'the address of that function' is an *utter* > fail. Agreed. IMHO, commits like 0a5b412891df, 981731129e0f should have been a big red flag saying "ok, perhaps we shall not mess with the semantics of function pointer comparisons". Yes yes, the commit log in cf68fffb66d6 did dutifully say "This may break code that relies on comparing addresses passed from other components.". But it did not spell out that that for example means that i2c bus recovery now doesn't result in recovering the bus but instead in a NULL pointer deref and kernel panic: Some i2c drivers set ->recover_bus = i2c_generic_scl_recovery and provide ->sda_gpiod, ->scl_gpiod, then rely on if (bri->scl_gpiod && bri->recover_bus == i2c_generic_scl_recovery) in i2c-core-base.c causing ->get_scl/->set_scl to be filled in. That's of course broken with ->recover_bus pointing to the module's jump table, so when ->recover_bus is actually called, the bri->set_scl() call in i2c_generic_scl_recovery() is a NULL pointer deref. [I've tested that this actually happens on an imx8mp_evk board.] And who knows how much other code happens to rely on function pointer comparison working as specified in the C standard for correctness. Rasmus
Powered by blists - more mailing lists