[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 272585] calling mprotect in an mmap-ed stack can affect non-target pages"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 19 Jul 2023 00:40:13 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=272585 Bug ID: 272585 Summary: calling mprotect in an mmap-ed stack can affect non-target pages Product: Base System Version: CURRENT Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: jfc@mit.edu Attachment #243475 text/plain mime type: Created attachment 243475 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=243475&action=edit mmap-ed stack with an inaccessible gap If I call mmap with MAP_GROWSDOWN|MAP_STACK and use mprotect to mark the 32nd page from the top inaccessible (PROT_NONE), lower addresses in the region also become inaccessible. This is an odd thing to do, I agree, but it happened in a real program. Put another way: I call mmap with stack hints and get pages 0-255. Before touching the memory I call mprotect(PROT_NONE) on page 224. Now pages 1-223 are also inaccessible. The target of mprotect has to be 32 pages down, not 31 or 33, at least with my system's configuration. Perhaps 32 pages is the initial mapped size of a stack region and when the stack grows it clones the page attributes of the lowest address. I attached an example that crashes reading an address that should be valid. It works on Mac OS (without the unsupported MAP_GROWSDOWN|MAP_STACK flags) and Linux. (This is simplified from a larger program that allocates a highly aligned 1 MB stack by mapping a larger region and using mprotect to install guard pages. It is not the "right" way to do it when MAP_ALIGNED is available. The program was written first on Linux which doesn't have that option.) Reproduced on 13.2-STABLE/amd64, 13.2-STABLE/aarch64, 14-CURRENT/amd64. -- You are receiving this mail because: You are the assignee for the bug.