Linux + Clang + execstack
Mikael Vidstedt
mikael.vidstedt at oracle.com
Wed Sep 5 02:22:16 UTC 2018
> On Sep 4, 2018, at 7:06 PM, Martin Buchholz <martinrb at google.com> wrote:
>
> Here's Arthur's patch:
>
> 8205457: gcc and clang should use the same ld flags
> http://cr.openjdk.java.net/~martin/webrevs/jdk/noexecstack/
> https://bugs.openjdk.java.net/browse/JDK-8205457
>
> This applies -Wl,-z,noexecstack uniformly to all linker invocations where
> applicable.
>
> TODO:
> All ld flags on Linux should be treated equally by gcc and clang
> The test TestCheckJDK and supporting infrastructure should stop advertising
> itself as only dealing with libraries.
> Maybe add GNU-stack annotations to all the Linux .s files as well?
I like to think that our .s files are effectively incomplete, and that adding the annotations makes them less incomplete. I am, however, not emotionally attached to this so I’ll leave it up to you and others to decide what to do with it :)
(it would also be interesting to see if we can perhaps move some of the .s code to C++ instead)
Cheers,
Mikael
>
>
> On Tue, Sep 4, 2018 at 4:01 PM, Martin Buchholz <martinrb at google.com> wrote:
>
>> I think we can all agree that passing flags to the linker to ensure
>> non-executable stack is the right thing to do. But there's a question
>> whether *also* adding something to our assembly language source files will
>> be worth doing. Neither mechanism is sure to work. For the linker flag,
>> we need to be aware of and test for the presence of the linker flag, but we
>> might be using some other linker... Similarly, we might end up using some
>> other assembler, or we might need to mark the assembly source file in a
>> different way than "GNU-stack".
>>
>> On Tue, Aug 21, 2018 at 4:14 AM, Magnus Ihse Bursie <
>> magnus.ihse.bursie at oracle.com> wrote:
>>
>>> On 2018-08-21 02:03, David Holmes wrote:
>>>
>>>> On 21/08/2018 9:39 AM, Arthur Eubanks wrote:
>>>>
>>>>> On Mon, Aug 20, 2018 at 4:18 PM David Holmes <david.holmes at oracle.com
>>>>> <mailto:david.holmes at oracle.com>> wrote:
>>>>>
>>>>> Hi Arthur,
>>>>>
>>>>> cc'ing build-dev as this is currently a build issue.
>>>>>
>>>>> On 21/08/2018 3:11 AM, Arthur Eubanks wrote:
>>>>>> Hi,
>>>>>>
>>>>>> At Google we're trying to build hotspot on Linux with clang. One
>>>>> thing that
>>>>>> happens is that the resulting libjvm.so is stack executable. When
>>>>> running
>>>>>> hotspot we get warnings about the stack being executable.
>>>>>>
>>>>>> Compiling an assembly file into the final .so results in the
>>>>> stack being
>>>>>> executable. In this case the file is linux_x86_64.s. This doesn't
>>>>> happen
>>>>>> with gcc because "-Wl,-z,noexecstack" is passed as a hotspot
>>>>> linker flag
>>>>>> with gcc in flags-ldflags.m4. When using clang that linker flag
>>>>> isn't
>>>>>> passed.
>>>>>>
>>>>>> Doing something like the solution in
>>>>>> https://wiki.ubuntu.com/SecurityTeam/Roadmap/ExecutableStacks
>>>>>> fixes the problem without the use of linker flags.
>>>>>
>>>>> You mean the source code directives for the linker?
>>>>>
>>>>> Sorry, I wasn't specific enough, I meant the flags for the assembler.
>>>>> #if defined(__linux__) && defined(__ELF__)
>>>>> .section .note.GNU-stack, "", %progbits
>>>>> #endif
>>>>>
>>>>>
>>>>> I think I prefer to see this handled explicitly in the build as is
>>>>> currently done. Can we just adjust ./make/autoconf/flags-ldflags.m4
>>>>> to
>>>>> pass the linker flags for gcc and clang?
>>>>>
>>>>> I don't mind this solution, but it seems like the right thing to do is
>>>>> to fix things at the source level and remove extra unnecessary linker flags.
>>>>>
>>>>
>>>> Personally I see this as source code pollution. The concept of
>>>> executable stacks has nothing to do with what is being expressed by the
>>>> source code, or the language used for it.
>>>>
>>>> Just my 2c. I'll defer to build folk ... though they are still on
>>>> vacation at the moment.
>>>>
>>>
>>> I agree with David. The executable stack is a build option. Even if you
>>> change the source code so the compiler/assember does the right thing, we
>>> would still want to keep the compiler option. (Otherwise one day you'll end
>>> up with executable stacks due to someone adding a new asm file and
>>> forgetting the "magic incantation".)
>>>
>>> And, since we will keep the compiler option, there seems little point in
>>> also adding this stuff to the asm files.
>>>
>>> To address your concerns on clang: we should reasonably be giving the
>>> same options to clang. There is no good reason, except for oversight, that
>>> this is not done already. (Cleaning up and unifying the compiler flags is
>>> an ongoing, but slowly moving, process.) So the correct fix is to update
>>> flags-ldflags.m4.
>>>
>>> /Magnus
>>>
>>>
>>>
>>>
>>>
>>>> I removed "-Wl,-z,noexecstack" from the flags after adding the above
>>>>> assembler flags and libjvm.so is still correctly not stack executable. I
>>>>> don't really mind either way though. Maybe it's good to have an extra
>>>>> safeguard in the linker flags.
>>>>>
>>>>>
>>>>>> The jtreg test test/hotspot/jtreg/runtime/exe
>>>>> cstack/TestCheckJDK.java
>>>>>> checks for the stack being executable.
>>>>>>
>>>>>> Any thoughts? If there are no objections, I can propose a patch
>>>>> that works
>>>>>> for both gcc and clang on Linux. Also, I'm not sure how/if macOS
>>>>> handles
>>>>>> this problem given that it uses clang.
>>>>>
>>>>> We don't seem to handle it at all on OS X. Does OS X prevent
>>>>> executable
>>>>> stacks itself?
>>>>>
>>>>> A quick search, according to Wikipedia (https://en.wikipedia.org/wiki
>>>>> /Executable_space_protection#macOS), 64-bit executables on macOS
>>>>> aren't stack or heap executable. Not sure if that information is accurate
>>>>> though.
>>>>>
>>>>
>>>> Seems to be:
>>>>
>>>> https://developer.apple.com/library/archive/documentation/Se
>>>> curity/Conceptual/SecureCodingGuide/Articles/BufferOverflows.html
>>>>
>>>> "macOS and iOS provide two features that can make it harder to exploit
>>>> stack and buffer overflows: address space layout randomization (ASLR) and a
>>>> non-executable stack and heap."
>>>>
>>>> Cheers,
>>>> David
>>>>
>>>>
>>>>> David
>>>>>
>>>>>
>>>
>>
More information about the hotspot-dev
mailing list