On Tue, Sep 1, 2015 at 9:55 PM, Rich Felker <dal...@libc.org> wrote: > On Tue, Sep 01, 2015 at 09:32:22PM -0700, Andy Lutomirski wrote: >> On Tue, Sep 1, 2015 at 9:18 PM, Rich Felker <dal...@libc.org> wrote: >> > On Tue, Sep 01, 2015 at 08:39:27PM -0700, Andy Lutomirski wrote: >> >> On Tue, Sep 1, 2015 at 7:54 PM, Rich Felker <dal...@libc.org> wrote: >> >> > On Tue, Sep 01, 2015 at 05:51:44PM -0700, Andy Lutomirski wrote: >> >> >> Hi all- >> >> >> >> >> >> Linux has a handful of weird features that are only supported for >> >> >> backwards compatibility. The big one is the x86_64 vsyscall page, but >> >> >> uselib probably belongs on the list, too, and we might end up with >> >> >> more at some point. >> >> >> >> >> >> I'd like to add a way that new programs can turn these features off. >> >> >> In particular, I want the vsyscall page to be completely gone from the >> >> >> perspective of any new enough program. This is straightforward if we >> >> >> add a system call to ask for the vsyscall page to be disabled, but I'm >> >> >> wondering if we can come up with a non-syscall way to do it. >> >> >> >> >> >> I think that the ideal behavior would be that anything linked against >> >> >> a sufficiently new libc would be detected, but I don't see a good way >> >> >> to do that using existing toolchain features. >> >> >> >> >> >> Ideas? We could add a new phdr for this, but then we'd need to play >> >> >> linker script games, and I'm not sure that could be done in a clean, >> >> >> extensible way. >> >> > >> >> > Is there a practical problem you're trying to solve? My understanding >> >> > is that the vsyscall nonsense is fully emulated now and that the ways >> >> > it could be used as an attack vector have been mitigated. >> >> >> >> They've been mostly mitigated, but not fully. See: >> >> >> >> http://googleprojectzero.blogspot.com/2015/08/three-bypasses-and-fix-for-one-of.html >> > >> > That looks like it would be mitigated by not having any mapping there >> > at all and having the kernel just catch the page fault and emulate >> > rather than filling it with trapping opcodes for the kernel to catch. >> > >> >> Oddly, that causes a compatibility problem. There's a program called >> pin that does dynamic instrumentation and actually expects to be able >> to read the targets of calls. The way that Linux handles this now is > > Um, do people seriously need to do this dynamic instrumentation on > ancient obsolete binaries? This sounds to me like confused > requirements.
Unclear. They certainly did, and I got a bug report, the first time around. That was a couple years ago. I suppose we could have a sysctl that you need to set to enable that use case. OTOH, I think that, as long as we have a way to distinguish new and old binaries, it's not that much harder to twiddle vsyscall readability per process than it is to twiddle vsyscall executability per process. --Andy