문제

나는 그것을 활성화했다 -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.

  1. 언제 -fstack-protector 사용됩니까? (예를 들어, Dev 동안 항상 또는 버그를 추적 할 때마다 항상?)
  2. 언제 -fstack-protector-all 사용됩니까?
  3. 무엇인가요 -Wstack-protector 나에게 말해? 버퍼 최소 크기를 줄이는 것이 제안됩니까?
  4. 그렇다면 크기를 1로 넣을 수있는 단점이 있습니까?
  5. 그것은 보인다 -Wstack-protector 경고가없는 빌드를 원한다면 항상 활성화하려는 깃발의 종류가 아닙니다. 이게 옳은 거니?
도움이 되었습니까?

해결책

스택 보호는 디버깅 전략이 아닌 경화 전략입니다. 게임이 네트워크 인식이거나 다른 방법으로 통제되지 않은 소스에서 나오는 데이터가있는 경우 켜십시오. 통제되지 않은 곳에서 데이터가 없으면 켜지 마십시오.

이 방법은 다음과 같습니다. 버그가 있고 공격자가 제어 할 수있는 것을 기준으로 버그를 변경하는 경우 공격자는 스택의 반환 주소 또는 유사한 부분을 코드 대신 코드를 실행하게 할 수 있습니다. 스택 보호는 이러한 상황을 감지하면 프로그램이 중단됩니다. 사용자는 행복하지는 않지만 해킹되지는 않습니다. 이것은 게임에서 부정 행위에 관한 일종의 해킹이 아닙니다. 코드의 취약점을 사용하여 사용자를 잠재적으로 감염시키는 악용을 만드는 사람에 관한 일종의 해킹입니다.

디버깅 지향 솔루션은 Mudflap과 같은 것을보십시오.

특정 질문에 관해서 :

  1. 통제되지 않은 소스에서 데이터를 가져 오면 스택 프로텍터를 사용하십시오. 이것에 대한 대답은 아마도 예일 것입니다. 그러니 사용하십시오. 통제되지 않은 소스의 데이터가 없더라도 결국 또는 이미 그것을 실현하지 못할 것입니다.
  2. 일부 성능 히트를 대가로 추가 보호를 원한다면 모든 버퍼에 대한 스택 보호를 사용할 수 있습니다. 에서 GCC4.4.2 매뉴얼:

    -fstack protector

    스택 스매싱 공격과 같은 버퍼 오버 플로우를 확인하는 추가 코드를 방출하십시오. 이는 취약한 객체와 기능에 가드 변수를 추가하여 수행됩니다. 여기에는 Alloca를 호출하는 기능과 8 바이트보다 큰 버퍼가있는 기능이 포함됩니다. 가드는 함수가 입력되면 초기화 된 다음 함수가 종료되면 확인합니다. 가드 검사가 실패하면 오류 메시지가 인쇄되고 프로그램이 종료됩니다.

    -fstack protector-all

    모든 기능이 보호되는 것을 제외하고 -fstack -protector와 마찬가지로.

  3. 경고는 스택 보호가 보호 할 수없는 버퍼를 알려줍니다.

  4. 반드시 최소 버퍼 크기를 줄이고 0/1의 크기로 스택 프로텍터와 동일하다는 것을 암시하는 것은 아닙니다. 버퍼가 보호되도록 코드를 재 설계하여 재 설계 할 수 있도록 할 수 있도록 할 수 있도록 만 지적합니다.
  5. 아니요, 이러한 경고는 문제를 나타내지 않고 정보 만 지적합니다. 정기적으로 사용하지 마십시오.

다른 팁

실제로 정상적인 빌드에 대한 경고에 신경 쓰지 않아야합니다. 그것은 실제로 정보 메시지입니다. 스택에 가변 크기의 버퍼와 고유 한 보안 문제가 있다는 것이 분명합니다. 크기 계산이 잘못되면 큰 구멍이 열립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top