tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Updated patch for pkgsrc hardening



* On 2016-03-01 at 00:03 GMT, Pierre Pronchery wrote:

> Please let me know if I can apply part (or all) of this patch into
> pkgsrc directly. The defaults can be changed obviously, particularly so
> in the case of PKGSRC_MKPIE as many packages are still expected to fail
> building with this set.

For me there's too much hard-coding for NetBSD here, and too much
logic in the platform file.  If you ever want to extend the support to
other platforms then there is a large amount of code that needs to be
duplicated across each platform/*.mk file.

The best way to architect this kind of stuff is:

  * Set a flag in each mk/platform/*.mk file which tells pkgsrc
    whether that platform supports a particular feature, using
    MACHINE_ARCH or whatever if only certain architectures or releases
    for that platform support the feature.

  * Combine the platform-specific flag with a user/default prefs
    variable to decide whether the feature should be enabled.

  * Have logic in each mk/compiler/*.mk which sets the appropriate
    compiler flag if the feature is enabled.

At the moment there are quite a few violations of this design, e.g.
there is compiler logic and user prefs in the platform file.

As an (untested) example of what I'd do:

  * mk/platform/NetBSD.mk

    _OPSYS_SUPPORTS_FORT=	yes
    .if ${MACHINE_ARCH} != "alpha" && ...
    _OPSYS_SUPPORTS_SSP=	yes
    .endif

  * mk/defaults/mk.conf

    PKGSRC_USE_FORT?=	yes
    PKGSRC_USE_SSP?=	yes

  * mk/bsd.prefs.mk

    # after defaults/mk.conf and platform/*.mk have been loaded
    _PKGSRC_USE_FORT=	no
    _PKGSRC_USE_SSP=	no
    .if ${PKGSRC_USE_FORT:tl} == "yes" && ${_OPSYS_SUPPORTS_FORT:Uno} == "yes"
    _PKGSRC_USE_FORT=	yes
    .endif
    .if ${PKGSRC_USE_SSP:tl} == "yes" && ${_OPSYS_SUPPORTS_SSP:Uno} == "yes"
    _PKGSRC_USE_SSP=	yes
    .endif

  * mk/compiler/gcc.mk

    .if ${_PKGSRC_USE_FORT} == "yes"
    _GCC_CFLAGS+=	-D_FORTIFY_SOURCE=2
    .endif
    .if ${_PKGSRC_USE_SSP} == "yes"
    _GCC_CFLAGS+=	-fstack-protector
    .endif

This way there's a clear separation between platform, user, and
compiler settings, and all I need to do to add support for Fortify to
OpenBSD is add a single line to mk/platform/OpenBSD.mk:

    _OPSYS_SUPPORTS_FORT=	yes

and if we want to support clang we don't need to duplicate a bunch of
logic in every mk/platform/*.mk file, we just add the necessary:

    .if ${_PKGSRC_USE_FORT} == "yes"
    CWRAPPERS_APPEND.cc+=	-fenable-fortify
    .endif

or whatever logic to mk/compiler/clang.mk

I also share Greg's concerns about the lack of cwrapper support.  I've
personally not used the legacy wrappers for any of my platforms in
over a year now.

Thanks for working on this.

-- 
Jonathan Perkin  -  Joyent, Inc.  -  www.joyent.com


Home | Main Index | Thread Index | Old Index