TLSH es una biblioteca de coincidencias difusas. Dado un flujo de bytes con una longitud mínima de 50 bytes, TLSH genera un valor hash que puede usarse para comparaciones de similitud. Los objetos similares tendrán valores hash similares, lo que permite la detección de objetos similares comparando sus valores hash. Tenga en cuenta que el flujo de bytes debe tener una complejidad suficiente. Por ejemplo, un flujo de bytes idénticos no generará un valor hash.
10/08/2024
Versión de lanzamiento 4.10.x: una herramienta de agrupación en clústeres de Python.
Consulte el directorio tlshCluster.
Voy a intentar hacer de 4.12.0 una versión de lanzamiento y crear una biblioteca Python py-tlsh a partir de 4.12.0. 4.12.0 incluye: Solicitud de extracción de fusión n.º 137: esto solucionó una pérdida de memoria en la solicitud de extracción de fusión py-tlsh n.º 134 - esto mejoró ifdef WINDOWS para que sea más portátil. 4.12.1 incluye: Fusionar solicitud de extracción #146 - Eliminar la llamada a sprintf() para evitar advertencias Solicitud de extracción de combinación n.° 141 - py_ext: use PyVarObject_HEAD en lugar de PyObject_HEAD_INIT Solicitud de extracción de combinación n.° 138 - Compilación: defina opciones predeterminadas solo en la solicitud de extracción de combinación "predeterminada" n.° 136 - Corrección de errores+Portabilidad: Mejore la portabilidad mediante división integral
2020
adoptado por Virus Total
adoptado por Malware Bazaar
Hemos agregado un identificador de versión ("T1") al inicio del resumen. Utilice versiones de TLSH que tengan el encabezado T1. El código es compatible con versiones anteriores, aún puede leer e interpretar 70 cadenas de caracteres hexadecimales como resúmenes de TLSH. Y los conjuntos de datos pueden incluir combinaciones de resúmenes nuevos y antiguos. Si necesita que se generen resúmenes TLSH de estilo antiguo, utilice la opción de línea de comando '-old'
Gracias a Chun Cheng, que era un ingeniero humilde y talentoso.
El programa en modo predeterminado requiere un flujo de bytes de entrada con una longitud mínima de 50 bytes (y una cantidad mínima de aleatoriedad; consulte la nota en la extensión de Python a continuación).
Para mantener la coherencia con versiones anteriores, existe una opción conservadora que impone un límite de 256 bytes. Ver notas para la versión 3.17.0 de TLSH
El hash calculado es de 35 bytes de datos (la salida es 'T1' seguida de 70 caracteres hexadecimales. Longitud total 72 caracteres). El 'T1' se ha agregado como número de versión del hash, para que podamos adaptar el algoritmo y seguir manteniendo la compatibilidad con versiones anteriores. Para obtener el estilo antiguo de 70 hashes hexadecimales, utilice la opción de línea de comando -old.
Los bytes 3,4,5 se utilizan para capturar la información sobre el archivo en su totalidad (longitud,...), mientras que los últimos 32 bytes se utilizan para capturar información sobre partes incrementales del archivo. (Tenga en cuenta que la longitud del hash se puede aumentar cambiando los parámetros de compilación que se describen a continuación en CMakeLists.txt, lo que aumentará la información almacenada en el hash. Para algunas aplicaciones, esto podría aumentar la precisión en la predicción de similitudes entre archivos).
La compilación de TLSH (ver más abajo) creará una biblioteca estática en el directorio lib
y el ejecutable tlsh
(un enlace simbólico a tlsh_unittest
). 'tlsh' enlaza a la biblioteca estática, en el directorio bin
. La biblioteca tiene la funcionalidad de generar el valor hash a partir de un archivo determinado y calcular la similitud entre dos valores hash.
tlsh
es una utilidad para generar valores hash TLSH y comparar valores hash TLSH para determinar la similitud. Ejecútelo sin parámetros para un uso detallado.
Un puerto JavaScript disponible en el directorio js_ext
.
Hay un puerto Java disponible en el directorio java
.
Enumeramos estos puertos solo como referencia. No hemos verificado el código en estos repositorios y no hemos verificado que los resultados sean idénticos a TLSH aquí. También solicitamos que cualquier puerto incluya los archivos LICENCIA y NOTICE.txt exactamente como aparecen en este repositorio.
Otro puerto Java está disponible aquí.
Otro puerto Java está disponible aquí.
Un puerto de Golang está disponible aquí.
Un puerto Ruby está disponible aquí
Descargue TLSH de la siguiente manera:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip unzip master.zip cd tlsh-master
o
git clone git://github.com/trendmicro/tlsh.git cd tlsh git checkout master
Edite CMakeLists.txt para crear TLSH con diferentes opciones.
TLSH_BUCKETS: determina que el uso de 128 o 256 depósitos utiliza los 128 depósitos predeterminados, a menos que sea un experto y sepa que necesita 256 depósitos.
TLSH_CHECKSUM_1B: determina la longitud de la suma de verificación; más tiempo significa menos colisión; use el byte predeterminado de 1 byte, a menos que sea un experto y sepa que necesita una suma de verificación mayor.
Ejecutar:
make.sh
Nota: La compilación de TLSH en Linux depende de que cmake
cree el Makefile
y luego make
el proyecto, por lo que la compilación fallará si cmake
no está instalado. Para instalar el compilador cmake/gcc en CentOs o Amazon Linux: $ sudo yum install cmake $ sudo yum install gcc-c++
Agregado en marzo de 2020. Consulte las instrucciones en README.mingw.
Utilice los archivos de solución tlsh específicos de la versión (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) en el directorio de Windows.
Consulte tlsh.h para conocer la interfaz de la biblioteca tlsh y tlsh_unittest.cpp y simple_unittest.cpp en el directorio test
para ver un código de ejemplo.
Recientemente creamos un paquete Python en PyPi: https://pypi.org/project/py-tlsh/
py-tlsh reemplaza el paquete python-tlsh. Para obtener más información, consulte el número 94.
Para instalar este paquete
$ pip install py-tlsh
Si necesita crear su propio paquete de Python, hay un archivo README.python con notas sobre la versión de Python.
(1) compile the C++ code $./make.sh (2) build the python version $ cd py_ext/ $ python ./setup.py build (3) install - possibly - sudo, run as root or administrator $ python ./setup.py install (4) test it $ cd ../Testing $ ./python_test.sh
importar tlshtlsh.hash (datos)
Los datos de nota deben ser bytes, no una cadena. Esto se debe a que TLSH es para datos binarios y los datos binarios pueden contener un byte NULL (cero).
En el modo predeterminado, los datos deben contener al menos 50 bytes para generar un valor hash y deben tener una cierta cantidad de aleatoriedad. Para obtener el valor hash de un archivo, intente
tlsh.hash(abrir(archivo, 'rb').read())
Nota: la declaración abierta ha abierto el archivo en modo binario.
importar tlshh1 = tlsh.hash(data)h2 = tlsh.hash(similar_data)score = tlsh.diff(h1, h2)h3 = tlsh.Tlsh()with open('file', 'rb') as f:for buf en iter(lambda: f.read(512), b''):h3.update(buf)h3.final()# esta afirmación indica que la distancia entre un TLSH y él mismo debe ser zeroassert h3.diff(h3) == 0score = h3.diff(h1)
La función diffxlen
elimina de la comparación el componente de longitud del archivo del encabezado tlsh.
tlsh.diffxlen(h1, h2)
Si se compara un archivo con un patrón repetido con un archivo con una sola instancia del patrón, la diferencia aumentará si se incluye la longitud del archivo. Pero al utilizar la función diffxlen
, la longitud del archivo no se tendrá en cuenta.
Si utiliza la opción "conservadora", los datos deben contener al menos 256 caracteres. Por ejemplo,
importar ostlsh.conservativehash(os.urandom(256))
debería generar un hash, pero
tlsh.conservativehash(os.urandom(100))
generará TNULL ya que tiene menos de 256 bytes.
Si necesita generar hashes de estilo antiguo (sin el prefijo "T1"), utilice
tlsh.oldhash(os.urandom(100))
Las opciones antiguas y conservadoras se pueden combinar:
tlsh.oldconservativehash(os.urandom(500))
Para mejorar la precisión de la comparación, TLSH rastrea la distribución de la altura del cucharón en cuartiles. Una diferencia de cuartil mayor da como resultado una puntuación de diferencia más alta.
Utilice especialmente 6 trigramas para brindar una representación igual de los bytes en la ventana deslizante de 5 bytes, lo que produce mejores resultados.
El hash de Pearson se utiliza para distribuir los recuentos de trigramas a los depósitos de recuento.
La puntuación de similitud global distancia objetos con una diferencia de tamaño significativa. La similitud global se puede desactivar. También distancia objetos con diferentes distribuciones de cuartiles.
TLSH se puede compilar para generar cadenas hash de 70 o 134 caracteres. La versión más larga que se creó para usar las cadenas hash de 70 caracteres no funciona para su aplicación.
La similitud de TLSH se expresa como una puntuación de diferencia:
Una puntuación de 0 significa que los objetos son casi idénticos.
Para el hash de 72 caracteres, hay una tabla detallada de tasas de detección experimentales y tasas de falsos positivos basadas en el umbral. ver Tabla II en la página 5
Consulte el código Python y los cuadernos de Jupyter en tlshCluster.
Proporcionamos código Python para el método HAC-T. También proporcionamos código para que los usuarios puedan utilizar DBSCAN.
Mostramos a los usuarios cómo crear dendogramas para archivos, que son un diagrama útil que muestra las relaciones entre archivos y grupos.
Proporcionamos herramientas para agrupar el conjunto de datos de Malware Bazaar, que contiene unos cientos de miles de muestras.
El método HAC-T se describe en HAC-T y búsqueda rápida de similitudes en seguridad.
Jonathan Oliver, Chun Cheng y Yanggui Chen, TLSH: un hash sensible a la localidad. Cuarto taller sobre ciberdelincuencia e informática confiable, Sídney, noviembre de 2013
Jonathan Oliver, Scott Forman y Chun Cheng, Uso de la aleatorización para atacar resúmenes de similitudes. ATIS 2014, noviembre de 2014, páginas 199-210
Jonathan Oliver, Muqeet Ali y Josiah Hagen. HAC-T y búsqueda rápida de similitudes en seguridad 2020 Conferencia Internacional sobre Sistemas Inteligentes Omnicapa (COINS). IEEE, 2020.
4.12.1
10/08/2024 Fusionar solicitud de extracción n.° 146: eliminar la llamada a sprintf() para evitar advertencias Solicitud de extracción de fusión n.° 141 - py_ext: use PyVarObject_HEAD en lugar de PyObject_HEAD_INIT Solicitud de extracción de fusión n.° 138: compilación: defina las opciones predeterminadas solo en "predeterminado" Solicitud de extracción de fusión n.° 136: corrección de errores + portabilidad: mejorar la portabilidad mediante división integral
ver Change_History.md