Flexible I/O Tester development
 help / color / mirror / Atom feed
* hardening fio build with PIE for Address Space Layout Randomization and bindnow linking
@ 2016-05-24 10:10 Martin Steigerwald
  2016-05-24 14:17 ` Jens Axboe
  0 siblings, 1 reply; 3+ messages in thread
From: Martin Steigerwald @ 2016-05-24 10:10 UTC (permalink / raw)
  To: fio; +Cc: Jens Axboe

Hello Jens!

In my attempt to harden the fio build as recommended within Debian, I tried to 
build it with PIE by using Debian´s own mechanism via dpkg-buildflags. And I 
got:

    CC diskutil.o
    CC fifo.o
    CC blktrace.o
    CC cgroup.o
    CC trim.o
    CC engines/sg.o
    CC engines/binject.o
    CC oslib/linux-dev-lookup.o
    CC fio.o
  LINK fio
/usr/bin/ld: crc/crc16.o: relocation R_X86_64_32S against `crc16_table' can 
not be used when making a shared object; recompile with -fPIC
crc/crc16.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:399: recipe for target 'fio' failed
make[1]: *** [fio] Error 1
make[1]: Leaving directory '/home/ms/Debian/fio/pkg-fio'
dh_auto_build: make -j1 returned exit code 2
debian/rules:17: recipe for target 'build' failed
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2


Yet, building fio 2.10 from upstream does doesn´t produce a shared object 
file.

Any idea?




I: fio: hardening-no-pie usr/bin/fio
N: 
N:    This package provides an ELF executable that was not compiled as a
N:    position independent executable (PIE).
N:    
N:    PIE is required for fully enabling Address Space Layout Randomization
N:    (ASLR), which makes "Return-oriented" attacks more difficult.
N:    
N:    Historically, PIE has been associated with noticeable performance
N:    overhead on i386. However, GCC-5 has implemented an optimization that
N:    can reduce the overhead significantly.
N:    
N:    If you use dpkg-buildflags, you may have to add hardening=+pie or
N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
N:    
N:    The relevant compiler flags must be passed both to the compiler and the
N:    linker (e.g. for C that would be commonly be CFLAGS and LDFLAGS).
N:    
N:    CAVEAT: Please keep in mind that the PIE flag (-fPIE) is not suitable
N:    for all cases:
N:    
N:     * It is <not> compatible with -fPIC which required for
N:       compiling shared libraries.
N:     * It is unlikely to work when compiling static libraries or
N:       executables (gcc -static).
N:    
N:    If your upstream build compiles either of the above, you may have to
N:    patch the build to ensure that only ELF executables are compiled with
N:    PIE.
N:    
N:    Refer to https://wiki.debian.org/Hardening,
N:    https://gcc.gnu.org/gcc-5/changes.html, and
N:    https://software.intel.com/en-us/blogs/2014/12/26/new-optimizations-for-x86-in-upcoming-gcc-50-32bit-pic-mode
N:    for details.
N:    
N:    Severity: wishlist, Certainty: certain
N:    
N:    Check: binaries, Type: binary, udeb
N: 
I: fio: hardening-no-pie usr/bin/fio-btrace2fio
I: fio: hardening-no-pie usr/bin/fio-dedupe
I: fio: hardening-no-pie usr/bin/fio-genzipf


Another option to harden fio works find and that is:

I: fio: hardening-no-bindnow usr/bin/fio
N: 
N:    This package provides an ELF binary that lacks the "bindnow" linker
N:    flag.
N:    
N:    If the ELF binary does not rely on late binding of symbols (e.g. weak
N:    symbols), then please consider enabling this feature. Otherwise, please
N:    consider overriding the tag (possibly with a comment about why).
N:    
N:    If you use dpkg-buildflags, you may have to add hardening=+bindnow or
N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
N:    
N:    The relevant compiler flags are set in LDFLAGS.
N:    
N:    Refer to https://wiki.debian.org/Hardening for details.
N:    
N:    Severity: wishlist, Certainty: certain
N:    
N:    Check: binaries, Type: binary, udeb
N: 
I: fio: hardening-no-pie usr/bin/fio-btrace2fio
I: fio: hardening-no-bindnow usr/bin/fio-btrace2fio
I: fio: hardening-no-pie usr/bin/fio-dedupe
I: fio: hardening-no-bindnow usr/bin/fio-dedupe
I: fio: hardening-no-pie usr/bin/fio-genzipf
I: fio: hardening-no-bindnow usr/bin/fio-genzipf


Maybe it would be nice to have some of these in upstream build? PIE may not 
yet be advisable as for GCC 5 requirement.

Thanks,


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: hardening fio build with PIE for Address Space Layout Randomization and bindnow linking
  2016-05-24 10:10 hardening fio build with PIE for Address Space Layout Randomization and bindnow linking Martin Steigerwald
@ 2016-05-24 14:17 ` Jens Axboe
  2016-05-25  8:47   ` Martin Steigerwald
  0 siblings, 1 reply; 3+ messages in thread
From: Jens Axboe @ 2016-05-24 14:17 UTC (permalink / raw)
  To: Martin Steigerwald, fio

On 05/24/2016 04:10 AM, Martin Steigerwald wrote:
> Hello Jens!
>
> In my attempt to harden the fio build as recommended within Debian, I tried to
> build it with PIE by using Debian�s own mechanism via dpkg-buildflags. And I
> got:
>
>      CC diskutil.o
>      CC fifo.o
>      CC blktrace.o
>      CC cgroup.o
>      CC trim.o
>      CC engines/sg.o
>      CC engines/binject.o
>      CC oslib/linux-dev-lookup.o
>      CC fio.o
>    LINK fio
> /usr/bin/ld: crc/crc16.o: relocation R_X86_64_32S against `crc16_table' can
> not be used when making a shared object; recompile with -fPIC
> crc/crc16.o: error adding symbols: Bad value
> collect2: error: ld returned 1 exit status
> Makefile:399: recipe for target 'fio' failed
> make[1]: *** [fio] Error 1
> make[1]: Leaving directory '/home/ms/Debian/fio/pkg-fio'
> dh_auto_build: make -j1 returned exit code 2
> debian/rules:17: recipe for target 'build' failed
> make: *** [build] Error 2
> dpkg-buildpackage: error: debian/rules build gave error exit status 2
>
>
> Yet, building fio 2.10 from upstream does doesn�t produce a shared object
> file.
>
> Any idea?
>
>
>
>
> I: fio: hardening-no-pie usr/bin/fio
> N:
> N:    This package provides an ELF executable that was not compiled as a
> N:    position independent executable (PIE).
> N:
> N:    PIE is required for fully enabling Address Space Layout Randomization
> N:    (ASLR), which makes "Return-oriented" attacks more difficult.
> N:
> N:    Historically, PIE has been associated with noticeable performance
> N:    overhead on i386. However, GCC-5 has implemented an optimization that
> N:    can reduce the overhead significantly.
> N:
> N:    If you use dpkg-buildflags, you may have to add hardening=+pie or
> N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
> N:
> N:    The relevant compiler flags must be passed both to the compiler and the
> N:    linker (e.g. for C that would be commonly be CFLAGS and LDFLAGS).
> N:
> N:    CAVEAT: Please keep in mind that the PIE flag (-fPIE) is not suitable
> N:    for all cases:
> N:
> N:     * It is <not> compatible with -fPIC which required for
> N:       compiling shared libraries.
> N:     * It is unlikely to work when compiling static libraries or
> N:       executables (gcc -static).
> N:
> N:    If your upstream build compiles either of the above, you may have to
> N:    patch the build to ensure that only ELF executables are compiled with
> N:    PIE.
> N:
> N:    Refer to https://wiki.debian.org/Hardening,
> N:    https://gcc.gnu.org/gcc-5/changes.html, and
> N:    https://software.intel.com/en-us/blogs/2014/12/26/new-optimizations-for-x86-in-upcoming-gcc-50-32bit-pic-mode
> N:    for details.
> N:
> N:    Severity: wishlist, Certainty: certain
> N:
> N:    Check: binaries, Type: binary, udeb
> N:
> I: fio: hardening-no-pie usr/bin/fio-btrace2fio
> I: fio: hardening-no-pie usr/bin/fio-dedupe
> I: fio: hardening-no-pie usr/bin/fio-genzipf
>
>
> Another option to harden fio works find and that is:
>
> I: fio: hardening-no-bindnow usr/bin/fio
> N:
> N:    This package provides an ELF binary that lacks the "bindnow" linker
> N:    flag.
> N:
> N:    If the ELF binary does not rely on late binding of symbols (e.g. weak
> N:    symbols), then please consider enabling this feature. Otherwise, please
> N:    consider overriding the tag (possibly with a comment about why).
> N:
> N:    If you use dpkg-buildflags, you may have to add hardening=+bindnow or
> N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
> N:
> N:    The relevant compiler flags are set in LDFLAGS.
> N:
> N:    Refer to https://wiki.debian.org/Hardening for details.
> N:
> N:    Severity: wishlist, Certainty: certain
> N:
> N:    Check: binaries, Type: binary, udeb
> N:
> I: fio: hardening-no-pie usr/bin/fio-btrace2fio
> I: fio: hardening-no-bindnow usr/bin/fio-btrace2fio
> I: fio: hardening-no-pie usr/bin/fio-dedupe
> I: fio: hardening-no-bindnow usr/bin/fio-dedupe
> I: fio: hardening-no-pie usr/bin/fio-genzipf
> I: fio: hardening-no-bindnow usr/bin/fio-genzipf
>
>
> Maybe it would be nice to have some of these in upstream build? PIE may not
> yet be advisable as for GCC 5 requirement.

What extra compiler/linker flags are being set? I tried with just -fPIE 
here, and it builds and links fine.

axboe@xps13:/home/axboe/git/fio $ gcc --version
gcc (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511

I have gcc 5.3 installed as well, works for that too. So I'm guessing 
-fPIE isn't all that's being set?

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: hardening fio build with PIE for Address Space Layout Randomization and bindnow linking
  2016-05-24 14:17 ` Jens Axboe
@ 2016-05-25  8:47   ` Martin Steigerwald
  0 siblings, 0 replies; 3+ messages in thread
From: Martin Steigerwald @ 2016-05-25  8:47 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio

On Dienstag, 24. Mai 2016 08:17:27 CEST Jens Axboe wrote:
> On 05/24/2016 04:10 AM, Martin Steigerwald wrote:
> > Hello Jens!
> > 
> > In my attempt to harden the fio build as recommended within Debian, I
> > tried to build it with PIE by using Debian´s own mechanism via
> > dpkg-buildflags. And I> 
> > got:
> >      CC diskutil.o
> >      CC fifo.o
> >      CC blktrace.o
> >      CC cgroup.o
> >      CC trim.o
> >      CC engines/sg.o
> >      CC engines/binject.o
> >      CC oslib/linux-dev-lookup.o
> >      CC fio.o
> >    
> >    LINK fio
> > 
> > /usr/bin/ld: crc/crc16.o: relocation R_X86_64_32S against `crc16_table'
> > can
> > not be used when making a shared object; recompile with -fPIC
> > crc/crc16.o: error adding symbols: Bad value
> > collect2: error: ld returned 1 exit status
> > Makefile:399: recipe for target 'fio' failed
> > make[1]: *** [fio] Error 1
> > make[1]: Leaving directory '/home/ms/Debian/fio/pkg-fio'
> > dh_auto_build: make -j1 returned exit code 2
> > debian/rules:17: recipe for target 'build' failed
> > make: *** [build] Error 2
> > dpkg-buildpackage: error: debian/rules build gave error exit status 2
> > 
> > 
> > Yet, building fio 2.10 from upstream does doesn´t produce a shared object
> > file.
> > 
> > Any idea?
> > 
> > 
> > 
> > 
> > I: fio: hardening-no-pie usr/bin/fio
> > N:
> > N:    This package provides an ELF executable that was not compiled as a
> > N:    position independent executable (PIE).
> > N:
> > N:    PIE is required for fully enabling Address Space Layout
> > Randomization
> > N:    (ASLR), which makes "Return-oriented" attacks more difficult.
> > N:
> > N:    Historically, PIE has been associated with noticeable performance
> > N:    overhead on i386. However, GCC-5 has implemented an optimization
> > that
> > N:    can reduce the overhead significantly.
> > N:
> > N:    If you use dpkg-buildflags, you may have to add hardening=+pie or
> > N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
> > N:
> > N:    The relevant compiler flags must be passed both to the compiler and
> > the N:    linker (e.g. for C that would be commonly be CFLAGS and
> > LDFLAGS). N:
> > N:    CAVEAT: Please keep in mind that the PIE flag (-fPIE) is not
> > suitable
> > N:    for all cases:
> > N:
> > N:     * It is <not> compatible with -fPIC which required for
> > N:       compiling shared libraries.
> > N:     * It is unlikely to work when compiling static libraries or
> > N:       executables (gcc -static).
> > N:
> > N:    If your upstream build compiles either of the above, you may have to
> > N:    patch the build to ensure that only ELF executables are compiled
> > with
> > N:    PIE.
> > N:
> > N:    Refer to https://wiki.debian.org/Hardening,
> > N:    https://gcc.gnu.org/gcc-5/changes.html, and
> > N:   
> > https://software.intel.com/en-us/blogs/2014/12/26/new-optimizations-for-x
> > 86-in-upcoming-gcc-50-32bit-pic-mode N:    for details.
> > N:
> > N:    Severity: wishlist, Certainty: certain
> > N:
> > N:    Check: binaries, Type: binary, udeb
> > N:
> > I: fio: hardening-no-pie usr/bin/fio-btrace2fio
> > I: fio: hardening-no-pie usr/bin/fio-dedupe
> > I: fio: hardening-no-pie usr/bin/fio-genzipf
> > 
> > 
> > Another option to harden fio works find and that is:
> > 
> > I: fio: hardening-no-bindnow usr/bin/fio
> > N:
> > N:    This package provides an ELF binary that lacks the "bindnow" linker
> > N:    flag.
> > N:
> > N:    If the ELF binary does not rely on late binding of symbols (e.g.
> > weak
> > N:    symbols), then please consider enabling this feature. Otherwise,
> > please N:    consider overriding the tag (possibly with a comment about
> > why). N:
> > N:    If you use dpkg-buildflags, you may have to add hardening=+bindnow
> > or
> > N:    hardening=+all to DEB_BUILD_MAINT_OPTIONS.
> > N:
> > N:    The relevant compiler flags are set in LDFLAGS.
> > N:
> > N:    Refer to https://wiki.debian.org/Hardening for details.
> > N:
> > N:    Severity: wishlist, Certainty: certain
> > N:
> > N:    Check: binaries, Type: binary, udeb
> > N:
> > I: fio: hardening-no-pie usr/bin/fio-btrace2fio
> > I: fio: hardening-no-bindnow usr/bin/fio-btrace2fio
> > I: fio: hardening-no-pie usr/bin/fio-dedupe
> > I: fio: hardening-no-bindnow usr/bin/fio-dedupe
> > I: fio: hardening-no-pie usr/bin/fio-genzipf
> > I: fio: hardening-no-bindnow usr/bin/fio-genzipf
> > 
> > 
> > Maybe it would be nice to have some of these in upstream build? PIE may
> > not
> > yet be advisable as for GCC 5 requirement.
> 
> What extra compiler/linker flags are being set? I tried with just -fPIE
> here, and it builds and links fine.
> 
> axboe@xps13:/home/axboe/git/fio $ gcc --version
> gcc (Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511
> 
> I have gcc 5.3 installed as well, works for that too. So I'm guessing
> -fPIE isn't all that's being set?

Hmmm, according to

DEB_BUILD_HARDENING_PIE (gcc/g++ -fPIE -pie)

https://wiki.debian.org/Hardening#DEB_BUILD_HARDENING_PIE_.28gcc.2Fg.2B-.2B-_-fPIE_-pie.29

Its not all. It also does "-pie".

Yes, if I try this as in:

diff --git a/Makefile b/Makefile
index 108e6ee..a559971 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ endif
 DEBUGFLAGS = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DFIO_INC_DEBUG
 CPPFLAGS= -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFIO_INTERNAL $(DEBUGFLAGS)
 OPTFLAGS= -g -ffast-math
-CFLAGS = -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCDIR)
+CFLAGS = -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement -fPIE -pie $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCD
IR)
 LIBS   += -lm $(EXTLIBS)
 PROGS  = fio
 SCRIPTS = $(addprefix $(SRCDIR)/,tools/fio_generate_plots tools/plot/fio2gnuplot tools/genfio tools/fiologparser.py)


I get a working build:

# hardening-check fio
fio:
 Position Independent Executable: yes
 Stack protected: no, not found!
 Fortify Source functions: yes (some protected functions found)
 Read-only relocations: no, not found!
 Immediate binding: no, not found!

Well, I wonder about:

You set CFLAGS hard without +=, maybe thats the issue, unless dpkg stuffes
the build flags into BUILD_CFLAGS or so.


Yes, that is it:

A patch as simple as

… pkg-fio> cat debian/patches/makefile-hardening 
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@
 DEBUGFLAGS = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DFIO_INC_DEBUG
 CPPFLAGS= -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFIO_INTERNAL $(DEBUGFLAGS)
 OPTFLAGS= -g -ffast-math
-CFLAGS = -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCDIR)
+CFLAGS += -std=gnu99 -Wwrite-strings -Wall -Wdeclaration-after-statement $(OPTFLAGS) $(EXTFLAGS) $(BUILD_CFLAGS) -I. -I$(SRCDIR)
 LIBS   += -lm $(EXTLIBS)
 PROGS  = fio
 SCRIPTS = $(addprefix $(SRCDIR)/,tools/fio_generate_plots tools/plot/fio2gnuplot tools/genfio tools/fiologparser.py)


Does the trick. Seems that Debian set some linker flag and the compiler flag
was not set, leading to:

> > /usr/bin/ld: crc/crc16.o: relocation R_X86_64_32S against `crc16_table'
> > can
> > not be used when making a shared object; recompile with -fPIC


Will create a patch to merge for you.

Thanks,

-- 
Martin Steigerwald  | Trainer

teamix GmbH
Südwestpark 43
90449 Nürnberg

Tel.:  +49 911 30999 55 | Fax: +49 911 30999 99
mail: martin.steigerwald@teamix.de | web:  http://www.teamix.de | blog: http://blog.teamix.de

Amtsgericht Nürnberg, HRB 18320 | Geschäftsführer: Oliver Kügow, Richard Müller

teamix Support Hotline: +49 911 30999-112
 
 Flexibilität im Haus – Sicherheit im Kopf, testen Sie jetzt 30 Tage kostenfrei unsere Cloud Backup Lösung FlexVault: www.teamix.de/cloud-backup 



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-25  8:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-24 10:10 hardening fio build with PIE for Address Space Layout Randomization and bindnow linking Martin Steigerwald
2016-05-24 14:17 ` Jens Axboe
2016-05-25  8:47   ` Martin Steigerwald

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox