Re: [PATCH 0/3] Add memremap executable mapping and extend drivers/misc/sram.c
On 11/07/2016 11:43 AM, Tony Lindgren wrote: * Russell King - ARM Linux [161107 04:05]: On Thu, Oct 27, 2016 at 01:56:09PM -0500, Dave Gerlach wrote: There are several instances when one would want to execute out of on-chip SRAM, such as PM code on ARM platforms, so once again revisiting this series to allow that in a generic manner. Seems that having a solution for allowing SRAM to be mapped as executable will help clean up PM code on several ARM platforms that are using ARM internal __arm_ioremap_exec API and also open the door for PM support on new platforms like TI AM335x and AM437x. This was last sent as RFC here [1] and based on comments from Russell King and Arnd Bergmann has been rewritten to use memremap API rather than ioremap API, as executable iomem does not really make sense. This is better, as it avoids the issue that I pointed out last time around, but I'm still left wondering about the approach. Sure, having executable SRAM mappings sounds nice and easy, but we're creating WX mappings. Folk have spent a while improving the security of the kernel by ensuring that there are no WX mappings, and this series reintroduces them. The sad thing is that any WX mapping which appears at a known address can be exploited. "A known address" can be something that appears to be random, but ends up being the same across the same device type... or can be discovered by some means. Eg, consider if the WX mapping is dynamically allocated, but occurs at exactly the same point at boot - and if this happens with android phones, consider how many of those are out there. Or if the address of the WX mapping is available via some hardware register. Or... See Kees Cook's slides at last years kernel summit - https://outflux.net/slides/2015/ks/security.pdf So, I think avoiding WX mappings - mappings should be either W or X but not both simultaneously (see page 19.) I guess what I'm angling at is that we don't want memremap_exec(), but we need an API which changes the permissions of a SRAM mapping between allowing writes and allowing execution. That should work just fine. So first copy the code to SRAM, then set it read-only and exectuable. Note that we need to restore the state of SRAM every time when returning from off mode during idle on some SoCs. Thanks for all the comments. This seems like a reasonable concern. I do agree that we would need to be able to briefly restore write permission for things like Tony has described. In fact, I suppose we would need this ability for every copy so that we switch from exec to write and do the copy, then switch back to read-only executable. We have situations where we copy multiple things, from drivers that don't necessarily have knowledge of one another to the SRAM space at different times. Any opinions on where this API should live? Regards, Dave Regards, Tony
Re: [PATCH 0/3] Add memremap executable mapping and extend drivers/misc/sram.c
* Russell King - ARM Linux [161107 04:05]: > On Thu, Oct 27, 2016 at 01:56:09PM -0500, Dave Gerlach wrote: > > There are several instances when one would want to execute out of on-chip > > SRAM, such as PM code on ARM platforms, so once again revisiting this > > series to allow that in a generic manner. Seems that having a solution for > > allowing SRAM to be mapped as executable will help clean up PM code on > > several > > ARM platforms that are using ARM internal __arm_ioremap_exec API > > and also open the door for PM support on new platforms like TI AM335x and > > AM437x. This was last sent as RFC here [1] and based on comments from > > Russell > > King and Arnd Bergmann has been rewritten to use memremap API rather than > > ioremap API, as executable iomem does not really make sense. > > This is better, as it avoids the issue that I pointed out last time > around, but I'm still left wondering about the approach. > > Sure, having executable SRAM mappings sounds nice and easy, but we're > creating WX mappings. Folk have spent a while improving the security of > the kernel by ensuring that there are no WX mappings, and this series > reintroduces them. The sad thing is that any WX mapping which appears > at a known address can be exploited. > > "A known address" can be something that appears to be random, but ends > up being the same across the same device type... or can be discovered > by some means. Eg, consider if the WX mapping is dynamically allocated, > but occurs at exactly the same point at boot - and if this happens with > android phones, consider how many of those are out there. Or if the > address of the WX mapping is available via some hardware register. > Or... > > See Kees Cook's slides at last years kernel summit - > https://outflux.net/slides/2015/ks/security.pdf > > So, I think avoiding WX mappings - mappings should be either W or X but > not both simultaneously (see page 19.) > > I guess what I'm angling at is that we don't want memremap_exec(), but > we need an API which changes the permissions of a SRAM mapping between > allowing writes and allowing execution. That should work just fine. So first copy the code to SRAM, then set it read-only and exectuable. Note that we need to restore the state of SRAM every time when returning from off mode during idle on some SoCs. Regards, Tony
Re: [PATCH 0/3] Add memremap executable mapping and extend drivers/misc/sram.c
On Thu, Oct 27, 2016 at 01:56:09PM -0500, Dave Gerlach wrote: > There are several instances when one would want to execute out of on-chip > SRAM, such as PM code on ARM platforms, so once again revisiting this > series to allow that in a generic manner. Seems that having a solution for > allowing SRAM to be mapped as executable will help clean up PM code on several > ARM platforms that are using ARM internal __arm_ioremap_exec API > and also open the door for PM support on new platforms like TI AM335x and > AM437x. This was last sent as RFC here [1] and based on comments from Russell > King and Arnd Bergmann has been rewritten to use memremap API rather than > ioremap API, as executable iomem does not really make sense. This is better, as it avoids the issue that I pointed out last time around, but I'm still left wondering about the approach. Sure, having executable SRAM mappings sounds nice and easy, but we're creating WX mappings. Folk have spent a while improving the security of the kernel by ensuring that there are no WX mappings, and this series reintroduces them. The sad thing is that any WX mapping which appears at a known address can be exploited. "A known address" can be something that appears to be random, but ends up being the same across the same device type... or can be discovered by some means. Eg, consider if the WX mapping is dynamically allocated, but occurs at exactly the same point at boot - and if this happens with android phones, consider how many of those are out there. Or if the address of the WX mapping is available via some hardware register. Or... See Kees Cook's slides at last years kernel summit - https://outflux.net/slides/2015/ks/security.pdf So, I think avoiding WX mappings - mappings should be either W or X but not both simultaneously (see page 19.) I guess what I'm angling at is that we don't want memremap_exec(), but we need an API which changes the permissions of a SRAM mapping between allowing writes and allowing execution. -- RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net.
Re: [PATCH 0/3] Add memremap executable mapping and extend drivers/misc/sram.c
Hi, On 27/10/2016 at 13:56:09 -0500, Dave Gerlach wrote : > There are several instances when one would want to execute out of on-chip > SRAM, such as PM code on ARM platforms, so once again revisiting this > series to allow that in a generic manner. Seems that having a solution for > allowing SRAM to be mapped as executable will help clean up PM code on several > ARM platforms that are using ARM internal __arm_ioremap_exec API > and also open the door for PM support on new platforms like TI AM335x and > AM437x. This was last sent as RFC here [1] and based on comments from Russell > King and Arnd Bergmann has been rewritten to use memremap API rather than > ioremap API, as executable iomem does not really make sense. > > I still see several platforms (at-91, imx6, socfpga) that could make use > of this and use the generic sram driver to allocate the SRAM needed for PM. > This series allows direct allocation of SRAM using the generic SRAM driver > that will be already mapped as executable. Otherwise platform SRAM allocation > code must be used or if the generic sram driver is used as-is the memory > must be remapped as executable after it has been mapped normally by the > SRAM driver. > Rockchip also actually needs that. > I had sent omap3 series to convert from using old omap sram platform > mapping code to using the generic sram driver instead here [2] which was > based on previous RFC but can easily be rebased on this updated series. > Finally, forthcoming TI am335x and am437x PM code must make use of > it as well, as portions of PM code are moving in to drivers. > > Changes from the RFC include: > > - Rather than introduce ioremap_exec API, use memremap API, as the concept > of executable iomem does not make sense; any memory that can used to > run code should not have io side effects like iomem. > - Rather than having a fallback mapping if a platform does not support > exec mappings under the memremap API, have the mapping fail, as if you > are mapping memory as exec, presumably you will then try to run code > from it which will fail anyway, so it makes more sense to prevent the > mapping in the first place. > - Update sram driver to use memremap rather than ioremap for exec flags. > > Regards, > Dave > > [1] http://www.spinics.net/lists/arm-kernel/msg503071.html > [2] http://www.spinics.net/lists/linux-omap/msg128753.html > > Dave Gerlach (3): > ARM: memremap: implement arch_memremap_exec/exec_nocache > memremap: add MEMREMAP_EXEC and MEMREMAP_EXEC_NOCACHE flags > misc: SRAM: Add option to map SRAM to allow code execution > > Documentation/devicetree/bindings/sram/sram.txt | 2 ++ > arch/arm/include/asm/io.h | 5 > arch/arm/mm/ioremap.c | 16 > arch/arm/mm/nommu.c | 12 + > drivers/misc/sram.c | 7 + > include/linux/io.h | 2 ++ > kernel/memremap.c | 34 > - > 7 files changed, 77 insertions(+), 1 deletion(-) > To the whole series: Tested-by: Alexandre Belloni -- Alexandre Belloni, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
[PATCH 0/3] Add memremap executable mapping and extend drivers/misc/sram.c
Hi, There are several instances when one would want to execute out of on-chip SRAM, such as PM code on ARM platforms, so once again revisiting this series to allow that in a generic manner. Seems that having a solution for allowing SRAM to be mapped as executable will help clean up PM code on several ARM platforms that are using ARM internal __arm_ioremap_exec API and also open the door for PM support on new platforms like TI AM335x and AM437x. This was last sent as RFC here [1] and based on comments from Russell King and Arnd Bergmann has been rewritten to use memremap API rather than ioremap API, as executable iomem does not really make sense. I still see several platforms (at-91, imx6, socfpga) that could make use of this and use the generic sram driver to allocate the SRAM needed for PM. This series allows direct allocation of SRAM using the generic SRAM driver that will be already mapped as executable. Otherwise platform SRAM allocation code must be used or if the generic sram driver is used as-is the memory must be remapped as executable after it has been mapped normally by the SRAM driver. I had sent omap3 series to convert from using old omap sram platform mapping code to using the generic sram driver instead here [2] which was based on previous RFC but can easily be rebased on this updated series. Finally, forthcoming TI am335x and am437x PM code must make use of it as well, as portions of PM code are moving in to drivers. Changes from the RFC include: - Rather than introduce ioremap_exec API, use memremap API, as the concept of executable iomem does not make sense; any memory that can used to run code should not have io side effects like iomem. - Rather than having a fallback mapping if a platform does not support exec mappings under the memremap API, have the mapping fail, as if you are mapping memory as exec, presumably you will then try to run code from it which will fail anyway, so it makes more sense to prevent the mapping in the first place. - Update sram driver to use memremap rather than ioremap for exec flags. Regards, Dave [1] http://www.spinics.net/lists/arm-kernel/msg503071.html [2] http://www.spinics.net/lists/linux-omap/msg128753.html Dave Gerlach (3): ARM: memremap: implement arch_memremap_exec/exec_nocache memremap: add MEMREMAP_EXEC and MEMREMAP_EXEC_NOCACHE flags misc: SRAM: Add option to map SRAM to allow code execution Documentation/devicetree/bindings/sram/sram.txt | 2 ++ arch/arm/include/asm/io.h | 5 arch/arm/mm/ioremap.c | 16 arch/arm/mm/nommu.c | 12 + drivers/misc/sram.c | 7 + include/linux/io.h | 2 ++ kernel/memremap.c | 34 - 7 files changed, 77 insertions(+), 1 deletion(-) -- 2.9.3