Escenario: Integridade con hash e ataques
Introdución
Este escenario ten como principal obxectivo explicar a base dos mecanismos que permiten verificar a integridade da información, impedindo que esta sexa modificada de forma inadvertida. Ademáis, os conceptos que se revisan neste escenario servirán para comprender unha parte do funcionamento dos protocolos SSL/TLS e do proceso de firma electrónica.
Neste escenario realizaranse as accións necesarias para:
- Descargar a imaxen iso de Ubuntu Server 16.0.4.6 e os arquivos cos hashes md5, sha1 e sha256.
- Calcular o hash md5 da imaxen iso descargada usando a utilidade md5sum e verificar que se corresponde co esperado.
- Calcular o hash sha-1 da imaxen iso descargada usando a utilidade sha1sum e verificar que se corresponde co esperado.
- Calcular o hash sha-256 da imaxen iso descargada usando a utilidade sha256sum e verificar que se corresponde co esperado.
- Instalar a utilidade gráfica GtkHash e verificar novamente os hashes md5, sha-1 e sha-256.
NOTA. O motivo de usar a imaxen de Ubuntu Server 16.0.4.6 é para traballar os hashes md5, sha-1 e sha-256, xa que a partir da versión 18.04 Canonical únicamente proporciona o hash sha-256.
Funcións hash
Unha función hash é unha función matemática que converte un conxunto de datos noutro, normalmente nunha cadea de lonxitude fixa. O valor devolto pola función hash chámase resumo, checksum, suma hash ou hash. As funcións hash tamén son coñecidas como funcións resumo ou funcións digest. A seguinte imaxe exemplifica o funcionamento dunha función hash:
Funcionamento dunha función hash
Fig. Funcionamento das funcións hash. Fonte: Wikipedia. Licenza CC BY-SA 3.0.
A modo de exemplo, creamos un arquivo de texto e calculamos o hash MD5 usando o comando md5sum en Linux Ubuntu:
$ nano arquivo.txt ola mundo $ cat arquivo.txt ola mundo md5sum arquivo.txt 2c61dba1b7d13d2224bb94a08044cc96 arquivo.txt
O resultado 2c61dba1b7d13d2224bb94a08044cc96 é o resumo ou hash do noso arquivo. Ó aplicar unha función hash a un documento ou ficheiro o valor resumo é unha cadea que identifica inequívocamente o contido.
Pódese entender o resumo como o 'adn' que identifica únivocamente a ese arquivo; é dicir, non vai haber outro arquivo co mesmo adn (resumo ou hash).
De feito, se o contido do arquivo cambia, tamén cambiará o hash:
$ nano arquivo.txt ola mundo adeus mundo $ cat arquivo.txt ola mundo adeus mundo $ md5sum arquivo.txt aec5dd5542ecd96b30b773a475624c7d arquivo.txt
Hai dúas características moi interesantes das funcións hash:
- Funcionan nunha soa dirección; e polo tanto, é imposible calcular os datos orixinais a partir do valor resumo.
- O valor resumo, resultado de aplicar a función hash a un documento, é unha cadea que identifica inequívocamente o contido.
Estas características fan que as funcións hash se usen para:
- Comprobación da integridade dun ficheiro: as funcións hash permiten saber se un ficheiro sufriu modificacións; xa que un cambio no contido do ficheiro, tradúcese nun valor resumo diferente. Esto permite usar as funcións hash para:
- Comprobar se un arquivo descargado/enviado/almacenado corrompeuse (erros fortuitos). Por exemplo, verificar a validez dunha imaxe iso descargada antes de queimala nun CD.
- Comprobar se o contido de arquivos de configuración, binarios do sistema, …, sufriu modificacións. Por exemplo, calcúlase o hash de determinados arquivos de configuración e binarios do sistema. Se o equipo fose asaltado e o atacante realizase modificacións nalgún arquivo de configuración ou binario, podería detectarse xa que os hashes deses arquivos cambiaron. Esta técnica é usada por sistemas HIDS (host-based intrusion detection system) como tripwire e OSSEC.
- Identificación de ficheiros: como o hash depende do contido do arquivo é posible identificar arquivos con independencia do seu nome e/ou ubicación. Un exemplo desta funcionalidade pódese atopar no software Vicus da Garda Civil, reeemprazo de Hispalis. Vicus rastrexa os hashes dos arquivos que se intercambian en redes P2P e compáraos cos hashes de vídeo e fotografías de carácter pedófilo das súas bases de datos. Se coincide o hash dun arquivo da rede P2P co hash dun arquivo da base de datos da Garda Civil, quere dicir que na rede P2P hai material ilícto.
- Almacenamento de contrasinais: en vez de gardar o contrasinal dos usuarios, gárdase o hash do contrasinal. Cando un usuario quere autenticarse indicando o seu contrasinal, calcúlase o hash e compárase co valor do hash almacenado.
Un exemplo podémolo atopar no arquivo de contrasinais /etc/shadow dos sistemas Linux:
$ sudo cat /etc/shadow [sudo] password for magasix: root:!:16250:0:99999:7::: ... landscape:*:16250:0:99999:7::: magasix:$6$S3lsgIO5$0nEdz4z9yddTWla2TzS1M3cGscwgXTfwlcnYVSM3fT/3HR1YG2otS6DWBJZgvpOOgz0jS/GITsiziVsW/W2Ct0:16250:0:99999:7::: tecnico:$6$RTCAje1r$HwfQCdL0NnoVie6hDFVKoies6l1SA5GlPvnDajLQvRjeh9TowrFOIg6keBT8svp4p1oQSBM3xbhI0c7R5FXj5/:16719:0:99999:7::: ...
O campo password ten o seguinte formato: $*A$*B$*C
- A --> número que indica o tipo de función hash usada.
- 1 para MD5. - 2 para Blowfish. - 3 para NT Hash. - 5 para SHA-256. - 6 para SHA-512. - y para Yescrypt, que é o sistema que están a adoptar distribucións como Debian, Ubuntu, Fedora, Arch, ..., xa que presenta melloras que ralentizan os ataques de contrasinais.
- B: Salt. Combinación aleatoria usada para crear o hash do contrasinal pensada para dificultar a recuperación do contrasinal en caso de ataque (dúas contrasinais iguais pero con diferente salt teñen hashes distintos).
- C: Hash calculado a partir do contrasinal e o salt.
Colisións
Unha colisión hash prodúcese cando dúas entradas diferentes a unha función hash producen o mesmo valor resumo. No exemplo da seguinte imaxe pode verse unha colisión; xa que dous valores diferentes de entrada (John Smith e Sandra Dee), levan ó mesmo hash.
Colisión en función hash
Fig. Colisión hash. Fonte: Wikipedia. Licenza Dominio Público.
Cando o rango de posibles valores resumo é menor que o rango de posibles valores de entrada haberá colisións. En criptografía, acéptase o uso de funcións hash especialmente deseñadas para garantir que as colisións son computacionalmente imposibles; é dicir, o tempo para lograr unha colisión hash é tan grande que non se considera factible. Exemplos de funcións hash usadas en criptografía son MD5 (Message Digest Algorithm), SHA (Secure Hash Algorith) e RIPEPMD-160.
A finais de 2008, e tras descubrirse varios erros no deseño, MD5 foi considerado criptográficamente roto e non apto para o seu uso polo departamento de seguridade nacional de EEUU. Algo semellante sucedeu con SHA-1 polo que a partir do ano 2010 recomendouse o uso de SHA-2.
Hai que valorar a importancia das colisións en funcións hash; xa que en función do campo de aplicación, pode ter unha importancia relativa. Unha colisión hash supón que dous documentos con contidos diferentes teñen o mesmo resumo hash. Outra cousa é que o contido deses arquivos teña algún sentido. Sen embargo, e como xa se indicou no punto anterior, recoméndase o uso de funcións hash sen problemas coñecidos.