문제

최근 우연히 발견한 기사 마이크로소프트가 금지하고 있다고 주장하는 memcpy() 안전한 프로그래밍 상점에서 작동합니다.해당 기능에 내재된 취약점은 이해하지만, 해당 기능의 사용을 완전히 금지해야 합니까?

내가 작성하는 프로그램을 피해야 할까요? memcpy() 아니면 단지 안전하게 사용되는지 확인하는 것뿐인가요?유사하지만 더 안전한 기능을 제공하는 대안은 무엇입니까?

도움이 되었습니까?

해결책

마이크로소프트가 제공하는 대안 해당 매개변수의 유효성을 검사하는 memcpy 및 wmemcpy에 적용됩니다.

memcpy_s는 "흠, 이 주소를 읽기 전에 그것이 널 포인터가 아닌지 직접 확인하겠습니다.이 주소로 편지를 쓰기 전에 다시 테스트해 보겠습니다.또한 복사하도록 요청받은 바이트 수를 대상의 요청된 크기와 비교할 것입니다.호출이 모든 테스트를 통과하는 경우에만 복사를 수행해야 합니다."

Memcpy는 "목적지를 레지스터에 넣고 소스를 레지스터에 넣고 카운트를 레지스터에 넣고 MOVSB ​​또는 Movsw를 수행합니다."라고 말합니다. (이 세상에는 오래 걸리지 않은 지구에 관한 예 : http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)

편집하다:야생의 예를 들어 분부 받들겠습니다 memcpy에 대한 접근 방식, memcpy가 있는 OpenSolaris를 고려하십시오(일부 구성의 경우). bcopy로 정의됨, 그리고 복사 (일부 구성의 경우)은 ...

void
     33 bcopy(from, to, count)
     34 #ifdef vax
     35     unsigned char *from, *to;
     36     int count;
     37 {
     38 
     39     asm("   movc3   12(ap),*4(ap),*8(ap)");
     40 }
     41 #else
     42 #ifdef u3b      /* movblkb only works with register args */
     43     unsigned char *from, *to;
     44     int count;
     45 {
     46     asm("   movblkb %r6, %r8, %r7");
     47 }
     48 #else
     49     unsigned char *from, *to;
     50     int count;
     51 {
     52     while ((count--) > 0)
     53         *to++ = *from++;
     54 }
     55 #endif

편집하다:고마워요, 밀리 스미스!위에 링크된 지리 도시 페이지에 있던 내용은 다음과 같습니다.

MOVS

movs 명령어는 소스 문자열을 대상에 복사하는 데 사용됩니다(예, 복사, 이동 아님).이 명령에는 두 가지 변형이 있습니다.movsb 및 movsw.movsb("문자열 바이트 이동")는 한 번에 1바이트씩 이동하는 반면 movsw는 한 번에 2바이트를 이동합니다.

한 번에 여러 바이트를 이동하고 싶기 때문에 이러한 movs 명령은 담당자 접두사를 사용하여 일괄적으로 수행됩니다.이동 횟수는 CX 레지스터에 의해 지정됩니다.아래 예를 참조하세요.

:
lds   si, [src]
les   di, [dest]
cld
mov   cx, 100
rep   movsb
:

이 예에서는 src에서 dest로 100바이트를 복사합니다.movsb를 movsw로 바꾸면 대신 200바이트가 복사됩니다.담당자 접두사를 제거하면 CX 레지스터는 아무런 영향을 미치지 않습니다.1바이트(movsb인 경우, movsw인 경우 2바이트) 이동합니다.

다른 팁

전기 톱은 제대로 사용하면 안전합니다. memcpy ()도 마찬가지입니다. 그러나 두 경우 모두 손톱에 닿으면 날아가서 상처를 입을 수 있습니다.

요컨대, Memcpy ()는 저수준 컴퓨팅에 필요하며 사라지지 않지만 고급 프로그래밍에는 필요하지 않습니다. 파이썬에는 memcpy ()가 없습니다.

귀찮게하지 마십시오. 마이크로 소프트 대안은 그다지 더 나은 것이 아닙니다. 주요 값은 코드가 Linux에 이루어질 수 없게된다는 것입니다. Microsoft는 구매 한 Visual C ++ 사본보다 고객에게 판매하는 OS에 대해 훨씬 더 많은 돈을 벌고 있습니다.

이 기사 자체는 더 안전한 대안을 설명합니다. Memcpy_S는 대상의 최대 길이를 지정해야합니다. 해당 숫자가 복사 할 바이트 양과 무관하게 제공되는 경우, 버퍼 오버플로를 방지하는 장벽 역할을합니다. 물론, 당신은 둘 다에 동일한 숫자를 제공함으로써이를 남용 할 수 있습니다.

내 코드에서 memcpy ()를 금지하고 있습니까? 더 나은 프로그래머와 응용 프로그램이 더 안전하거나 호환되지 않습니까? MS가 실제로 무엇이든 변경하고 싶거나 다른 컴파일러와 호환되지 않는 새로운 C 코드를 만들고 싶다면 불확실합니다. BTW. MS는 많은 기능 에서이 트릭을 수행하며 상당히 성가시다. strcpy-> strcpy_s-> StringCchCopy.

나는 C가 자신의 발을 쏘기 위해 프로그래머에게 옵션을 남겨 두어야한다고 생각합니다. 수동 메모리 관리는 제대로 수행하면 안전합니다.

"Microsoft는 Memcpy () 기능을 금지하고 있습니다. 보안 프로그래밍 상점, 나는 이해한다 기능에 내재 된 취약점,"

Memcpy () 및 수많은 다른 표준 기능이 취약성을 유발하는 것으로 알려져 있으므로, 안전한 프로그래밍 상점이 (점진적으로) 개선이 사소한 경우 왜 사용할 수 있습니까?

의심 할 여지없이 자신의 제품의 보안을 개선하려는 노력에서 코드 리뷰는 이러한 기능이 상당한 비율의 취약성, 버퍼 오버플로 등을 담당했음을 분명히 밝혔습니다. 모든 사람의 이익을 위해 컴파일러 경고 (금지가 아님)를 추가했습니다.

C99 또는 C ++ 98과 같은 이전 버전을 사용하거나 Solaris에서 사용하는 경우 Safe C 라이브러리가 설치되지 않으면 Memcpy_S를 사용할 수 없습니다.

Memcpy_S ()는 C11 이전에 ANSI를 포함한 비 MS 구현에는 자체 표준에 따라 존재하지 않는 Microsoft 별 구현입니다.

나는 Pro-MS와 Anti-MS 물건을 옆으로 두어야합니다. 왜냐하면 그것이 관련이 없기 때문입니다.

Memmove ()는 오버랩 문제를 해결하기 때문에 어쨌든 더 나은 솔루션입니다. Memmove_S ()는 더 강력하지만 C11 이하의 경우에만 다시.

대안은 전화하는 것입니다 memcpy_s

대신 memcpy_s ()를 사용해야합니다. 안전하지 않은 것으로 간주되는 다양한 다른 기능에 대해 동일한 종류의 _S 버전이 존재합니다.

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