Parecen iguales, pero son diferentes - ataques visuales con Unicode
¿apple.com y аpple.com se ven iguales? En realidad son diferentes. La primera "а" de la segunda URL no es la "a" latina, sino la "а" cirílica (U+0430). Para el ojo humano son indistinguibles, pero para un ordenador son caracteres completamente diferentes y, por tanto, dominios diferentes.
Unicode es un sistema revolucionario que permite manejar de forma unificada los caracteres de todo el mundo, pero su rico conjunto de caracteres también se convierte en una amenaza de seguridad.
Ataque homógrafo - cómo crear dominios falsos
El ataque homógrafo (IDN homograph attack) consiste en crear nombres de dominio falsos usando caracteres diferentes que se ven iguales (o muy similares).
- La "a" latina (U+0061) y la "а" cirílica (U+0430)
- La "o" latina (U+006F) y la "о" cirílica (U+043E)
- La "p" latina (U+0070) y la "р" cirílica (U+0440)
- La "e" latina (U+0065) y la "е" cirílica (U+0435)
Combinándolos, se puede crear аррle.com (la «а» inicial y las dos «р» son cirílicas), un nombre de dominio visualmente indistinguible de apple.com. Si se usa como URL de un sitio de phishing, incluso los usuarios más atentos podrían ser engañados.
Contramedidas de los navegadores
Los principales navegadores, como contramedida contra los ataques homógrafos, muestran los nombres de dominio con scripts mixtos (que mezclan múltiples sistemas de escritura) en notación Punycode. El аррle.com anterior mezcla cirílico y latino, así que la barra de direcciones muestra xn--le-6kc8da.com y el engaño queda a la vista de inmediato.
Ahora bien, la palochka cirílica (U+04CF) se parece tanto a la «l» latina que un atacante puede escribir la etiqueta entera solo en cirílico (аррӏе.com = xn--80ak6aa92e.com). El estándar técnico UTS #39 de Unicode llama a esta forma whole-script confusable y, como no cumple la condición de scripts mixtos, los navegadores deben sumar otros criterios, como mostrar en Punycode también las etiquetas de un solo script que se parezcan mucho a dominios conocidos.
Caracteres invisibles - la amenaza de los caracteres de ancho cero
Unicode incluye varios "caracteres de ancho cero" que no se muestran en pantalla:
- U+200B: Zero Width Space (espacio de ancho cero)
- U+200C: Zero Width Non-Joiner
- U+200D: Zero Width Joiner
- U+FEFF: Zero Width No-Break Space (BOM)
Estos caracteres son invisibles, pero afectan a la comparación de cadenas y al cálculo de hashes:
- Marca de agua (watermark): existe una técnica que inserta caracteres de ancho cero en documentos confidenciales para identificar quién los filtró. Insertando patrones diferentes de caracteres de ancho cero para cada destinatario, se puede identificar al responsable de la filtración a partir del patrón del documento filtrado
- Problemas con contraseñas: al introducir una contraseña mediante copiar y pegar, si se infiltran caracteres de ancho cero, se produce la situación de "la contraseña es correcta pero no puedo iniciar sesión"
- Alteración de código: ataque que crea código fuente de aspecto idéntico pero comportamiento distinto. Trojan Source (CVE-2021-42574), publicado en 2021, es el caso representativo de esta técnica: su núcleo son los caracteres de control direccional de la sección siguiente, mientras que los caracteres de ancho cero y los homógrafos se emplean como variantes
Caracteres de control de dirección - manipulando el flujo del texto
Unicode incluye caracteres que controlan la dirección de visualización del texto. Como el árabe y el hebreo se escriben de derecha a izquierda, estos caracteres de control tienen usos legítimos, pero también se explotan en ataques.
- U+202E: Right-to-Left Override. Fuerza la visualización del texto de derecha a izquierda a partir de este carácter
Por ejemplo, el nombre de archivo document_fdp.exe se muestra en pantalla como document_exe.pdf. El usuario cree que es un archivo PDF y hace doble clic, pero en realidad es un archivo .exe (ejecutable).
Lo que los desarrolladores deben tener en cuenta
- Al aceptar entrada de usuarios, sanitizar (eliminar) caracteres de ancho cero y caracteres de control de dirección
- En la validación de nombres de dominio, convertir a Punycode antes de comparar
- En la visualización de nombres de archivo, eliminar o escapar los caracteres de control de dirección
- En las revisiones de código, usar herramientas que detecten la infiltración de caracteres de ancho cero (ej:
grep -P '[\x{200B}-\x{200F}\x{202A}-\x{202E}]')
Resumen
Unicode es un gran sistema que permite manejar de forma unificada los caracteres de todo el mundo, pero su riqueza también se convierte en una amenaza de seguridad. Ataques homógrafos, caracteres de ancho cero, caracteres de control de dirección - conocer estas amenazas aumenta tu vigilancia ante URLs de sitios de phishing y nombres de archivo sospechosos. Cuando accedas a IP Check-san, adquiere el hábito de verificar que el nombre de dominio en la barra de URL sea correcto.
Términos del glosario relacionados
Preguntas frecuentes
¿Qué propiedad de Unicode aprovechan los ataques homográficos?
Que dos caracteres de forma parecida siguen siendo puntos de código distintos: la 'a' latina es U+0061 y la 'а' cirílica es U+0430. Como el nombre de dominio se convierte a Punycode antes de resolverse, basta un carácter diferente para acabar en otro servidor.
¿Qué son los caracteres de ancho cero?
Los caracteres de ancho cero son caracteres Unicode invisibles que no ocupan espacio visible pero existen en el texto. Pueden usarse como marcas de agua invisibles para rastrear filtraciones de documentos, pero también de forma maliciosa para manipular código, eludir filtros o crear cadenas que parecen idénticas pero se comportan de forma diferente.
¿Protegen los navegadores frente a los ataques homográficos?
Los principales navegadores muestran en notación Punycode los nombres de dominio que mezclan alfabetos. Sin embargo, una etiqueta escrita por completo en un solo alfabeto (lo que UTS #39 llama whole-script confusable) no cumple esa condición, así que los navegadores valoran además cuánto se parece el nombre a un dominio conocido. Más que confiar en el nombre que aparece en pantalla, conviene acostumbrarse a revisar la grafía carácter por carácter: es la última línea de defensa.