TLSH はあいまい一致ライブラリです。最小長が 50 バイトのバイト ストリームを指定すると、TLSH は類似性の比較に使用できるハッシュ値を生成します。類似したオブジェクトは類似したハッシュ値を持つため、ハッシュ値を比較することで類似したオブジェクトを検出できます。 バイト ストリームには十分な複雑さが必要であることに注意してください。 たとえば、同一バイトのバイト ストリームはハッシュ値を生成しません。
2024 年 8 月 10 日
リリース バージョン 4.10.x - Python クラスタリング ツール。
ディレクトリ tlshCluster を参照してください。
4.12.0 をリリース バージョンにして、4.12.0 から py-tlsh Python ライブラリを構築しようとします。 4.12.0 には以下が含まれます: マージ プル リクエスト #137 - これにより、py-tlsh のメモリ リークが修正されました マージ プル リクエスト #134 - これにより、ifdef WINDOWS が移植性を高めるために改善されました。 4.12.1 には以下が含まれます: プル リクエスト #146 をマージ - sprintf() への呼び出しを削除警告を回避する マージ プル リクエスト #141 - py_ext: PyObject_HEAD_INIT の代わりに PyVarObject_HEAD を使用する マージ プル リクエスト #138 - ビルド: 「デフォルト」でのみデフォルト オプションを定義する マージ プル リクエスト #136 - バグ修正 + 移植性: 整数除算による移植性の向上
2020年
Virus Total社に採用されました
Malware Bazaarに採用されました
ダイジェストの先頭にバージョン識別子 (「T1」) を追加しました。 T1 ヘッダーを持つバージョンの TLSH を使用してください。コードには下位互換性があり、70 の 16 進文字列を TLSH ダイジェストとして読み取って解釈できます。また、データ セットには古いダイジェストと新しいダイジェストが混在している場合があります。古い形式の TLSH ダイジェストを出力する必要がある場合は、コマンド ライン オプション '-old' を使用します。
謙虚で才能のあるエンジニアだった Chun Cheng に感謝します。
デフォルト モードのプログラムでは、最小長が 50 バイトの入力バイト ストリームが必要です (および最小量のランダム性 - 以下の Python 拡張機能の注意を参照してください)。
古いバージョンとの一貫性を保つために、256 バイト制限を強制する -conservative オプションがあります。 TLSH バージョン 3.17.0 のメモを参照してください。
計算されたハッシュは 35 バイトのデータです (「T1」に 70 個の 16 進文字が続いて出力されます。合計の長さは 72 文字です)。 「T1」はハッシュのバージョン番号として追加されているため、アルゴリズムを適応させながら下位互換性を維持できます。古いスタイルの 70 16 進ハッシュを取得するには、-old コマンド ライン オプションを使用します。
バイト 3、4、5 はファイル全体に関する情報 (長さなど) を取得するために使用され、最後の 32 バイトはファイルの増分部分に関する情報を取得するために使用されます。 (ハッシュの長さは、CMakeLists.txt で後述するビルド パラメーターを変更することで増やすことができます。これにより、ハッシュに保存される情報が増加します。一部のアプリケーションでは、これによりファイル間の類似性の予測精度が向上する可能性があります。)
TLSH をビルドすると (以下を参照)、静的ライブラリがlib
ディレクトリに作成され、 tlsh
実行可能ファイル ( tlsh_unittest
へのシンボリック リンク) が作成されます。 「tlsh」は、 bin
ディレクトリ内の静的ライブラリにリンクします。このライブラリには、指定されたファイルからハッシュ値を生成し、2 つのハッシュ値間の類似性を計算する機能があります。
tlsh
TLSH ハッシュ値を生成し、TLSH ハッシュ値を比較して類似性を判断するためのユーティリティです。 詳細な使用方法については、パラメータを指定せずに実行してください。
js_ext
ディレクトリで利用可能な JavaScript ポート。
Java ポートはjava
ディレクトリで使用できます。
参考のためにこれらのポートをリストします。これらのリポジトリ内のコードはチェックしておらず、結果がここでの TLSH と同一であるかどうかもチェックしていません。また、すべてのポートに、このリポジトリに表示されるファイル LICENSE および NOTICE.txt を正確に含めるように要求します。
別の Java ポートはここで利用できます。
別の Java ポートはここで利用できます。
Golang ポートはここから入手できます。
Ruby ポートはここから入手できます
次のように TLSH をダウンロードします。
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip unzip master.zip cd tlsh-master
または
git clone git://github.com/trendmicro/tlsh.git cd tlsh git checkout master
CMakeLists.txt を編集して、さまざまなオプションを使用して TLSH を構築します。
TLSH_BUCKETS: 128 または 256 バケットを使用するかどうかを決定します。専門家で 256 バケットが必要であることがわかっている場合を除き、デフォルトの 128 バケットを使用します。
TLSH_CHECKSUM_1B: チェックサムの長さを決定します。長いほど衝突が少なくなります。専門家で、より大きなチェックサムが必要であることがわかっている場合を除き、デフォルトの 1 バイトを使用します。
実行する:
make.sh
注: Linux での TLSH のビルドは、 cmake
に依存してMakefile
作成し、プロジェクトmake
ため、 cmake
がインストールされていない場合、ビルドは失敗します。 CentOs または Amazon Linux に cmake/gcc コンパイラーをインストールするには: $ sudo yum install cmake $ sudo yum install gcc-c++
2020 年 3 月に追加。README.mingw の手順を参照してください。
Windows ディレクトリにあるバージョン固有の tlsh ソリューション ファイル (tlsh.VC2005.sln、tlsh.VC2008.sln など) を使用します。
tlsh ライブラリ インターフェイスについては tlsh.h を、サンプル コードについてはtest
ディレクトリの下の tlsh_unittest.cpp および simple_unittest.cpp を参照してください。
最近、PyPi 上に Python パッケージを作成しました: https://pypi.org/project/py-tlsh/
py-tlsh は python-tlsh パッケージを置き換えます。詳細は94号をご覧ください
このパッケージをインストールするには
$ pip install py-tlsh
独自の Python パッケージを構築する必要がある場合は、Python のバージョンに関するメモが記載された README.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
インポートtlshtlsh.hash(データ)
データは文字列ではなくバイトである必要があることに注意してください。これは、TLSH がバイナリ データ用であり、バイナリ データには NULL (ゼロ) バイトを含めることができるためです。
デフォルト モードでは、ハッシュ値を生成するにはデータに少なくとも 50 バイトが含まれている必要があり、ある程度のランダム性が必要です。ファイルのハッシュ値を取得するには、次のようにしてください
tlsh.hash(open(file, 'rb').read())
注: open ステートメントはファイルをバイナリ モードで開きました。
import 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 iter(lambda: f.read(512), b''):h3.update(buf)h3.final()# このアサーションは、TLSH とそれ自体の間の距離がゼロでなければならないことを示していますassert h3.diff(h3) == 0score = h3.diff(h1)
diffxlen
関数は、比較から tlsh ヘッダーのファイル長コンポーネントを削除します。
tlsh.diffxlen(h1, h2)
繰り返しパターンを持つファイルと、そのパターンのインスタンスが 1 つだけあるファイルを比較する場合、ファイルの長さも含めると、その差は大きくなります。ただし、 diffxlen
関数を使用すると、ファイルの長さは考慮されなくなります。
「保守的」オプションを使用する場合、データには少なくとも 256 文字が含まれている必要があります。例えば、
import ostlsh.conservativehash(os.urandom(256))
ハッシュを生成する必要がありますが、
tlsh.conservativehash(os.urandom(100))
256 バイト未満であるため、TNULL が生成されます。
古い形式のハッシュ (「T1」プレフィックスなし) を生成する必要がある場合は、次を使用します。
tlsh.oldhash(os.urandom(100))
古いオプションと保守的なオプションを組み合わせることができます。
tlsh.oldconservativehash(os.urandom(500))
比較の精度を向上させるために、TLSH はバケットの高さの分布を四分位数で追跡します。四分位差が大きいほど、差スコアも高くなります。
特別に 6 つのトライグラムを使用して、5 バイトのスライディング ウィンドウ内のバイトを同等に表現し、結果を改善します。
ピアソン ハッシュは、トリグラム カウントをカウント バケットに分配するために使用されます。
グローバル類似性スコアは、サイズが大きく異なるオブジェクトを遠ざけます。グローバル類似性は無効にすることができます。また、異なる四分位分布を持つオブジェクトの距離も測定します。
TLSH をコンパイルして、70 文字または 134 文字のハッシュ文字列を生成できます。 70 文字のハッシュ文字列を使用するために作成された長いバージョンは、アプリケーションでは機能しません。
TLSH の類似性は差分スコアとして表されます。
スコア 0 は、オブジェクトがほぼ同一であることを意味します。
72 文字のハッシュについては、しきい値に基づいた実験的な検出率と誤検知率の詳細な表があります。 5 ページの表 II を参照
tlshCluster の Python コードと Jupyter ノートブックを参照してください。
HAC-T メソッドの Python コードを提供します。ユーザーが DBSCAN を使用できるようにするコードも提供します。
ファイルとグループ間の関係を示す便利な図である、ファイルの系統図を作成する方法をユーザーに示します。
当社は、数十万のサンプルを含む Malware Bazaar データセットをクラスタリングするためのツールを提供しています。
HAC-T 手法については、「HAC-T とセキュリティの類似性の高速検索」で説明されています。
Jonathan Oliver、Chun Cheng、Yanggui Chen、TLSH - 地域性を重視したハッシュ。第 4 回サイバー犯罪と信頼できるコンピューティング ワークショップ、シドニー、2013 年 11 月
Jonathan Oliver、Scott Forman、Chun Cheng、ランダム化を使用して類似性ダイジェストを攻撃。 ATIS 2014、2014 年 11 月、199 ~ 210 ページ
ジョナサン・オリバー、ムキート・アリ、ジョサイア・ハーゲン。 HAC-T とセキュリティの類似性の高速検索 2020 International Conference on Omni-layer Intelligent Systems (COINS)。 IEEE、2020年。
4.12.1
2024 年 8 月 10 日 マージ プル リクエスト #146 - 警告を回避するために sprintf() への呼び出しを削除 マージ プル リクエスト #141 - py_ext: PyObject_HEAD_INIT の代わりに PyVarObject_HEAD を使用する マージ プル リクエスト #138 - ビルド: 「デフォルト」でのみデフォルト オプションを定義します マージ プル リクエスト #136 - バグ修正 + 移植性: 整数除算による移植性の向上
Change_History.md を参照してください。