Commit Graph

52 Commits

Author SHA1 Message Date
Mike Hommey
0e0c6496e4 Bug 1470701 - Use run-time page size when changing mapping permissions in elfhack injected code. r=froydnj
When a binary has a PT_GNU_RELRO segment, the elfhack injected code
uses mprotect to add the writable flag to relocated pages before
applying relocations, removing it afterwards. To do so, the elfhack
program uses the location and size of the PT_GNU_RELRO segment, and
adjusts it to be aligned according to the PT_LOAD alignment.

The problem here is that the PT_LOAD alignment doesn't necessarily match
the actual page alignment, and the resulting mprotect may end up not
covering the full extent of what the dynamic linker has protected
read-only according to the PT_GNU_RELRO segment. In turn, this can lead
to a crash on startup when trying to apply relocations to the still
read-only locations.

Practically speaking, this doesn't end up being a problem on x86, where
the PT_LOAD alignment is usually 4096, which happens to be the page
size, but on Debian armhf, it is 64k, while the run time page size can be
4k.
2018-06-24 09:02:38 +09:00
Mike Hommey
83f6c6295f Bug 1440037 - Add support for R_X86_64_PLT32 relocations in elfhack. r=froydnj 2018-02-22 07:15:23 +09:00
Jean-Luc Bonnafoux
af40c367ad Bug 1428629 - elfhack.cpp prefer prefix ++ operator for non primitive types r=froydnj
MozReview-Commit-ID: C0L2NUsbmc4
2018-01-08 09:30:32 +01:00
Mike Hommey
3a59e2eb56 Bug 1423813 - Properly handle elfhack -r after bug 1385783. r=froydnj
Bug 1385783 changed things such that the two elfhack sections are not
adjacent anymore. They can even be in different segments in some cases,
but the undo code doesn't know how to actually handle that case.

So for now, allow non adjacent sections, but still verify that they are
in the same segment.
2017-12-07 15:22:22 +09:00
Mike Hommey
ce1ab2fa9c Bug 1401005 - Handle the case where the relocation addend is not found at the relocation location. r=froydnj 2017-09-21 11:37:30 +09:00
Eugen Sawin
71d61acfcb Bug 1388893 - [1.0] Abort code insertion if executable section was not found. r=glandium 2017-08-15 13:58:41 +02:00
Mike Hommey
5061636ace Bug 1388713 - Change how elfhack looks for the bss section. r=froydnj
In bug 635961, elfhack was made to (ab)use the bss section as a
temporary space for a pointer. To find it, it scanned writable PT_LOAD
segments to find one that has a different file and memory size,
indicating the presence of .bss. This usually works fine, but when
the binary is linked with lld and relro is enabled, the end of the
file-backed part of the PT_LOAD segment containing the .bss section
ends up in the RELRO segment, making that location read-only and
subsequently making the elfhacked binary crash when it tries to restore
the .bss to a clean state, because it's not actually writing in the .bss
section: lld page aligns it after the RELRO segment.

So instead of scanning PT_LOAD segments, we scan for SHT_NOBITS
sections that are not SHF_TLS (i.e. not .tbss).
2017-08-10 07:55:55 +09:00
Mike Hommey
4dd5c54a20 Bug 1385783 - Insert the elfhack code before the first executable section. r=froydnj
The lld linker creates separate segments for purely executable sections
(such as .text) and sections preceding those (such as .rel.dyn). Neither
gold nor bfd ld do that, and just put all those sections in the same
executable segment.

Since elfhack is putting its executable code between the two relocation
sections, it ends up in a non-executable segment, leading to a crash
when it's time to run that code.

We thus insert the elfhack code before the first executable section
instead of between the two relocation sections (which is where the
elfhack data lies, and stays).
2017-08-02 16:39:12 +09:00
Mike Hommey
b09d245c16 Bug 1385783 - Don't assume both elfhack sections are next to each other. r=froydnj 2017-08-02 16:05:07 +09:00
Cameron McCormack
eb38b43907 Bug 1385537 - Check for writable segments correctly. r=glandium
MozReview-Commit-ID: FItpvVeiMJM
2017-07-29 13:56:25 +08:00
Mike Hommey
c0b84a749c Bug 635961 - Allow elfhack to relocate data under the GNU_RELRO segment. r=froydnj 2017-07-11 07:41:07 +09:00
Wes Kocher
cc389365c2 Backed out 2 changesets (bug 635961) at developer's request a=backout
Backed out changeset c56fa9c1eda0 (bug 635961)
Backed out changeset ddda63d5366e (bug 635961)

MozReview-Commit-ID: I6NxBctFn8e
2017-07-25 17:57:43 -07:00
Mike Hommey
63f270d06d Bug 1378986 - Avoid crashing in elfhack when the input file has no relocations. r=me a=bustage
MozReview-Commit-ID: 8jXvB8iRJkC
2017-07-25 15:50:34 -07:00
Mike Hommey
870d2795e2 Bug 635961 - Allow elfhack to relocate data under the GNU_RELRO segment. r=froydnj 2017-07-11 07:41:07 +09:00
Mike Hommey
8d189d4ddd Bug 1378986 - Avoid elfhack failing on weird DT_INIT_ARRAYs. r=froydnj
Somehow, with the Android toolchain, we end up with
non-empty-but-really-empty DT_INIT_ARRAYs.

In practical terms, they are arrays with no relocations, and content
that is meaningless:

  $ objdump -s -j .init_array libnss3.so

  libnss3.so:     file format elf32-little

  Contents of section .init_array:
   1086e0 00000000                             ....

  $ readelf -r libnss3.so | grep 1086e0

  $ objdump -s -j .init_array libplugin-container-pie.so

  libplugin-container-pie.so:     file format elf32-little

  Contents of section .init_array:
   4479c ffffffff 00000000 ffffffff 00000000  ................

  $ readelf -r libplugin-container-pie.so | grep 4479c

Because so far, elfhack expected meaningful DT_INIT_ARRAYs, it bailed out
early in that case.
2017-07-07 14:44:46 +09:00
Mike Hommey
b218c7ae91 Bug 982014 - Fix what sections are copied from injection object after bug 932737. r=nfroyd 2014-04-04 14:56:36 +09:00
Mike Hommey
eb31d1db37 Bug 940250 - Fix elfhack -r after bug 822584. r=nfroyd 2013-11-21 17:27:30 +09:00
Birunthan Mohanathas
c3c0be5691 Bug 784739 - Switch from NULL to nullptr in build/; r=ehsan 2013-11-11 14:13:38 -05:00
Mike Hommey
cb01e14b48 Bug 932737 - Change elfhack such that it doesn't require two injection objects. r=nfroyd 2013-11-02 08:47:24 +09:00
Mike Hommey
a92de2ca33 Bug 898998 - Turn BL into BLX when doing thumb call relocations and the target is ARM. r=nfroyd 2013-07-30 08:57:28 +09:00
Mike Hommey
86aa4f1773 Bug 892366 - Support R_ARM_CALL relocations in elfhack. r=nfroyd 2013-07-23 07:26:06 +09:00
Mike Hommey
08e7b0b9b7 Bug 892366 - Support R_ARM_JUMP24 relocations in elfhack. r=nfroyd 2013-07-12 09:14:20 +09:00
Mike Hommey
51f42ab769 Bug 851002 - Adjust Elf headers before adding filler segment in elfhack. r=nfroyd 2013-03-17 08:03:06 +01:00
Mike Hommey
943edeb1af Bug 822584 - Workaround in elfhack to accomodate for breakpad not handling the memory mapping induced by the elfhack/bionic linker combination. r=nfroyd 2013-01-02 10:17:32 +01:00
Mike Hommey
7c56034a36 Bug 816494 part 4 - Add a -r option to elfhack that re-merges the split PT_LOADs. r=nfroyd
Sections are positioned accordingly, which means the resulting ELF binary will
have a big gap full of zero between .rel.plt and .plt.
2012-12-10 10:33:08 +01:00
Mike Hommey
8b12e9c04c Bug 816494 part 3 - Allocate Elf instance on stack in do_file(). r=nfroyd 2012-12-10 10:33:08 +01:00
Mike Hommey
082d88f5c0 Bug 816494 part 2 - Move the PT_LOAD splitting logic in elfhack.cpp. r=nfroyd
Also, section offsets are not adjusted until the split is done.
2012-12-10 10:33:08 +01:00
Mike Hommey
f95e39436b Bug 716295 part 5 - Add support for R_ARM_THM_CALL relocations. r=nfroyd 2012-08-09 16:34:25 +02:00
Mike Hommey
aa4e4df82a Bug 716295 part 4 - Interpose elfhack injected code in DT_INIT_ARRAY's first entry when possible. r=nfroyd 2012-08-09 16:34:25 +02:00
Mike Hommey
7d483a00eb Bug 716295 part 1 - Fail more gracefully when .dynamic section can't be grown. r=nfroyd 2012-08-09 16:34:24 +02:00
Mike Hommey
b91135d7e4 Bug 771569 - Move elfhack sections before .rel{,a}.dyn to work around glibc 2.16 bug. r=nfroyd 2012-07-09 17:53:35 +02:00
Ed Morley
2e9d9c9c59 Backout 61038a15b7b7 (bug 771569) for elfhack errors 2012-07-09 15:14:18 +01:00
Mike Hommey
288e7d9c60 Bug 771569 - Move elfhack sections before .rel{,a}.dyn to work around glibc 2.16 bug. r=nfroyd 2012-07-09 15:47:24 +02:00
Gervase Markham
cb6a072c2a Bug 716478 - update licence to MPL 2. 2012-05-21 12:12:37 +01:00
Mike Hommey
558f594ea4 Bug 734237 - Make elfhack skip ELF files that aren't shared objects. r=tglek 2012-03-13 09:47:03 +01:00
Mike Hommey
21a0f2d6a4 Bug 725284 - Preserve PT_LOAD alignment, except when it's the default on x86-64. r=tglek 2012-02-21 08:08:41 +01:00
Rafael Ávila de Espíndola
f11fc0eea5 Bug 678008 - Fix elfhack build in c++0x mode. r=mh+mozilla
In c++0x it is not valid to use a negative number in a unsigned
position in an initializer list. Add explicit casts and change
the size method to return an unsigned int.
2011-08-17 10:12:46 -04:00
Mike Hommey
39c56ade70 Bug 671188 - Don't fail on R_*_NONE relocations with an empty r_offset. r=tglek 2011-07-15 10:15:28 +02:00
Mike Hommey
9053e919c2 Bug 651892 part 3 - Remove __cxa_pure_virtual relocations. r=tglek 2011-06-23 04:08:03 +02:00
Mike Hommey
d0d08e1e9d Bug 651892 part 1 - Add a helper function to lookup symbols in a ElfSymtab_Section. r=tglek 2011-06-23 04:07:30 +02:00
Mike Hommey
d210dad39a Bug 637341 - Don't try to do anything on binaries that have already been elfhacked. r=tglek 2011-03-14 14:41:41 +01:00
Mike Hommey
678159caab Bug 632920 part 2 - Add support for R_ARM_THM_JUMP24 relocation in elfhack. r=tglek,a=bsmedberg 2011-02-16 17:27:35 +01:00
Mike Hommey
a41020f9a3 Bug 632920 part 1 - Refactor relocations application to avoid error-prone duplication of code in elfhack. r=tglek,a=bsmedberg 2011-02-16 17:25:51 +01:00
Mike Hommey
b5d55531a2 Bug 629635 part 5 - Gracefully abort elfhack when injected code+data is bigger than original relocation section. r=tglek,a=blocking2.0:final 2011-02-12 10:28:34 +01:00
Mike Hommey
1af1ff2225 Bug 629635 part 3 - Add ElfSegment::getOffset and ElfSegment::getAddr functions. r=tglek,a=blocking2.0:final 2011-02-12 10:28:34 +01:00
Mike Hommey
05a7564b8a Bug 628988 part 2 - Adapt symbol tables content to elfhack changes. r=tglek,a=sdwilsh 2011-01-28 09:22:58 +01:00
Mike Hommey
1c1302302d Bug 628232 part 1 - Use the init symbol from elfhack injected code as an entry point instead of hardcoding 0. r=tglek,a=sdwilsh 2011-01-28 09:22:58 +01:00
Mike Hommey
76a85c56b6 Bug 628627 part 1 - Raise hard errors in some more cases in elfhack. r=tglek,a=sdwilsh 2011-01-28 09:22:58 +01:00
Mike Hommey
75f3f59209 Bug 628618 part 6 - Delay refreshing of ElfSection addresses and offsets. r=tglek,a=sdwilsh 2011-01-28 09:22:58 +01:00
Mike Hommey
a1a52c7d80 Bug 628618 part 5 - Don't set DT_REL*COUNT if it wasn't already set. r=tglek,a=sdwilsh 2011-01-28 09:22:58 +01:00