Pregunta

Recientemente me topé con un artículo que las reclamaciones de Microsoft es la prohibición de la memcpy() función en su seguro de programación de tiendas.Entiendo las vulnerabilidades inherentes a la función, sino que es necesario prohibir su uso en su totalidad?

Debería programas escribo evitar memcpy() por completo, o sólo asegurarse de que se utiliza de forma segura?¿Qué alternativas existen que son similares, pero más seguro functionalilty?

¿Fue útil?

Solución

Microsoft proporciona alternativas a memcpy y wmemcpy que validar sus parámetros.

memcpy_s dice, "Hmm, antes de que he leído de esta dirección, déjame comprobar por mí mismo que no es un puntero null;y antes de que me escriba a esta dirección, voy a realizar la prueba de nuevo.Voy a comparar el número de bytes que se me ha pedido copia a la supuesta tamaño de la de destino;si y sólo si la llamada pasa todas estas pruebas puedo realizar la copia."

memcpy dice "Cosas del destino en un registro, cosas de la fuente en un registro, las cosas que el recuento en un registro, realizar MOVSB o MOVSW." (Ejemplo en geocities, no es mucho para este mundo: http://www.geocities.com/siliconvalley/park/3230/x86asm/asml1013.html)

Editar:Para un ejemplo en la naturaleza de la Su Deseo Es Mi Comando enfoque memcpy, considere la posibilidad de OpenSolaris, donde memcpy es (para algunas configuraciones) se define en términos de bcopy, y bcopy (para algunas configuraciones) es ...

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

Editar:Gracias, Millie Smith!Aquí es lo que estaba en la página de geocities he enlazado más arriba:

MOVS

La instrucción movs se utiliza para copiar la cadena de origen en el de destino (sí, copia, no se mueva).Esta instrucción tiene dos variantes:movsb y movsw.El movsb ("mover cadena de byte") se mueve un byte a la vez, mientras que movsw mueve dos bytes a la vez.

Ya nos gustaría a mover varios bytes al mismo tiempo, estos movs instrucciones que se realizan en lotes con prefijo rep.El número de movimientos es especificado por el registro CX.Véase el siguiente ejemplo:

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

En este ejemplo se va a copiar 100 bytes de src a dest.Si reemplaza movsb con movsw, copia de 200 bytes en lugar.Si se quita el prefijo rep, el registro CX no tendrá ningún efecto.Usted va a mover un byte (si es que movsb, o 2 bytes si es movsw).

Otros consejos

Una motosierra, si se utiliza correctamente, es seguro. Lo mismo con el establecimiento de memoria (). Pero en ambos casos, si se golpea un clavo, se puede volar y hacer daño.

En resumen, memcpy () se requiere para la computación de bajo nivel y no va a desaparecer, pero para programación de alto nivel que no lo necesita. No hay ningún establecimiento de memoria () en Python.

No se moleste. Microsofts alternativas no son mucho mejores. El valor principal es que éstos causan su código se convierta en no portables para Linux. Microsoft está haciendo mucho más dinero en el sistema operativo que venden a sus clientes de lo que están haciendo en la copia de Visual C ++ que compró.

El propio artículo describe una alternativa más segura: memcpy_s, lo que requiere que se especifique la longitud máxima del objetivo. Cuando se proporciona independiente de la cantidad de bytes a copiar ese número, actúa como una barrera para impedir desbordamiento de búfer. Por supuesto, se puede abusar de que al dar el mismo número a ambos.

es la prohibición de establecimiento de memoria () en mi código hacerme un mejor programador y mi aplicación más segura o simplemente más incompatibles? Estoy seguro, si MS realmente quiere cambiar nada o simplemente hacer cualquier nuevo código C incompatible con otros compiladores. Por cierto. MS hace este truco en muchas funciones y es bastante molesto. strcpy -> strcpy_s -.> StringCchCopy

Creo que C debe dejar una opción para el programador para rodar su propio pie. gestión de memoria manual es seguro si se hace correctamente.

Usted lo ha dicho: "Microsoft es la prohibición de la función memcpy () en sus tiendas de programación segura , entiendo los vulnerabilidades inherentes a la función "

memcpy () y una plétora de otras funciones estándar son conocidos por causar vulnerabilidades, por lo que ¿por qué una tienda de programación segura permiten su uso cuando un (incrementales aunque) la mejora es trivial?

Sin duda, en sus esfuerzos por mejorar la seguridad de sus propios productos, las revisiones de código indica claramente que estas funciones eran responsables de una proporción significativa de las vulnerabilidades, los desbordamientos de búfer, etc. En lugar de hacer contenedores para uso interno que les introdujeron en la biblioteca estándar y ha añadido un compilador de advertencia (no una prohibición) para el beneficio de todos.

Si está utilizando versiones más antiguas, como C99 o C ++ 98, o en Solaris, no se puede utilizar memcpy_s, a menos que tenga instalada la biblioteca de seguridad C.

memcpy_s () es una implementación específica de Microsoft que no existe en implementaciones no-MS, incluyendo ANSI, antes de la C11, por sus propias normas.

Voy a dejar las cosas a favor de la MS y anti-MS a un lado, porque es irrelevante.

memmove () es una mejor solución de todos modos ya se abordó la cuestión de la superposición. memmove_s () es más robusta, pero de nuevo, sólo si estás en C11 o posterior.

La alternativa es llamar memcpy_s

Se supone que para utilizar memcpy_s () en su lugar. El mismo tipo de _S versiones existe para una variedad de otras funciones consideradas como no seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top