― exe化中にWacatac.B!mlが検知されたとき ―
はじめに
Pythonスクリプトを配布する際、ソースを見せずに配布できる形として「EXE化」がよく利用されます。
nuitka
はCPython互換のコンパイラで、高速かつ最適化された実行ファイルを生成できますが、onefile オプションで作成したEXEがWindows Defenderに「マルウェア」と誤検知されることがあります。
本記事ではその理由と、誤検知を回避する方法について解説します。
onefile が誤検知される理由
1. 一時展開の仕組み
- onefile 形式では、生成された単一のEXEにすべての依存ファイルをまとめます。
- 実行時には、一時フォルダに解凍 → 実際の処理を開始 という流れになります。
- これは自己展開型アーカイブやパッカー型マルウェアと似た挙動であり、アンチウイルスソフトが不審な動作とみなす原因になります。
2. コードサイニングがない
- 自己展開を伴うプログラムは本来「コードサイニング (Code Signing)」が必要です。
- 署名がない場合、**「不審な未署名の自己展開ファイル」**として検知されやすくなります。
3. ヒューリスティック検知の影響
- Defenderや他のセキュリティソフトは、既知のウイルス定義だけでなく「怪しい挙動パターン」を検知します。
- onefileは「自己展開+一時実行」という特徴から、ヒューリスティックでマルウェアと誤判定されやすいのです。
対策:standalone モードを使う
1. standalone とは?
-
--standalone
オプションでは、EXE本体と依存DLL・ライブラリを同じフォルダにまとめます。 - onefileと違い、実行時に自己展開処理が不要になります。
- よって「自己展開挙動」による誤検知を大幅に減らせます。
2. 配布方法の工夫
- standalone では「EXE+必要DLL」のセットをそのまま配布します。
- フォルダごとZIP化して配布するのがおすすめです。
- ユーザーにとっては多少ファイル数が増えますが、セキュリティ的には安全で実用的です。
3. 追加の安心対策
- コードサイニングを行う(企業配布なら特に必須)
- ウイルス対策ベンダーに誤検知報告をする
- 不要なライブラリを整理し、最小限の構成にする
まとめ
- onefile: 配布は楽だが、自己展開挙動のせいでWindows Defenderに誤検知されやすい。
- standalone: 配布時にフォルダが必要だが、誤検知リスクを大きく減らせる。
実務用途で「確実に配布・利用」してもらうなら、standaloneでの配布が最適解です。
小規模配布や学習用ならonefileでもよいですが、誤検知に悩まされたらぜひstandaloneを選んでください。
次のステップ
👉 本記事を拡張するなら以下を追記できます:
- コードサイニングの実際のやり方(証明書の種類・self-signedの例・企業用証明書)
- nuitka コマンド例(onefile と standalone の比較)