버퍼 오버 플로우는 큰 문제입니다. C의 어떤 것도 기본적으로 범위 검사가 없으므로 버퍼를 덮어 쓰는 것이 매우 쉽습니다. gets()
버퍼 오버플로를 막을 수 없으며 거의 사용해서는 안되는 표준 라이브러리 함수 가 있습니다.
스크램블링 힙 블록과 같은 악용을 방해하는 몇 가지 구현 수준 기술이 있지만 로컬 버퍼의 버퍼 오버플로를 중지하지는 않으며 함수가 반환 할 주소 변경과 같은 흥미로운 작업을 수행 할 수 있습니다.
C에는 좋은 일반적인 해결책이 없습니다. 많은 라이브러리 함수에는 작성할 양을 제한하는 버전이 있습니다. 계산하기는 어색하지만 적절한 테스트가 실행되는 한 테스트에서 힙 버퍼 오버 플로우를 감지 할 수있는 소프트웨어가 있으며 스택 오버 플로우는 종종 테스트에서 충돌로 표시됩니다. 그 외에는 신중한 코딩과 코드 검토가 중요합니다.
관련된 문제는 하나의 문자로 너무 작은 버퍼에 쓰는 문제입니다. n 문자 길이의 C 문자열은 '\0'
종료 문자로 인해 메모리에 n + 1 문자가 필요하다는 것을 잊어 버립니다 . 공격자가 터미네이터없이 문자열을 저장할 수있는 경우 문자열을 예상하는 모든 C 함수는 0 바이트에 도달 할 때까지 처리를 계속하여 원하는 것보다 많은 정보를 복사하거나 출력 할 수 있습니다 (또는 DOS 공격에 대해 보호 된 메모리에 충돌). ). 해결책은 인식, 관리 및 코드 검토입니다.
printf()
가족 에게는 또 다른 위험이 있습니다 . 글을 쓰면 인쇄 할 때 '%'가 포함되어 char * str; ... printf(str);
있으면 문제가 생길 수 str
있습니다. %n
형식 지시어는 허용 printf()
메모리에 쓰기. 해결책은 printf("%s", str);
또는 puts(str);
입니다. (또한 C99를 snprintf()
대신 사용하십시오 sprintf()
.)
특히 루프 인덱스로 부호없는 정수를 사용하면 문제가 발생할 수 있습니다. 작은 음수 값을 부호없는 값에 할당하면 큰 양수 값을 얻습니다. 그것은 N 개의 인스턴스 만 처리하는 것과 같은 것들을 제한하거나 같은 제한된 기능을하는 것을 방해 할 수 있습니다 strncpy()
. 부호없는 정수를 모두 검사하십시오. unsigned short
그 중 하나의 값이 클수록 큰 양수 값으로 변환되므로 피하고 싶을 수도 있습니다 int
.
C에서 문자 상수는 실제로는임을 잊지 마십시오 int
. 로 표현할 수 없으므로 같은 것을 쓰면 char c; while((c = getchar()) != EOF) ...
쉽게 실패 할 수 있습니다 .EOF
char
내가 생각할 수있는 더 많은 특징적인 C 실수가 있지만 보안 문제가 발생할 수 있습니다.