gcc -D_FORTIFY_SOURCE = 1과 -D_FORTIFY_SOURCE = 2의 차이
누군가 gcc -D_FORTIFY_SOURCE=1
와 의 차이점을 지적 할 수 있습니까 -D_FORTIFY_SOURCE=2
? =2
더 안전한 것 같아요 ? 점별로 차이점을 나열하는 목록을 찾을 수 없었습니다.
-D_FORTIFY_SOURCE=2
와 함께 사용해야 하는 것도 읽었습니다 -O2
. 그렇지 않으면 모든 기능을 사용할 수 없습니다. 또한 여기에서는 회귀를 자세히 지정하는 목록을 찾지 못했습니다. 특히 -Os
타겟이 플래시 메모리가 많지 않은 장치이므로 컴파일하는 데 관심이 있습니다 .
이것이 문서화 된 위치에 대한 모든 힌트를 환영합니다!
기능 테스트 매크로 ( man 7 feature_test_macros
) 의 매뉴얼 페이지에서
_FORTIFY_SOURCE
(glibc 2.3.4 이후)일부 경량 확인이 매크로 발생 정의하는 (예를 들어, 다양한 캐릭터 메모리 조작 함수를 이용하는 경우 어떤 버퍼 오버 플로우 에러를 검출하도록 수행되는
memcpy
,memset
,stpcpy
,strcpy
,strncpy
,strcat
,strncat
,sprintf
,snprintf
,vsprintf
,vsnprintf
,gets
, 및 다양한 문자 변형체). 일부 함수의 경우 인수 일관성이 확인됩니다. 예를 들어, 지정된 플래그가를 포함 할 때 mode 인수open
와 함께 제공된 검사가 수행 됩니다 . 모든 문제가 감지되는 것은 아니며 몇 가지 일반적인 경우입니다.O_CREAT
_FORTIFY_SOURCE
컴파일러 최적화 수준 1 (gcc -O1
) 이상에서가 1로 설정 되면 준수 프로그램의 동작을 변경하지 않아야하는 검사가 수행됩니다.으로
_FORTIFY_SOURCE
2로 설정, 좀 더 검사가 추가되지만 일부 부합하는 프로그램이 실패 할 수 있습니다.일부 검사는 컴파일시 (헤더 파일에 구현 된 매크로 논리를 통해) 수행 될 수 있으며 컴파일러 경고가 발생합니다. 다른 검사는 런타임에 수행되며 검사에 실패하면 런타임 오류가 발생합니다.
이 매크로를 사용하려면
gcc
버전 4.0부터 사용할 수있는 컴파일러 지원이 필요합니다 .
또한 FORTIFY_SOURCE로 애플리케이션 보안 강화 (2014 년 3 월) 기사에서는 다음 과 같이 설명합니다.
gcc -D_FORTIFY_SOURCE=1
컴파일 타임에만 검사를 추가합니다 (일부 헤더는으로 필요#include <string.h>
).gcc -D_FORTIFY_SOURCE=2
또한 런타임에 검사를 추가합니다 (버퍼 오버플로가 감지되면 프로그램이 종료 됨)
기본적으로 _FORTIFY_SOURCE
레벨 2는 더 안전하지만 약간 더 위험한 컴파일 전략입니다. 이를 사용하는 경우 컴파일 된 코드에 대해 매우 강력한 회귀 테스트를 통해 컴파일러가 예기치 않은 동작을 도입하지 않았 음을 증명해야합니다.
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html 은 feature_test_macros(7)
.
명확성을 위해 가볍게 편집 / 재 포맷 된 관련 발췌 내용은 다음과 같습니다.
차이
-D_FORTIFY_SOURCE=1
와-D_FORTIFY_SOURCE=2
위한 예이며struct S { struct T { char buf[5]; int x; } t; char buf[20]; } var;
와 함께
-D_FORTIFY_SOURCE=1
,strcpy (&var.t.buf[1], "abcdefg");
오버플로 (객체는 전체
VAR
)로 간주되지 않지만-D_FORTIFY_SOURCE=2
strcpy (&var.t.buf[1], "abcdefg");
버퍼 오버 플로우로 간주됩니다.
또 다른 차이점은 함께 있다는 것입니다
-D_FORTIFY_SOURCE=2
,%n
가장 일반적인 형식 문자열에*printf
(일반적으로 문자열 리터럴 가족 기능에만 허용이 읽기 전용 메모리에 저장되어있는 경우gettext
의_("%s string %n")
도 괜찮습니다)하지만, 일반적으로 공격자의 시도는 형식 문자열을 악용하는 경우 취약점%n
은 공격자가 쓸 수있는 곳입니다.
'programing tip' 카테고리의 다른 글
ggplot에서 스트립 라벨의 위치를 위에서 아래로 변경할 수 있습니까? (0) | 2020.12.13 |
---|---|
맞춤 Google Now 카드 만들기 (0) | 2020.12.13 |
em의 컨텍스트는 무엇입니까? (0) | 2020.12.13 |
TFS를 사용하여 패치 만들기 (0) | 2020.12.13 |
PHP 읽기 전용 속성? (0) | 2020.12.13 |