"nix-shell" 환경에 대한 보안 강화 옵션 비활성화

"nix-shell" 환경에 대한 보안 강화 옵션 비활성화

NixOS(16.09)에서 GCC(6.3)를 빌드하려고 하면 nix-shell다음과 같은 결과가 나타납니다.

make[1]: Entering directory '<my-build-path>/coreboot/util/crossgcc/build-i386-elf-GCC/build-x86_64-pc-linux-gnu/libcpp'
test -f config.h || (rm -f stamp-h1 && make stamp-h1)
g++  -I../../../gcc-6.3.0/libcpp -I. -I../../../gcc-6.3.0/libcpp/../include -I../../../gcc-6.3.0/libcpp/include  -O2  -fomit-frame-pointer -m64 -W -Wall -Wno-narrowing -Wwrite-strings -Wmissing-format-attribute -pedantic -Wno-long-long  -fno-exceptions -fno-rtti -I../../../gcc-6.3.0/libcpp -I. -I../../../gcc-6.3.0/libcpp/../include -I../../../gcc-6.3.0/libcpp/include   -c -o expr.o -MT expr.o -MMD -MP -MF .deps/expr.Tpo ../../../gcc-6.3.0/libcpp/expr.c
../../../gcc-6.3.0/libcpp/expr.c: In function 'unsigned int cpp_classify_number(cpp_reader*, const cpp_token*, const char**, source_location)':
../../../gcc-6.3.0/libcpp/expr.c:686:18: error: format not a string literal and no format arguments [-Werror=format-security]
        0, message);
                  ^
../../../gcc-6.3.0/libcpp/expr.c:689:39: error: format not a string literal and no format arguments [-Werror=format-security]
           virtual_location, 0, message);
                                       ^
cc1plus: some warnings being treated as errors
make[1]: *** [Makefile:224: expr.o] Error 1
make[1]: Leaving directory '<my-build-path>/coreboot/util/crossgcc/build-i386-elf-GCC/build-x86_64-pc-linux-gnu/libcpp'
make: *** [Makefile:2730: all-build-libcpp] Error 2
sh ../gcc-6.3.0/mkinstalldirs <my-build-path>/coreboot/util/crossgcc/xgcc <my-build-path>/coreboot/util/crossgcc/xgcc
sh: line 3: cd: i386-elf/libgcc: No such file or directory
make: *** [Makefile:10462: install-target-libgcc] Error 1

실패의 원인은 어디에 -Werror=format-security있는 것 같습니다(명령에 이 정확한 옵션이 표시되지는 않지만). 그러나 <nixpkgs>/pkgs/development/compilers/gcc/6/default.nix나는 이것을 발견했습니다:

hardeningDisable = [ "format" ];

NixOS의 보안 강화 조치로 인해 오류가 발생할 수 있다는 추측이 있으며 그 중 일부는가지다GCC 컴파일을 비활성화합니다(GCC 개발자가 이러한 기능에서 수행하는 작업을 알고 있다고 가정). GCC 6.2 및 5.4로 테스트되었습니다. 동일합니다.

따라서 문제는 환경 format의 강화 옵션을 (구체적으로) 비활성화하는 방법입니다 nix-shell. 아니면 "거짓으로 간주되는 경고"는 어디에서 나온 것입니까?

옵션 설명:


이 답변에 따르면

nix-shellNix 표현식과는 관련이 없지만... 플래그를 make사용하여 호출하면NIX_DEBUG

env NIX_DEBUG=' ' make crossgcc-i386

<nixpkgs>/pkgs/build-support/cc-wrapper/add-hardening.sh예를 들어 내가 추론 HARDENING: enabling format할 수 있는 한 ;makenix-shell


어쩌면 Collision을 통해 무언가를 전달해야 할 수도 있지만 nixos-option정확히 어떤 옵션이 필요할까요? 난 이렇게만 있을 수는 없어 grep... ( dconf dump /또는 유사어 없음 gsettings list-recursively)

답변1

format-security경고가지다다음과 같은 이유로 비활성화되었거나 최소한 -Werror비활성화되지 않았습니다.

강화 옵션은 컴파일러 래퍼에 의해 적용되므로 로그에 표시되지 않습니다.

분명히 hardeningDisable이것이 래퍼에 영향을 미치는 유일한 방법입니다.

한 가지 가능한 해결책은 와 함께 사용할 더미 Nix 표현식을 만드는 것입니다 nix-shell -A. 예: 별도의 위치( )에
복사하여 쓰기 가능하게 만들고, 포함을 추가합니다 .~/.nix-defexpr/channels_root/nixos/<nixpkgs'>
<nixpkgs'>/pkgs/tools/misc/coreboot/default.nix

{ stdenv, gcc6, flex, bison, ncurses, iasl, doxygen, zlib, isl, python }:

stdenv.mkDerivation {
  name = "coreboot";

  buildInputs = [ gcc6 flex bison ncurses iasl doxygen zlib isl python ];

  hardeningDisable = [ "format" ];  # to build the cross-compiler
}

<nixpkgs'>/top-level/all-packages.nix평소대로 등록하고
마지막으로 nix-shell <nixpkgs'> -A coreboot필요한 환경 생성을 호출합니다.

하지만 (에 적용하는 것이) 더 쉬울 것 같아요 nix-shell -p.

답변2

nix-shell에서 gcc 강화 플래그 비활성화

# shell.nix

{ pkgs ? import <nixpkgs> {} }:

with pkgs;

mkShell {
  # disable all hardening flags
  NIX_HARDENING_ENABLE = "";

  # enable default hardening flags
  #NIX_HARDENING_ENABLE = "pie pic format stackprotector fortify strictoverflow";

  buildInputs = [
    #gnumake
    #python3
    # ...
  ];
}

확인하다

$ NIX_DEBUG=1 gcc -v 2>&1 | grep ^HARDENING
HARDENING: disabled flags: pie pic format stackprotector fortify strictoverflow

기반으로

$ which gcc 
/nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/bin/gcc

$ grep add-hardening.sh /nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/bin/gcc
source /nix/store/l0fvy72hpfdpjjs3dk4112f57x7r3dlm-gcc-wrapper-12.2.0/nix-support/add-hardening.sh

또한보십시오:Nixpkgs의 지원군nixpkgs 매뉴얼에서

관련 정보