--- xml/htdocs/proj/en/hardened/pax-quickstart.xml 2012/10/28 15:21:07 1.13
+++ xml/htdocs/proj/en/hardened/pax-quickstart.xml 2013/01/04 20:59:04 1.15
@@ -1,30 +1,36 @@
-
+
-
-Hardened Gentoo is a project interested in the hardening of a Gentoo system.
-Several different solutions are supported by us and there is a fair bit of
-flexibility to create your own setup. At the heart of a common Hardened Gentoo
-setup is
-PaX is a patch to the Linux kernel that provides hardening in two ways.
+PaX is a patch to the Linux kernel that provides hardening in three ways.
-The first,
-The second protection provided by PaX is non-executable memory. This prevents a
-common form of attack where executable code is inserted into memory by an
-attacker. More information on PaX can be found throughout this guide, but the
-homepage can be found at
+/*
+ * Contrast compiling with:
+ * gcc -UBAD -o mmap-rw mmap-rwx.c
+ * gcc -DBAD -o mmap-rwx mmap-rwx.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <string.h>
+
+int main()
+{
+ size_t *m;
+
+#ifdef BAD
+ m = mmap( NULL, 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
+#else
+ m = mmap( NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
+#endif
+
+ if( m == MAP_FAILED )
+ printf("mmap failed: %s\n", strerror(errno));
+ else
+ printf("mmap succeeded: %p\n", m);
+
+ return 0;
+}
+
-
-
-
++Similarly, try running the following with EMULTRAMP both enabled and disabled. +This convoluted code forces gcc to set up a trampoline for the nested function +f2(). The trampoline is executable code which lives on the stack and could allow +the user to inject their own code via the variable i. +
+ +
+/*
+ * Contrast compiling with:
+ * gcc -DTRAMPOLINE -o trampoline trampoline.c
+ * gcc -UTRAMPOLINE -o trampoline trampoline.c
+ *
+ */
+
+#include <stdio.h>
+
+typedef void (*fptr)(void) ;
+
+void f0(fptr f)
+{
+ (*f)();
+}
+
+void f1()
+{
+ int i ;
+ printf("Enter an integer: ");
+ scanf("%d", &i);
+
+ void f2()
+ {
+ printf("%d: Bouncey bouncey bounce!\n", i);
+ }
+
+#ifdef TRAMPOLINE
+ f0(f2);
+#endif
+}
+
+int main ()
+{
+ f1() ;
+ return 0;
+}
+
-
+2. The second is Address Space Layout Randomization (ASLR). This provides a
+randomization of the memory map of a process (as reported, for example, by
+pmap) and thus makes it harder for an attacker to find the exploitable code
+within that space. Each time a process is spawned from a particular ELF
+executable, its memory map is different. Thus exploitable code which may
+live at 0x00007fff5f281000 for one running instance of an executable may
+find itself at 0x00007f4246b5b000 for another. While the vanilla kernel
+does provide some ASLR, a PaX patched kernel increases that. Furthermore,
+when an application is built as a Position Independent Executable (
+/*
+ * Contrast compiling with:
+ * gcc -o aslr-test-withpie -fPIC -pie aslr-test.c
+ * gcc -o aslr-test-without -fno-PIC -nopie aslr-test.c
+ *
+ */
+
+#include <stdio.h>
+
+void doit()
+{
+ ;
+ return ;
+}
+
+int main()
+{
+ printf("main @ %p\n", main);
+ printf("doit @ %p\n", doit);
+ return 0;
+}
+
-As mentioned above, PaX is complemented by PIE. This method of building
-executables stores information needed to relocate parts of the executable in
-memory, hence the name
-
-At run time, when a buffer is created, SSP adds a secret random value, the
-canary, to the end of the buffer. When the function returns, SSP makes sure
-that the canary is still intact. If an attacker were to perform a buffer
-overflow, he would overwrite this value and trigger that stack smashing
-handler. Currently this kills the target process.
+More information on PaX can be found on its official homepage,
+
-
SOFTMODE: If this option is selected, PaX protection will not be enforced +by default for those features which can be turned on or off at runtime, so this is +the "permit by default" mode in contrast to the "forbid by default" which is obtained +when this option is not selected. In SOFTMODE, the user must explicitly mark +executables to enforce PaX protections, whereas in non-SOFTMODE, the user must explicitly +mark to relax PaX protections.
+ +Enforce non-executable pages:
+ +Enhanced Address Space Layout Randomization (ASLR):
+ +Miscellaneous Memory Protection:
+ ++As stated above, some PaX features can be enforced (in the case of SOFTMODE) +or relaxed (in the case of non-SOFTMODE) on a "per ELF object" basis. These +are PAGEEXEC, EMULTRAP, MPROTECT, RANDMMAP and SEGMEXEC and these are respectively +controlled by the following flags: P, E, M, R, S and p, e, m, r, s. +The upper case mean "enforce" in SOFTMODE and the lower case mean "relax" in +non-SOFTMODE. A third possibility is that neither the enforce or relax flags are +set, in which case the kernel simply uses the default for that particular protection. +Eg. if neither P nor p is set on an ELF object, then the kernel will not enforce +PAGEEXEC in SOFTMODE and will enforce it in non-SOFTMODE. +
+ +
+Currently the PaX patches support three ways of doing PaX markings: EI_PAX, PT_PAX
+and XATTR_PAX. EI_PAX places the PaX flags in bytes 14 and 15 of the e_ident field
+of an ELF objects's header. But this is broken in recent versions of glibc and is
+no longer supported. (See
+While PT_PAX is still supported, the preferred approach is to use XATTR_PAX which +places the PaX flags in a file system's extended attributes. This has the advantage +that it does not modify the ELF object in any way, but the disadvantage that the +filesystems which house these objects, and the utilities used to copy, move and archive, +them, must support xattrs. In the case of Gentoo and portage, this means that +tmpfs must support the user.pax.* xattr namespace in which the PaX flags are placed, +not just the security.* and trusted.* namespaces. (Note: user.pax.* is the subspace +of user.* which will be used for PaX related xattr information. We do not enable +the entire user.* namespace in tmpfs to reduce the risk of attack vectors via that +path.) +
+ ++One final caveat about the two supported methods of doing PaX markings: the PaX +kernel allows you to enable both PT_PAX and XATTR_PAX, but if you do so, it will +not impose the markings unless the same flags are found in both locations. +For this reason, we do not recommend enabling both, even for migration which we +describe below.
@@ -111,186 +396,612 @@
-Several Gentoo kernel trees are already patched with PaX.
+The Hardened Gentoo team maintains and supports the
-For 2.4/2.6 based machines, the recommended kernels are
-Grab one of the recommended source trees, or apply the appropriate patch from
-
-In
+[*] Enable various PaX features PaX Control -> [ ] Support soft mode - [*] Use legacy ELF header marking + [ ] Use legacy ELF header marking [*] Use ELF program header marking + [ ] Use filesystem extended attributes marking MAC system integration (none) ---> Non-executable page -> [*] Enforce non-executable pages [*] Paging based non-executable pages - [*] Segmentation based non-executable pages + [*] Segmentation based non-executable pages <--- Not available on amd64. [*] Emulate trampolines [*] Restrict mprotect() - [ ] Disallow ELF text relocations + [ ] Use legacy/compat protection demoting (read help) + [ ] Allow ELF text relocations (read help) + [*] Enforce non-executable kernel pages + Return Address Instrumentation Method (or) ---> <--- Not available on x86. + (4) Minimum amount of memory reserved for module code <--- Not available on amd64. Address Space Layout Randomization -> [*] Address Space Layout Randomization - [*] Randomize kernel stack base - [*] Randomize user stack base - [*] Randomize mmap() base - [*] Randomize ET_EXEC base + [*] Randomize kernel stack base + [*] Randomize user stack base + [*] Randomize mmap() base + +Miscellaneous hardening features ---> + + [*] Sanitize all freed memory + [*] Sanitize kernel stack + [*] Prevent invalid userland pointer dereference + [*] Prevent various kernel object reference counter overflows + [*] Harden heap object copies between kernel and userland + [*] Prevent various integer overflows in function size parameters + [*] Generate some entropy during boot-Build this kernel as you normally would and install it to
- -/boot . +Preferably, we should opt for XATTR_PAX flags. In that case, all of the above +can remain in place, but we would change the PaX Control configuration:
+PaX Control -> --Hardened Gentoo has added support for transparent PIE/SSP building via GCC's -specfile. This means that any users upgrading an older Hardened install should -remove any LDFLAGS or CFLAGS used to trigger PIE/SSP. Also, the -
+ [ ] Support soft mode + [ ] Use legacy ELF header marking + [ ] Use ELF program header marking + [*] Use filesystem extended attributes marking + MAC system integration (none) ---> +hardened-gcc package is now deprecated and should be unmerged -(version 5.0 is a dummy package). To get the current GCC, add -USE="hardened pic" to/etc/make.conf if not using the hardened -profile. -
-To maintain a consistant toolchain, first
+File systems ---> + <*> The Extended 4 (ext4) filesystem + -*- Ext4 extended attributes + [ ] Ext4 POSIX Access Control Lists + [ ] Ext4 Security Labels + [ ] EXT4 debugging support +
-You will probably also want to merge pax-utils.
-Often if an ELF has executable relocations in the text segment these can cause problems for us.
-scanelf -BRylptq
+Here
-Some legitimate applications will attempt to generate code at run time which is -executed out of memory. Naturally, PaX does not allow this and it will promptly -kill the offending application. +As we mentioned above, there are five PaX protections that can be enforced (in +SOFTMODE) or relaxed (in non-SOFTMODE) on a per ELF object basis: PAGEEXEC, +EMULTRAP, MPROTECT, RANDMMAP and SEGMEXEC. The later, SEGMEXEC, is only +available on x86 CPUs which support segmentation, unlike paging which is +supported on all CPUs, even x86. Since some programs break for one +reason or another under full PaX enforcement, we are faced with the choice +of either fixing the code to work with PaX or relaxing one or more of these +protections. In practice, "fixing the code" may be very difficult +and we resort to the latter. The general approach should be to try +full enforcement, and if something breaks, use dmesg to obtain a report +from the kernel regarding why and then relax that particular protection. +Even this is not generally needed on a Gentoo system because the ebuilds +should set the correct flags for you via the pax-util.eclass. If you find +that you have to set your own flags, we would ask that you file a bug report. +
+ ++Generally setting the PaX flags is straightforward, but the user should keep +a few things in mind: +
+ ++1) One can set either PT_PAX and/or XATTR_PAX flags on the ELF object +independently of one another. Similarly, the kernel can be configured +to read either, both or neither fields. It is up to you to make sure that +you set the flags in the field being used by the kernel to get the desired +results. For example, if you have PT_PAX="Pe---" while XATTR_PAX missing on +the object, but the kernel is configured only to use XATTR_PAX, you may not +get the desired result! +
+ ++2) The recommended approach is to mark both PT_PAX and XATTR_PAX fields +identically on the objects whenever possible, and set the kernel to read only +XATTR_PAX. The "whenever possible" is where things get complicated and the +two fields may not wind up containing the same flags. If the ELF does not +contain a PAX_FLAGS program header, PT_PAX marking will fail. However, the +absence of this program header will not affect XATTR_PAX markings. If the ELF +is busy (ie. there is a running process making use of the ELF's text), then +one can read the PT_PAX flags but not set them. Again, this does not affect +setting or getting XATTR_PAX flags. On the other hand, if you are using any file +systems which do not support extended attributes, then XATTR_PAX marking will fail +on those file systems while PT_PAX marking is uneffected, except as already stated. +This can be fairly subtle because copying a file from a file system with xattrs +to one without, and then back again will drop the XATTR_PAX flags. Or tarring +with an older version of tar which does not preserve xattrs will again drop our +flags. +
+ ++3) The PaX flags are only enforced when a process is loaded from an ELF executable. +This executable in turn usually links dynamically against shared objects in memory. +Using `cat /proc/<pid>/status | grep PaX` gives you the resulting +PaX enforcement on the running process with PID=<pid>. But since the +executable and shared objects can have different flags, the question arises, which +ones are used to determine the final running PaX enforcements? The answer is the +executable for reasons of control and security. If the libraries were to set the +runtime PaX enforcement, then which of the libraries would "win" if an executable +linked against many? And one overly relaxed library could relax the privileges on +many executables that link against it. Eg. Relaxing all PaX protection on glibc +would effectively turn PaX off on one's system. Nonetheless, it may be the code +in the library itself that needs the relaxation of some PaX enforcement. In that +case, one has to "back port" the flags from the library to the executable that +uses it. +
+ ++Below we describe the utilities provided on a Gentoo system for working PaX markings. +There are several since as PaX evolved, new features were needed. Each one emphasizes +a different need with respect to the above caveats. +
+ +1. paxctl
++This is the traditional upstream package for setting PaX flags. It is limited only +in that it sets PT_PAX only, not XATTR_PAX. It is provided by emerging sys-apps/paxctl. +It does have one functionality that no other utility has: it can either create a PAX_FLAGS +program header or convert a GNU_STACK to PAX_FLAGS. Both of these are not recommended +since they can break the ELF under certain circumstances. However, in the extreme +case that you cannot use XATTR_PAX (eg. you can't use file systems that support extended +attributes) and you are dealing with an ELF object that wasn't build with a PAX_FLAGS +program header, then these options are available to you via this utility.
-
-Luckily there is a utility to toggle protections on a per-executable basis,
-
+PaX control v0.7 +Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu> + usage: paxctl <options> <files> options: - -p: disable PAGEEXEC -P: enable PAGEEXEC - -e: disable EMUTRMAP -E: enable EMUTRMAP - -m: disable MPROTECT -M: enable MPROTECT - -r: disable RANDMMAP -R: enable RANDMMAP - -x: disable RANDEXEC -X: enable RANDEXEC - -s: disable SEGMEXEC -S: enable SEGMEXEC + -p: disable PAGEEXEC -P: enable PAGEEXEC + -e: disable EMUTRAMP -E: enable EMUTRAMP + -m: disable MPROTECT -M: enable MPROTECT + -r: disable RANDMMAP -R: enable RANDMMAP + -x: disable RANDEXEC -X: enable RANDEXEC + -s: disable SEGMEXEC -S: enable SEGMEXEC + + -v: view flags -z: restore default flags + -q: suppress error messages -Q: report flags in short format + -c: convert PT_GNU_STACK into PT_PAX_FLAGS (see manpage!) + -C: create PT_PAX_FLAGS (see manpage!) +- -v: view flags -z: restore default flags - -q: suppress error messages -Q: report flags in short format flags +
+Note that paxctl also reports on an older PaX protection called RANDEXEC. +This is now deprecated --- the randomization of the base address of a processes +now simply part of ASLR on all executables build ET_DYN rather than EX_EXEC. +Here is paxctl in action: +
+ ++# paxctl -v /usr/bin/python3.2 +PaX control v0.7 +Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu> + +- PaX flags: -----m-x-e-- [/usr/bin/python3.2] + MPROTECT is disabled + RANDEXEC is disabled + EMUTRAMP is disabled + +# paxctl -P /usr/bin/python3.2 +# paxctl -v /usr/bin/python3.2 +PaX control v0.7 +Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu> + +- PaX flags: P----m-x-e-- [/usr/bin/python3.2] + PAGEEXEC is enabled <--- Note: this added to the earlier flags, it didn't overwrite them. + MPROTECT is disabled + RANDEXEC is disabled + EMUTRAMP is disabled+
2. getfattr setfattr
-The first option we will note is
-shell user # paxctl -v /usr/bin/Xorg -PaX control v0.2 -Copyright 2004 PaX Team <pageexec@freemail.hu> ++The following is an example of their usage for XATTR_PAX: +
+ ++# getfattr -n user.pax.flags /usr/bin/python3.2 +getfattr: Removing leading '/' from absolute path names +# file: usr/bin/python3.2 +user.pax.flags="em" + +# setfattr -n user.pax.flags -v P /usr/bin/python3.2 +# getfattr -n user.pax.flags /usr/bin/python3.2 +getfattr: Removing leading '/' from absolute path names +# file: usr/bin/python3.2 +user.pax.flags="P" <--- Note: this overwrote the earlier flags, it didn't add to them. + +# setfattr -n user.pax.flags -v "Hi Mom, wish you were here." /usr/bin/python3.2 +# getfattr -n user.pax.flags /usr/bin/python3.2 +getfattr: Removing leading '/' from absolute path names +# file: usr/bin/python3.2 +user.pax.flags="Hi Mom, wish you were here." <--- Mom appreciates it, but PaX does not. There is no sanity checking. ++ + +3. paxctl-ng
++paxctl-ng is the new swiss army knife of working with PT_PAX an XATTR_PAX +markings. It can be built with support for just one or the other or both +types of markings. When built with support for both, it can copy PT_PAX +to XATTRP_PAX fields or vice versa, to make sure you have consistency. +In sum, it can do everything paxctl and set/getfattr can do, except it +will not try to create or convert a PAX_FLAGS program header. This is +discouraged and should only be use in the corner case mentioned above. +Here is a synopsis of its usage: +
+ ++Package Name : elfix 0.7.1 +Bug Reports : http://bugs.gentoo.org/ +Program Name : paxctl-ng +Description : Get or set pax flags on an ELF object + +Usage : paxctl-ng -PpEeMmRrSsv ELF | -Zv ELF | -zv ELF + : paxctl-ng -Cv ELF | -cv ELF | -dv ELF + : paxctl-ng -Fv ELF | -fv ELF + : paxctl-ng -Lv ELF | -lv ELF + : paxctl-ng -v ELF | -h + +Options : -P enable PAGEEXEC -p disable PAGEEXEC + : -E enable EMUTRAMP -e disable EMUTRAMP + : -M enable MPROTECT -m disable MPROTECT + : -R enable RANDMMAP -r disable RANDMMAP + : -S enable SEGMEXEC -s disable SEGMEXEC + : -Z all secure settings -z all default settings + : + : -C create XATTR_PAX with most secure setting + : -c create XATTR_PAX all default settings + : -F copy PT_PAX to XATTR_PAX + : -f copy XATTR_PAX to PT_PAX + : -L set only PT_PAX flags + : -l set only XATTR_PAX flags + : + : -v view the flags, along with any accompanying operation + : -h print out this help -- PaX flags: -p-sM--x-eR- [/usr/bin/Xorg] - PAGEEXEC is disabled - SEGMEXEC is disabled - MPROTECT is enabled - RANDEXEC is disabled - EMUTRAMP is disabled - RANDMMAP is enabled +Note : If both enabling and disabling flags are set, the default - is used-This shows an XFree binary with all protections disabled. +The following is an example of paxctl-ng in action:
++# paxctl-ng -v /usr/bin/python3.2 <--- View both PT_PAX and XATTR_PAX fields (-v) +/usr/bin/python3.2: + PT_PAX : Pem-- + XATTR_PAX: Pem-- + +# paxctl-ng -lPpv /usr/bin/python3.2 <--- Set default '-' for PAGEEXEC (-Pp) +/usr/bin/python3.2: <--- For XATTR_FLAGS only (-l) + PT_PAX : Pem-- <--- And report the result (-v) + XATTR_PAX: -em-- + +# paxctl-ng -dv /usr/bin/python3.2 <--- Delete the XATTR_PAX field altogether (-d) +/usr/bin/python3.2: <--- And report the result (-v) + PT_PAX : Pem-- + XATTR_PAX: not found + +# paxctl-ng -lemv /usr/bin/python3.2 <--- Set "em" flags (-em) +/usr/bin/python3.2: <--- For XATTR_FLAGS only (-l) + PT_PAX : Pem-- <--- And report the result (-v) + XATTR_PAX: -em-- + +# paxctl-ng -fv /usr/bin/python3.2 <--- Copy the XATTR_PAX to PT_PAX flags, overwriting the latter (-f) +/usr/bin/python3.2: <--- And report the result (-v) + PT_PAX : -em-- + XATTR_PAX: -em-- + +# paxctl-ng -d /usr/bin/python3.2 <--- Silently delete the XATTR_PAX field (-d but no -v) +# paxctl-ng -v /usr/bin/python3.2 <--- View both PT_PAX and XATTR_PAX fields (-v) +/usr/bin/python3.2: + PT_PAX : -em-- + XATTR_PAX: not found ++ +4.Python module, pax.so, and a simple Python frontend, pypaxctl.
-To set flags on a binary, the
+We also provide bindings to python via a module, pax.so, which is installed +by emerging dev-python/pypax. This package is a dependency of sys-apps/elfix +since the both revdep-pax and migrate-pax import it. It can be compiled with +either PT_PAX and/or XATTR_PAX support, like paxctl-ng, but it is not as featureful +since its scope is limited to just the needs of revdep-pax and migrate-pax. This +may change in the future if there is a need to better integrate PaX marking with +portage which is written in python. + + +-z flag is useful as it restores the -default flags. -+Currently pax.so publicly exports the following: +
+
+pypaxctl is a simple front end to pax.so which just gets and sets the PaX flags using +the same logic. When getting the flags, if both PT_PAX and XATTR_PAX are present, +the latter will override the former. When setting, it will set both fields whenever +possible. Here it is in action: +
+ ++# pypaxctl -g /usr/bin/python3.2 <--- Retrieve either PT_PAX or XATTR_PAX. The latter has priority if it exists. +-em-- <--- The canonical order is PEMRS. +# paxctl-ng -v /usr/bin/python3.2 <--- It turns out that XATTR_PAX didn't exist, so we got PT_PAX. +/usr/bin/python3.2: + PT_PAX: -em-- + XT_PAX: not found + +# paxctl-ng -lPMEv /usr/bin/python3.2 <--- Set some XATTR_PAX flags. +/usr/bin/python3.2: + PT_PAX: -em-- + XT_PAX: PEM-- + +# pypaxctl -g /usr/bin/python3.2 <--- Now its reporting XATTR_PAX flags! +PEM-- +# pypaxctl -s me /usr/bin/python3.2 <--- Set "me" on both PT_PAX and XATTR_PAX. +# paxctl-ng -v /usr/bin/python3.2 +/usr/bin/python3.2: + PT_PAX: -em-- <--- Like paxctl and paxctl-ng, we don't overwrite flags, just add. + XT_PAX: Pem-- + +# pypaxctl -s Pp /usr/bin/python3.2 <--- But what if we want PAGEEXEC off? Then set Pp for the default '-'. +# paxctl-ng -v /usr/bin/python3.2 +/usr/bin/python3.2: + PT_PAX: -em-- + XT_PAX: -em-- +
-To disable protections on Xorg, run
-
+# paxctl-ng -v /usr/bin/python3.2 +/usr/bin/python3.2: + PT_PAX: -em-- + XT_PAX: PEM-- + +# pypaxctl -g /usr/bin/python3.2 +-em-- +# pypaxctl -s p /usr/bin/python3.2 +# paxctl-ng -v /usr/bin/python3.2 +/usr/bin/python3.2: + PT_PAX: pem-- + XT_PAX: PEM-- + +# pypaxctl -s PpEem /usr/bin/python3.2 +# paxctl-ng -v /usr/bin/python3.2 +/usr/bin/python3.2: + PT_PAX: --m-- + XT_PAX: PEM-- ++ +
5. revdep-pax
-Play around with disabling/enabling protections to see what is the least needed -to run. Often we find that we need the -m -sp combos. +This utility is used to map out the linkings between all the ELF objects on your +system and their shared objects in both directions. It can then search for PaX +flag markings that are mismatched between the shared objects than the executables; +and optionally, allows the user to migrate the markings forwards or backwards on a per +ELF object basis. Here's a synopsis of its usage: +
+ ++Package Name : elfix +Bug Reports : http://bugs.gentoo.org/ +Program Name : revdep-pax +Description : Get or set pax flags on an ELF object + +Usage : revdep-pax -f [-v] print out all forward mappings for all system binaries + : revdep-pax -r [-ve] print out all reverse mappings for all system sonames + : revdep-pax -b OBJECT [-myv] print all forward mappings only for OBJECT + : revdep-pax -s SONAME [-myve] print all reverse mappings only for SONAME + : revdep-pax -l LIBRARY [-myve] print all reverse mappings only for LIBRARY file + : revdep-pax [-h] print out this help + : -v verbose, otherwise just print mismatching objects + : -e only print out executables in shell $PATH + : -m don't just report, but mark the mismatching objects + : -y assume "yes" to all prompts for marking (USE CAREFULLY!) ++ +
+Here's revdep-pax in action. Since the out is long, we've replaced some +of it with ellipses:
++# revdep-pax -f < --- Report all mismatching forward linkings. + ..... +/usr/bin/python3.2 ( --m-- ) + + libpython3.2.so.1.0 /usr/lib64/libpython3.2.so.1.0 ( -e--- ) + libpthread.so.0 /lib64/libpthread-2.16.so ( -e--- ) + libc.so.6 /lib64/libc-2.16.so ( -e--- ) + libdl.so.2 /lib64/libdl-2.16.so ( -e--- ) + libutil.so.1 /lib64/libutil-2.16.so ( -e--- ) + libm.so.6 /lib64/libm-2.16.so ( -e--- ) + ..... + +# revdep-pax -m -b /usr/bin/python3.2 < --- Forward port PaX flags for python3.2 only. +/usr/bin/python3.2 (--m--) + + libpython3.2.so.1.0 /usr/lib64/libpython3.2.so.1.0 ( -e--- ) + libpthread.so.0 /lib64/libpthread-2.16.so ( -e--- ) + libc.so.6 /lib64/libc-2.16.so ( -e--- ) + libdl.so.2 /lib64/libdl-2.16.so ( -e--- ) + libutil.so.1 /lib64/libutil-2.16.so ( -e--- ) + libm.so.6 /lib64/libm-2.16.so ( -e--- ) + + Will mark libraries with --m-- + + Set flags for /usr/lib64/libpython3.2.so.1.0 (y/n): n < --- You will be prompted unless you give -y. + Set flags for /lib64/libpthread-2.16.so (y/n): n < --- We'll say 'n' to each for this demo. + Set flags for /lib64/libc-2.16.so (y/n): n + Set flags for /lib64/libdl-2.16.so (y/n): n + Set flags for /lib64/libutil-2.16.so (y/n): n + Set flags for /lib64/libm-2.16.so (y/n): n + +# revdep-pax -r < --- Report all mismatching reverse linkings. + ..... +libpython3.2.so.1.0 /usr/lib64/libpython3.2.so.1.0 ( -e--- ) < --- The format is soname /path/to/its/elf_object (flags). + + /usr/bin/python3.2 ( --m-- ) < --- There is a mismatch here as expected + ..... from the previous step. + +# revdep-pax -m -s libpython3.2.so.1.0 < --- Let's migrate from the library's flags to the +libpython3.2.so.1.0 /usr/lib64/libpython3.2.so.1.0 (-e---) executable using the soname (-s). We could also have used + /usr/lib64/libpython3.2.so.1.0 with the -l flag. + /usr/bin/python3.2 ( --m-- ) + + Will mark binaries with -e--- + + Set flags for /usr/bin/python3.2 (y/n): y < --- Confirm 'y' we want to do this. + + /usr/bin/python3.2 ( -em-- ) + +# paxctl-ng -v /usr/bin/python3.2 < --- Double check. +/usr/bin/python3.2: + PT_PAX: -em-- + XT_PAX: -em-- ++ +
+One final note about revdep-pax's internals. It currently uses a "mixed" approach to +finding all the ELF objects on a system and their shared objects. To get the list of +objects it uses Gentoo's portage database at /var/db/pkg, but to get the linkings, it uses +/usr/bin/ldd which is a bash script wrapper to `LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2` +on glibc, and its own program on uclibc. We are working towards two separate approaches: +1) The future revdep-pax will use /var/db/pkg for both the list of ELF objects and +their linkings to shared objects. This will be a lot faster than the current utility. +2) There will be a revdep-pax-ng which will not assume a Gentoo system, but rather +construct a list ELF objects collected from a combined $PATH for the executables and +/etc/ld.so.conf for the shared objects. This utility will work on non-Gentoo systems +and be more exhaustive than revdep-pax, but much slower. Here -ng stands for Not Gentoo. +
+ +6. migrate-pax
++At this point you're probably fed up with dealing with both PT_PAX and XATTR_PAX +fields and their relationship to the kernel's configuration, and you just want to +drop the older PT_PAX and get on with life! migrate-pax does only that ... it +will go through all ELF objects on your system and migrate the PT_PAX field to +XATTR_PAX. That's it. +
++Package Name : elfix +Bug Reports : http://bugs.gentoo.org/ +Program Name : migrate +Description : Migrate PT_PAX to XATTR_PAX Flags on all system ELF objects + +Usage : migrate -v print out all system ELF objects + : migrate -m [-v] migrate flags on all system ELF objects + : migrate -d [-v] delete XATTR_PAX on all system ELF objects + : migrate [-h] print out this help + : -v be verbose when migrating ++