
🔎 コード内のTrojan Source脆弱性の発見を支援します 👀 。複数のコラボレーターがいるプロジェクト(CI/CD)でのコードレビューに役立ちます。
Trojan Source脆弱性により、攻撃者は悪意のあるコードを無害に見せかけることができます。一般的に、攻撃者は自らのコードを(視覚的に)コメントとして偽装して誘い込もうとします。多くの言語に関係するため、深刻な脅威です。複数の「信頼できない」ソースを持つプロジェクトが影響を受ける可能性があります。
悪を検出 🔎
·
悪を追跡 👀
·
Trojan Source ❓
goを使用> go install経由
go install github.com/ariary/TrojanSourceFinder/cmd/tsfinder@latest
$GOPATHが$PATHに含まれていることを確認してください。
> ソースから
git clone https://github.com/ariary/TrojanSourceFinder
cd TrojanSourceFinder
make before.build
make build.tsfinder
make build.tsfinderコマンドが失敗した場合は、以下を試してください:
env GOOS=target-OS GOARCH=target-architecture
go build -o tsfinder cmd/main.go
curlを使用> リリースから
curl -lO -L https://github.com/ariary/TrojanSourceFinder/releases/latest/download/tsfinder && chmod +x tsfinder
> 手動コードレビューやCI/CDパイプラインでのTrojan Source検出を支援します(Unicode双方向文字)
ファイルまたはディレクトリ*<path>*内のTrojan Sourceを検出するには:
tsfinder [path]
> ソースコードファイルはテキストファイルである可能性が高いです。スキャンからバイナリを除外すると、誤検出を減らすのに役立ちます
tsfinder -t [path]
-vフラグを追加すると、スキャンでスキップされたファイルを確認できます。
Trojan Sourceは新しいものではなく、唯一の危険でもありません。もう一つは*「ホモグリフ」です。(Kezako?*)
tsfinderはhomoglyphコマンドでそれらを検出するのに役立ちます:
tsfinder homoglyph [filename] [flags]
フラグ--siblingを使用すると、pathで見つかった同形異義語に対して、同じ「骨格」を持つ単語(兄弟語)があるかどうかを確認できます:
tsfinder homoglyph [filename] --sibling [path]
機能は開発中で、主に他のプロジェクトに依存しています
> コードが実際にマシン/コンパイラによってどのように解釈されるかを可視化します
tsfinderは意図的にあまり詳細を出力しません。デフォルトでは、Trojan Sourceコードが検出された場合のみ出力します。より詳細な出力と危険な行の可視化には、-vフラグを追加してください。
Trojan Sourceの位置をより明確にするには、-cフラグを指定して色付き出力を有効にできます(ディレクトリスキャンでも便利です):
tsfinder -c -v <directory>


@ioah86さんがこちらで述べているように、trojan sourceはgrepを使ったワンライナーでも検出できます。大きな違いは出力形式と終了ステータスコードです(tsfinderはTrojan sourceが見つからなければ終了コード0、見つかれば1を返します。grepはその逆です)。また、このワンライナーはホモグリフ問題を解決しません。
| 目的 | tsfinder | grepワンライナー |
|---|---|---|
| 全ファイルをスキャン + 行を表示 | tsfinder -v . | grep -arE $'(\u2066|\u2067|\u2068|\u202A|\u202B|\u202D|\u202E|\u202C|\u2069|\u200E|\u200F|\u061C|\u2066|\u2067|\u2068)' |
| 人間が読めるファイルのみをスキャン | tsfinder -t . | grep -IrE $'(\u2066|\u2067|\u2068|\u202A|\u202B|\u202D|\u202E|\u202C|\u2069|\u200E|\u200F|\u061C|\u2066|\u2067|\u2068)' |
| 見つかった場合に終了コード1を返す | default | [one-liner] && exit 1 || exit 0 |