From: Arvind Sankar <nivedita@alum.mit.edu> To: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com> Cc: Florian Weimer <fw@deneb.enyo.de>, kernel-hardening@lists.openwall.com, linux-api@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, oleg@redhat.com, x86@kernel.org, libffi-discuss@sourceware.org, luto@kernel.org, David.Laight@ACULAB.COM, mark.rutland@arm.com, mic@digikod.net, pavel@ucw.cz Subject: Re: [PATCH v2 0/4] [RFC] Implement Trampoline File Descriptor Date: Tue, 22 Sep 2020 21:46:16 -0400 [thread overview] Message-ID: <20200923014616.GA1216401@rani.riverdale.lan> (raw) In-Reply-To: <96ea02df-4154-5888-1669-f3beeed60b33@linux.microsoft.com> On Thu, Sep 17, 2020 at 10:36:02AM -0500, Madhavan T. Venkataraman wrote: > > > On 9/16/20 8:04 PM, Florian Weimer wrote: > > * madvenka: > > > >> Examples of trampolines > >> ======================= > >> > >> libffi (A Portable Foreign Function Interface Library): > >> > >> libffi allows a user to define functions with an arbitrary list of > >> arguments and return value through a feature called "Closures". > >> Closures use trampolines to jump to ABI handlers that handle calling > >> conventions and call a target function. libffi is used by a lot > >> of different applications. To name a few: > >> > >> - Python > >> - Java > >> - Javascript > >> - Ruby FFI > >> - Lisp > >> - Objective C > > > > libffi does not actually need this. It currently collocates > > trampolines and the data they need on the same page, but that's > > actually unecessary. It's possible to avoid doing this just by > > changing libffi, without any kernel changes. > > > > I think this has already been done for the iOS port. > > > > The trampoline table that has been implemented for the iOS port (MACH) > is based on PC-relative data referencing. That is, the code and data > are placed in adjacent pages so that the code can access the data using > an address relative to the current PC. > > This is an ISA feature that is not supported on all architectures. > > Now, if it is a performance feature, we can include some architectures > and exclude others. But this is a security feature. IMO, we cannot > exclude any architecture even if it is a legacy one as long as Linux > is running on the architecture. So, we need a solution that does > not assume any specific ISA feature. Which ISA does not support PIC objects? You mentioned i386 below, but i386 does support them, it just needs to copy the PC into a GPR first (see below). > > >> The code for trampoline X in the trampoline table is: > >> > >> load &code_table[X], code_reg > >> load (code_reg), code_reg > >> load &data_table[X], data_reg > >> load (data_reg), data_reg > >> jump code_reg > >> > >> The addresses &code_table[X] and &data_table[X] are baked into the > >> trampoline code. So, PC-relative data references are not needed. The user > >> can modify code_table[X] and data_table[X] dynamically. > > > > You can put this code into the libffi shared object and map it from > > there, just like the rest of the libffi code. To get more > > trampolines, you can map the page containing the trampolines multiple > > times, each instance preceded by a separate data page with the control > > information. > > > > If you put the code in the libffi shared object, how do you pass data to > the code at runtime? If the code we are talking about is a function, then > there is an ABI defined way to pass data to the function. But if the > code we are talking about is some arbitrary code such as a trampoline, > there is no ABI defined way to pass data to it except in a couple of > platforms such as HP PA-RISC that have support for function descriptors > in the ABI itself. > > As mentioned before, if the ISA supports PC-relative data references > (e.g., X86 64-bit platforms support RIP-relative data references) > then we can pass data to that code by placing the code and data in > adjacent pages. So, you can implement the trampoline table for X64. > i386 does not support it. > i386 just needs a tiny bit of code to copy the PC into a GPR first, i.e. the trampoline would be: call 1f 1: pop %data_reg movl (code_table + X - 1b)(%data_reg), %code_reg movl (data_table + X - 1b)(%data_reg), %data_reg jmp *(%code_reg) I do not understand the point about passing data at runtime. This trampoline is to achieve exactly that, no? Thanks.
WARNING: multiple messages have this Message-ID (diff)
From: Arvind Sankar <nivedita@alum.mit.edu> To: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com> Cc: mark.rutland@arm.com, pavel@ucw.cz, kernel-hardening@lists.openwall.com, linux-api@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, oleg@redhat.com, mic@digikod.net, linux-security-module@vger.kernel.org, Florian Weimer <fw@deneb.enyo.de>, luto@kernel.org, linux-fsdevel@vger.kernel.org, linux-integrity@vger.kernel.org, David.Laight@ACULAB.COM, libffi-discuss@sourceware.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 0/4] [RFC] Implement Trampoline File Descriptor Date: Tue, 22 Sep 2020 21:46:16 -0400 [thread overview] Message-ID: <20200923014616.GA1216401@rani.riverdale.lan> (raw) In-Reply-To: <96ea02df-4154-5888-1669-f3beeed60b33@linux.microsoft.com> On Thu, Sep 17, 2020 at 10:36:02AM -0500, Madhavan T. Venkataraman wrote: > > > On 9/16/20 8:04 PM, Florian Weimer wrote: > > * madvenka: > > > >> Examples of trampolines > >> ======================= > >> > >> libffi (A Portable Foreign Function Interface Library): > >> > >> libffi allows a user to define functions with an arbitrary list of > >> arguments and return value through a feature called "Closures". > >> Closures use trampolines to jump to ABI handlers that handle calling > >> conventions and call a target function. libffi is used by a lot > >> of different applications. To name a few: > >> > >> - Python > >> - Java > >> - Javascript > >> - Ruby FFI > >> - Lisp > >> - Objective C > > > > libffi does not actually need this. It currently collocates > > trampolines and the data they need on the same page, but that's > > actually unecessary. It's possible to avoid doing this just by > > changing libffi, without any kernel changes. > > > > I think this has already been done for the iOS port. > > > > The trampoline table that has been implemented for the iOS port (MACH) > is based on PC-relative data referencing. That is, the code and data > are placed in adjacent pages so that the code can access the data using > an address relative to the current PC. > > This is an ISA feature that is not supported on all architectures. > > Now, if it is a performance feature, we can include some architectures > and exclude others. But this is a security feature. IMO, we cannot > exclude any architecture even if it is a legacy one as long as Linux > is running on the architecture. So, we need a solution that does > not assume any specific ISA feature. Which ISA does not support PIC objects? You mentioned i386 below, but i386 does support them, it just needs to copy the PC into a GPR first (see below). > > >> The code for trampoline X in the trampoline table is: > >> > >> load &code_table[X], code_reg > >> load (code_reg), code_reg > >> load &data_table[X], data_reg > >> load (data_reg), data_reg > >> jump code_reg > >> > >> The addresses &code_table[X] and &data_table[X] are baked into the > >> trampoline code. So, PC-relative data references are not needed. The user > >> can modify code_table[X] and data_table[X] dynamically. > > > > You can put this code into the libffi shared object and map it from > > there, just like the rest of the libffi code. To get more > > trampolines, you can map the page containing the trampolines multiple > > times, each instance preceded by a separate data page with the control > > information. > > > > If you put the code in the libffi shared object, how do you pass data to > the code at runtime? If the code we are talking about is a function, then > there is an ABI defined way to pass data to the function. But if the > code we are talking about is some arbitrary code such as a trampoline, > there is no ABI defined way to pass data to it except in a couple of > platforms such as HP PA-RISC that have support for function descriptors > in the ABI itself. > > As mentioned before, if the ISA supports PC-relative data references > (e.g., X86 64-bit platforms support RIP-relative data references) > then we can pass data to that code by placing the code and data in > adjacent pages. So, you can implement the trampoline table for X64. > i386 does not support it. > i386 just needs a tiny bit of code to copy the PC into a GPR first, i.e. the trampoline would be: call 1f 1: pop %data_reg movl (code_table + X - 1b)(%data_reg), %code_reg movl (data_table + X - 1b)(%data_reg), %data_reg jmp *(%code_reg) I do not understand the point about passing data at runtime. This trampoline is to achieve exactly that, no? Thanks. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-09-23 1:46 UTC|newest] Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top [not found] <210d7cd762d5307c2aa1676705b392bd445f1baa> 2020-09-16 15:08 ` [PATCH v2 0/4] [RFC] Implement Trampoline File Descriptor madvenka 2020-09-16 15:08 ` madvenka 2020-09-16 15:08 ` [PATCH v2 1/4] [RFC] fs/trampfd: Implement the trampoline file descriptor API madvenka 2020-09-16 15:08 ` madvenka 2020-09-16 15:08 ` [PATCH v2 2/4] [RFC] x86/trampfd: Provide support for the trampoline file descriptor madvenka 2020-09-16 15:08 ` madvenka 2020-09-17 1:10 ` kernel test robot 2020-09-17 3:04 ` kernel test robot 2020-09-16 15:08 ` [PATCH v2 3/4] [RFC] arm64/trampfd: " madvenka 2020-09-16 15:08 ` madvenka 2020-09-16 15:08 ` [PATCH v2 4/4] [RFC] arm/trampfd: " madvenka 2020-09-16 15:08 ` madvenka 2020-09-17 1:04 ` [PATCH v2 0/4] [RFC] Implement Trampoline File Descriptor Florian Weimer 2020-09-17 1:04 ` Florian Weimer 2020-09-17 1:04 ` Florian Weimer 2020-09-17 15:36 ` Madhavan T. Venkataraman 2020-09-17 15:36 ` Madhavan T. Venkataraman 2020-09-17 15:57 ` Madhavan T. Venkataraman 2020-09-17 15:57 ` Madhavan T. Venkataraman 2020-09-17 16:01 ` Florian Weimer 2020-09-17 16:01 ` Florian Weimer 2020-09-17 16:01 ` Florian Weimer 2020-09-23 1:46 ` Arvind Sankar [this message] 2020-09-23 1:46 ` Arvind Sankar 2020-09-23 9:11 ` Arvind Sankar 2020-09-23 9:11 ` Arvind Sankar 2020-09-23 19:17 ` Madhavan T. Venkataraman 2020-09-23 19:17 ` Madhavan T. Venkataraman 2020-09-23 19:51 ` Arvind Sankar 2020-09-23 19:51 ` Arvind Sankar 2020-09-23 23:51 ` Madhavan T. Venkataraman 2020-09-23 23:51 ` Madhavan T. Venkataraman 2020-09-24 20:23 ` Madhavan T. Venkataraman 2020-09-24 20:23 ` Madhavan T. Venkataraman 2020-09-24 20:52 ` Florian Weimer 2020-09-24 20:52 ` Florian Weimer 2020-09-24 20:52 ` Florian Weimer 2020-09-25 22:22 ` Madhavan T. Venkataraman 2020-09-25 22:22 ` Madhavan T. Venkataraman 2020-09-27 18:25 ` Madhavan T. Venkataraman 2020-09-27 18:25 ` Madhavan T. Venkataraman 2020-10-03 9:43 ` Jay K 2020-10-03 9:43 ` Jay K 2020-09-24 22:13 ` Pavel Machek 2020-09-24 22:13 ` Pavel Machek 2020-09-24 23:43 ` Arvind Sankar 2020-09-24 23:43 ` Arvind Sankar 2020-09-25 22:44 ` Madhavan T. Venkataraman 2020-09-25 22:44 ` Madhavan T. Venkataraman 2020-09-26 15:55 ` Arvind Sankar 2020-09-26 15:55 ` Arvind Sankar 2020-09-27 17:59 ` Madhavan T. Venkataraman 2020-09-27 17:59 ` Madhavan T. Venkataraman 2020-09-23 2:50 ` Jay K 2020-09-23 2:50 ` Jay K 2020-09-22 21:53 ` madvenka 2020-09-22 21:53 ` madvenka 2020-09-22 21:53 ` [PATCH v2 1/4] [RFC] fs/trampfd: Implement the trampoline file descriptor API madvenka 2020-09-22 21:53 ` madvenka 2020-09-22 21:53 ` [PATCH v2 2/4] [RFC] x86/trampfd: Provide support for the trampoline file descriptor madvenka 2020-09-22 21:53 ` madvenka 2020-09-23 13:40 ` kernel test robot 2020-09-22 21:53 ` [PATCH v2 3/4] [RFC] arm64/trampfd: " madvenka 2020-09-22 21:53 ` madvenka 2020-09-22 21:53 ` [PATCH v2 4/4] [RFC] arm/trampfd: " madvenka 2020-09-22 21:53 ` madvenka 2020-09-22 21:54 ` [PATCH v2 0/4] [RFC] Implement Trampoline File Descriptor Madhavan T. Venkataraman 2020-09-22 21:54 ` Madhavan T. Venkataraman 2020-09-23 8:14 ` Pavel Machek 2020-09-23 8:14 ` Pavel Machek 2020-09-23 9:14 ` Solar Designer 2020-09-23 9:14 ` Solar Designer 2020-09-23 14:11 ` Solar Designer 2020-09-23 14:11 ` Solar Designer 2020-09-23 15:18 ` Pavel Machek 2020-09-23 15:18 ` Pavel Machek 2020-09-23 18:00 ` Solar Designer 2020-09-23 18:00 ` Solar Designer 2020-09-23 18:21 ` Solar Designer 2020-09-23 18:21 ` Solar Designer 2020-09-23 14:39 ` Florian Weimer 2020-09-23 14:39 ` Florian Weimer 2020-09-23 14:39 ` Florian Weimer 2020-09-23 18:09 ` Andy Lutomirski 2020-09-23 18:09 ` Andy Lutomirski 2020-09-23 18:11 ` Solar Designer 2020-09-23 18:11 ` Solar Designer 2020-09-23 18:49 ` Arvind Sankar 2020-09-23 18:49 ` Arvind Sankar 2020-09-23 23:53 ` Madhavan T. Venkataraman 2020-09-23 23:53 ` Madhavan T. Venkataraman 2020-09-23 19:41 ` Madhavan T. Venkataraman 2020-09-23 19:41 ` Madhavan T. Venkataraman 2020-09-23 18:10 ` James Morris 2020-09-23 18:10 ` James Morris 2020-09-23 18:32 ` Madhavan T. Venkataraman 2020-09-23 18:32 ` Madhavan T. Venkataraman 2020-09-23 8:42 ` Pavel Machek 2020-09-23 8:42 ` Pavel Machek 2020-09-23 18:56 ` Madhavan T. Venkataraman 2020-09-23 18:56 ` Madhavan T. Venkataraman 2020-09-23 20:51 ` Pavel Machek 2020-09-23 20:51 ` Pavel Machek 2020-09-23 23:04 ` Madhavan T. Venkataraman 2020-09-23 23:04 ` Madhavan T. Venkataraman 2020-09-24 16:44 ` Mickaël Salaün 2020-09-24 16:44 ` Mickaël Salaün 2020-09-24 22:05 ` Pavel Machek 2020-09-24 22:05 ` Pavel Machek 2020-09-25 10:12 ` Mickaël Salaün 2020-09-25 10:12 ` Mickaël Salaün
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200923014616.GA1216401@rani.riverdale.lan \ --to=nivedita@alum.mit.edu \ --cc=David.Laight@ACULAB.COM \ --cc=fw@deneb.enyo.de \ --cc=kernel-hardening@lists.openwall.com \ --cc=libffi-discuss@sourceware.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-integrity@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-security-module@vger.kernel.org \ --cc=luto@kernel.org \ --cc=madvenka@linux.microsoft.com \ --cc=mark.rutland@arm.com \ --cc=mic@digikod.net \ --cc=oleg@redhat.com \ --cc=pavel@ucw.cz \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.