strncpy가 안전하지 않은 이유는 무엇입니까?
strncpy가 안전하지 않은 것으로 간주되는 이유를 찾고 있습니다. 누구든지 이것에 대한 문서 나 그것을 사용하는 익스플로잇의 예를 가지고 있습니까?
한 번 봐 가지고 이 사이트를 ; 상당히 상세한 설명입니다. 기본적으로 strncpy()
NUL 종료가 필요하지 않으므로 다양한 공격에 취약합니다.
원래 문제는 strcpy (3) 가 메모리 안전 작업 이 아니기 때문에 공격자가 스택의 코드를 덮어 쓰는 버퍼보다 긴 문자열을 제공 할 수 있으며 신중하게 배열하면 공격자로부터 임의의 코드를 실행할 수 있다는 것입니다.
그러나 strncpy (3) 는 목적지에서 모든 경우에 null 종료를 제공하지 않는다는 또 다른 문제가 있습니다. (대상 버퍼보다 긴 소스 문자열을 상상해보십시오.) 향후 작업은 결과가 세 번째 버퍼에 복사 될 때 동일한 크기의 버퍼간에 C nul 종료 문자열을 준수하고 다운 스트림이 오작동 할 것으로 예상 할 수 있습니다.
strncpy (3)를 사용하는 것이 strcpy (3)보다 낫지 만 strlcpy (3) 같은 것은 여전히 낫습니다.
strncpy를 안전하게 사용하려면 (1) 수동으로 null 문자를 결과 버퍼에 붙이거나, (2) 버퍼가 미리 null로 끝나는 것을 알고, (length-1)을 strncpy에 전달하거나, (3) 버퍼 길이를 버퍼 길이에 묶지 않는 방법을 사용하여 버퍼를 복사하지 않습니다.
strncpy는 복사 된 문자열을지나 버퍼에있는 모든 것을 0으로 채우는 반면 다른 길이 제한 strcpy 변형은 그렇지 않다는 점에 유의하는 것이 중요합니다. 어떤 경우에는 성능이 저하 될 수 있지만 다른 경우에는 보안상의 이점이됩니다. 예를 들어, strlcpy를 사용하여 "supercalifragilisticexpalidocious"를 버퍼에 복사 한 다음 "it"를 복사하면 버퍼는 "it ^ ercalifragilisticexpalidocious ^"를 보유합니다 ( "^"를 사용하여 0 바이트를 나타냄). 버퍼가 고정 크기 형식으로 복사되면 추가 데이터가 함께 태그 될 수 있습니다.
질문은 "로드 된"전제를 기반으로하므로 질문 자체가 유효하지 않습니다.
여기서 strncpy
요점은 안전하지 않은 것으로 간주되지 않고 안전하지 않은 것으로 간주 된 적이 없다는 것입니다. 해당 기능에 첨부 할 수있는 "불안정"의 유일한 주장은 C 메모리 모델과 C 언어 자체의 일반적인 불안정에 대한 광범위한 주장입니다. (그러나 그것은 분명히 완전히 다른 주제입니다).
C 언어 영역 내에서 어떤 종류의 "불안정"에 대한 잘못된 믿음은 "안전한 문자열 복사" strncpy
를 사용하는 널리 퍼진 모호한 패턴 strncpy
, 즉이 함수가 수행하지 않고 의도하지 않은 것에서 파생됩니다 . 이러한 사용은 실제로 오류가 발생하기 쉽습니다. 그러나 "오류 발생 가능성이 매우 높음"과 "안전하지 않음"사이에 등호를 표시하더라도 여전히 문제가 아닌 사용 문제 (예 : 교육 부족 문제) strncpy
입니다.
기본적으로 유일한 문제 strncpy
는 불행한 이름 지정 이라고 말할 수 있습니다 . 이로 인해 초보자 프로그래머는 실제로 사양을 읽는 대신이 함수가 수행하는 작업을 이해한다고 가정합니다. 함수 이름을 보면 무능한 프로그래머는 이것이 strncpy
"안전한 버전"이라고 가정하지만 strcpy
실제로는이 두 함수는 전혀 관련이 없습니다.
예를 들어 나누기 연산자에 대해 똑같은 주장을 할 수 있습니다. 대부분 아시다시피 C 언어에 대해 가장 자주 묻는 질문 중 하나는 "그것이 1/2
평가 될 것이라고 생각 0.5
했지만 0
대신 얻었 습니다. 왜?"입니다. 그러나 우리는 언어 초보자가 행동을 잘못 해석하는 경향이 있기 때문에 나누기 연산자가 안전하지 않다고 주장하지 않습니다.
또 다른 예로, 무능한 프로그래머가 출력이 실제로 무작위가 아니라는 사실에 불쾌하게 놀라는 경우가 많기 때문에 의사 난수 생성 함수를 "안전하지 않음"이라고 부르지 않습니다.
그것이 바로 strncpy
기능 과 관련된 방식 입니다. 초보 프로그래머가 의사 난수 생성기가 실제로 무엇을하는지 배우는 데 시간이 걸리는 것처럼 strncpy
실제로 무엇을하는지 배우는 데 시간이 걸립니다 . 그것은 배울 시간이 걸리는 strncpy
A는 변환 변환 의도 된 기능, 제로 - 말단 에 끈 고정 폭 문자열. strncpy
"안전한 문자열 복사"와는 전혀 관련이 없으며 그 목적으로 의미있게 사용할 수 없다는 것을 배우려면 시간이 걸립니다 .
물론, 언어 학생 strncpy
이 부서 운영자와 함께 일을 정리하는 것보다 목적을 배우는 데 훨씬 더 오래 걸립니다 . 그러나 이것은에 대한 "불안정"주장의 근거가됩니다 strncpy
.
PS 승인 된 답변에 링크 된 CERT 문서는 정확히 다음 사항에 전념합니다. strncpy
"안전한"버전의 기능 에 대한 일반적인 무능한 남용의 불안정성을 입증합니다 strcpy
. 그 strncpy
자체가 어떤 식 으로든 안전하지 않다고 주장하는 것은 아닙니다 .
Git 2.19 (2018 년 3 분기)의 pathc는 다음과 같은 시스템 API 함수를 오용하기가 너무 쉽다는 것을 발견했습니다 strcat()
. strncpy()
; ...이 코드베이스에서 이러한 기능을 금지합니다.
참조 e488b7a 커밋 , cc8fdae 커밋 , 1b11b64 커밋 (2018 7월 24일), 및 c8af66a 커밋 에 의해 (2018년 7월 26일를) 제프 킹 ( peff
) .
(Merged by Junio C gitster
Hamano -- in commit e28daf2 , 15 Aug 2018)
banned.h
:strcat()
금지됨으로 표시이
strcat()
함수에는strcpy()
.
그리고 보너스로 각 후속 호출이 기존 문자열을 통과해야하므로 실수로 2 차로 끝나기 쉽습니다.마지막
strcat()
호출은 f063d38 에서 사라졌습니다 (데몬 : 다시 생성 할 때 cld-> env_array 사용, 2015-09-24, Git 2.7.0).
일반적으로strcat()
는 동적 문자열 (strbuf
또는xstrfmt
) 또는xsnprintf
길이가 제한되어 있음을 알고있는 경우로 바꿀 수 있습니다.
참고 URL : https://stackoverflow.com/questions/869883/why-is-strncpy-insecure
'Programing' 카테고리의 다른 글
GCC 4.8에서 C ++ 11 thread_local 변수의 성능 저하는 무엇입니까? (0) | 2020.11.22 |
---|---|
Vundle과 NeoBundle의 차이점은 무엇입니까? (0) | 2020.11.22 |
Django는 어떤 용도로 사용됩니까? (0) | 2020.11.22 |
CMakeLists.txt 파일을 어떻게 디버깅합니까? (0) | 2020.11.22 |
com.google.gms : google-services : 4.0.1을 찾을 수 없습니다. (0) | 2020.11.22 |