GCC의 스택 보호 기능은 언제 어떻게 사용합니까?
-Wstack-protector
작업중인 프로젝트를 컴파일 할 때 경고를 활성화 했습니다 (상업용 멀티 플랫폼 C ++ 게임 엔진, GCC 4.2로 Mac OS X 10.6에서 컴파일). 이 플래그 -fstack-protector
는 활성화 된 경우에도 스택 스매싱으로부터 보호되지 않는 기능에 대해 경고합니다 . GCC는 프로젝트를 빌드 할 때 몇 가지 경고를 내 보냅니다.
기능을 보호하지 않음 : 최소 8 바이트
길이의 버퍼 없음 로컬 변수를 보호하지 않음 : 가변 길이 버퍼
첫 번째 경고에서,이 함수를 스택 스매싱으로부터 보호하기 위해 함수에서 사용할 때 버퍼가 가져야하는 최소 크기를 조정할 수 있음을 발견했습니다. --param ssp-buffer-size=X
사용할 수 있습니다. 여기서 X는 기본적으로 8이고 다음과 같을 수 있습니다. 1로 낮습니다.
두 번째 경고의 경우 사용을 중지하지 않으면 발생을 억제 할 수 없습니다 -Wstack-protector
.
- 언제 사용해야
-fstack-protector
합니까? (예를 들어, 개발 중에 항상 또는 버그를 추적 할 때와 같이?) - 언제 사용해야
-fstack-protector-all
합니까? -Wstack-protector
나에게 무엇을 말하고 있습니까? 버퍼 최소 크기를 줄이는 것을 제안합니까?- 그렇다면 크기를 1로 설정하는 데 단점이 있습니까?
-Wstack-protector
경고가없는 빌드를 원한다면 항상 활성화하려는 종류의 플래그가 아닌 것 같습니다 . 이게 옳은 거니?
스택 보호는 디버깅 전략이 아니라 강화 전략입니다. 게임이 네트워크를 인식하거나 제어되지 않은 소스에서 오는 데이터가있는 경우 게임을 켭니다. 통제되지 않은 곳에서 오는 데이터가 없으면 켜지 마십시오.
실행 방법은 다음과 같습니다. 버그가 있고 공격자가 제어 할 수있는 것을 기반으로 버퍼를 변경하는 경우 해당 공격자는 반환 주소 또는 스택의 유사한 부분을 덮어 써서 코드 대신 코드를 실행할 수 있습니다. 스택 보호는 이런 일이 발생하는 것을 감지하면 프로그램을 중단합니다. 사용자는 만족하지 않지만 해킹 당하지 않습니다. 이것은 게임에서 부정 행위에 관한 일종의 해킹이 아니라 누군가가 코드의 취약성을 사용하여 잠재적으로 사용자를 감염시킬 수있는 공격을 생성하는 해킹의 일종입니다.
디버깅 지향 솔루션의 경우 mudflap과 같은 것을 살펴보십시오.
구체적인 질문에 관해서 :
- 제어되지 않는 소스에서 데이터를 가져 오는 경우 스택 보호기를 사용하십시오. 이에 대한 대답은 아마도 그렇습니다. 그래서 그것을 사용하십시오. 통제되지 않은 소스의 데이터가 없더라도 결국 또는 이미 수행하고 인식하지 못할 것입니다.
성능 저하에 대한 대가로 추가 보호를 원하는 경우 모든 버퍼에 대한 스택 보호를 사용할 수 있습니다. 에서 gcc4.4.2 설명서 :
-fstack 보호기
추가 코드를 생성하여 스택 스매싱 공격과 같은 버퍼 오버플로를 확인합니다. 이것은 취약한 개체가있는 함수에 보호 변수를 추가하여 수행됩니다. 여기에는 alloca를 호출하는 함수와 8 바이트보다 큰 버퍼가있는 함수가 포함됩니다. 가드는 함수가 입력 될 때 초기화되고 함수가 종료 될 때 확인됩니다. 가드 검사에 실패하면 오류 메시지가 인쇄되고 프로그램이 종료됩니다.
-fstack-protector-all
모든 기능이 보호된다는 점을 제외하면 -fstack-protector와 유사합니다.
경고는 스택 보호가 보호 할 수없는 버퍼를 알려줍니다.
- 반드시 최소 버퍼 크기를 줄 이도록 제안하는 것은 아니며 0/1 크기에서는 stack-protector-all과 동일합니다. 버퍼가 보호되도록 코드를 다시 디자인하기로 결정한 경우 가능하도록 지적하는 것입니다.
- 아니요, 이러한 경고는 문제를 나타내는 것이 아니라 정보를 알려줍니다. 정기적으로 사용하지 마십시오.
실제로 일반 빌드에 대한 경고는 신경 쓰지 않아야합니다. 정말 정보 메시지에 가깝습니다. 스택에있는 가변 크기 버퍼에 내재 된 보안 문제가 있음이 분명하기를 바랍니다. 크기 계산이 잘못되면 큰 구멍이 생깁니다.
참고 URL : https://stackoverflow.com/questions/1629685/when-and-how-to-use-gccs-stack-protection-feature
'code' 카테고리의 다른 글
Rails는 요청의 매개 변수에서 빈 배열을 nil로 변환합니다. (0) | 2020.12.09 |
---|---|
일반 JavaScript를 asm.js로 변환 할 수 있습니까? 아니면 정적으로 유형이 지정된 저수준 언어의 속도를 높이기위한 것입니까? (0) | 2020.12.09 |
'Alternative'유형 클래스의 의미와 다른 유형 클래스와의 관계로 인해 혼동 됨 (0) | 2020.12.08 |
Bootstrap 3과 함께 작동하도록 bootstrap-datepicker를 얻으려면 어떻게해야합니까? (0) | 2020.12.08 |
IE11에서 클릭 할 수없는 양식의 입력을위한 이미지 레이블 (0) | 2020.12.08 |