¿Cuál es el algoritmo correcto al sumar una parte del código?

2

Como parte de mi investigación, encontré una técnica en un documento que aplica la suma de comprobación en una parte del código. Quiero implementarlo. Aquí está el documento de investigación que habla sobre el técnico de guardia de suma de comprobación.

Aquí está la plantilla de guardia:

guard:
      add ebp, -checksum
      mov eax, client_addr

for:
      cmp eax, client_end
      jg end
      mov ebx, dword[eax]
      add ebp, ebx
      add eax, 4
      jmp for
end:

Como puede ver, aquí solo se realiza la adición de códigos de operación. ¿Alguien puede sugerir un método más fuerte de hacerlo? Además, ¿alguien sugirió técnicas de autenticación de mensajes como MAC, firmas digitales, cifrado auténtico? ¿Cuál sería el mejor método?

    
pregunta ak0817 02.05.2016 - 08:58
fuente

1 respuesta

1

Espero que entiendas que esto es seguridad a través de la oscuridad y no proporciona un nivel de integridad significativo contra un adversario que intenta modificar tu código en la memoria. Para que esto sea efectivo de cualquier manera, la unidad de ejecución de la CPU debería ser la que verifique la suma de comprobación, permitiendo que el código modificado simplemente se niegue a ejecutar. Si la comprobación es completamente en software, un atacante podría modificar de forma bastante trivial la suma de comprobación para que coincida con el código modificado antes de que se ejecute.

Dicho esto, el método a utilizar sería un hash de algún tipo. Hay tres tipos de hashes:

  • Checksums implica la adición de una representación numérica de cada componente de los datos, multiplicada por un factor de ponderación. Las sumas de control son extremadamente rápidas, pero no son criptográficamente seguras y, a menudo, pueden omitir los datos modificados, incluso en circunstancias ideales.

    Un ejemplo es Fletcher-64 .

  • Las comprobaciones de redundancia cíclica utilizan el resto de la división polinómica de los contenidos como un resumen. El polinomio se selecciona cuidadosamente para aumentar la posibilidad de detectar modificaciones. Generalmente son muy rápidos, pero un actor malintencionado puede "romperlos" trivialmente.

    Un ejemplo es CRC32 .

  • Las funciones hash criptográficamente seguras son mucho más lentas que las otras opciones, pero están diseñadas para reducir la posibilidad de que dos entradas con contenidos diferentes se resuelvan en el mismo resumen, independientemente de cómo se generen. Las funciones no resistentes a la colisión pueden tener cualquier tamaño de digestión. Para ser resistentes a las colisiones, necesitan un tamaño de compendio más grande, como 160 bits.

    Un ejemplo resistente a la colisión es SHA-256 . Un ejemplo no resistente a la colisión es SipHash .

Dado que solo está escribiendo una prueba de concepto, debe utilizar una suma de comprobación simple y rápida o CRC. Una implementación adecuada usaría hardware personalizado que verifique un hash criptográficamente seguro como SHA-256 como parte de un árbol hash firmado digitalmente. Si tiene acceso al hardware con SSE4.2 (consulte página 61), puede usar una implementación acelerada por hardware de CRC32c (usando polinomio 0x11EDC6F41 ). Esto permite que se genere un resumen usando una instrucción para cada QWORD de datos a procesar, usando la instrucción crc32q . De lo contrario, querría usar una suma de comprobación muy rápida y extremadamente simple como CrapWow o Murmur . Será suficiente para una prueba de concepto.

    
respondido por el forest 07.02.2018 - 05:54
fuente

Lea otras preguntas en las etiquetas