Python自作プログラムでノートン誤検出・誤検知→解決!

2020-04-16




Python(パイソン:プログラミング言語)で自作したプログラムがシマンテックのノートン(ウィルス対策ソフト)で「Heur.AdvML.B」というウィルスとして誤検出・誤検知されてしまいます。

情報共有のために書きます。

2021年05月05日追記

解決した気がします!

確認環境は

  • Windows 10 Home(64bit)
  • Python 3.9.5(32bit)
  • PyInstaller 4.3でexe化
  • シマンテック ノートン インターネットセキュリティ オンライン Ver.22.21.2.50

です。

PyInstallerでexe化してもNortonに削除されませんでした。

以前NGだったPyInstaller 4.0でもOKとなっていましたので、Norton側で修正されたと思われます。

個人的にNortonにかなり働きかけたから、ということにしておきましょう。

もし、まだ誤検知されてしまう方がいましたら、情報共有のためにコメントしてくださるとありがたいです。

この問題については「解決」となりますが、以下、戦いの履歴になります。

興味ある方や解決していない方はどうぞ。


(2020年08月17日、PyInstaller 4.0について追記しました。解決か?未解決でした… 現時点での対応策も追記しました。)

また、Microsoft Defender SmartScreenについてコメントしてくれている方がいますので、気になる方は一番最後のコメント欄を確認してください。

確認環境

確認環境(1)

  • Windows 10 Home(64bit)
  • Python 3.8.2(32bit)
  • PyInstaller 3.6でexe化
  • シマンテック ノートン インターネットセキュリティ オンライン Ver.22.20.2.57

確認環境(2)

  • Windows 10 Home(64bit)
  • Python 3.8.2(32bit)
  • PyInstaller 4.0でexe化
  • シマンテック ノートン インターネットセキュリティ オンライン Ver.22.20.5.39

状況説明

Python 3.8.2(32bit)でPyInstallerを用いてexeを作成すると、ウィルス対策ソフトのノートンにより「Heur.AdvML.B」と見なされて(誤検出・誤検知されて)削除されてしまいます。

「PyInstallerでexeが作成されない」と悩んでいる方は、Norton等ウィルス対策ソフトによって削除されていないか確認してみた方がよいでしょう。

作成したexeを配布したいと思っているので、特定フォルダをウィルススキャンから除外するというような方法は根本対策になりません。

デジタル署名(コード署名)はまだ付加していませんが、それで状況が改善するとも思えないので、誤検出問題を先に解決しておきたいところです。

デジタル署名について、最後の方に追記しました。(2020/07/15追記)

原因調査

原因調査を行いました。

ソースコード自体は問題ないことが前提となりますので以下の1行のみのプログラムで確認しました。

print ("Hello, Python")

いろいろやってみて、ウィルス判定される条件が分かりました。

表にするとこんな感じです。

PyInstallerオプション32bit64bit
なしOKOK
--onefile(-F)OKOK
--noconsole(-w)Heur.AdvML.BOK
--onefile --noconsoleHeur.AdvML.BOK

まず、64bit版のPython(PyInstaller)でexe化した場合は問題ありませんでした。

また、32bit版でも「--noconsole」のオプションをつけない場合は問題ありませんでした。

結論としては、

32bit版のPython(PyInstaller)の「--noconsole」でexe化した場合に、「Heur.AdvML.B」として誤検出されるということです。

もちろん「-w」でも同じ状況です。

これだけの条件で発生するとなると、結構大問題になっている気がするのですが、どうなんでしょう。

多くのところで発生しているならこのページのアクセスが上がりそうなものです。

Pythonで作成したプログラムをexeとして配布したい人は少ないのかな?

個人的には64bitでも問題ないのですが、人様に配布するので念のため32bitにしたいというところです。

対処中

シマンテック・セキュリティ・レスポンスにファイルを送信する方法

上記ページの「ファイルを送信する」ではなく「誤検知を報告する」から対処中です。紛らわしいですね。英語で送信しました。

はっきり言って、こんなことに時間を取られたくないのですが、今までノートンが守ってくれていたと考えて受け入れたいと思います。

2020年05月05日追記

3週間近く経ちましたが、シマンテックから連絡はありません。

(2020年06月03日でも連絡はないので一生連絡はないのでしょう。そもそもが連絡くれるフローなのかどうかも分かりませんし。)

他のブログでも同じような情報を見たので、昔からの誤検出なのだと思います。

ちなみに、自分は32bit版はPy2exeでexe化することにしました。

そのために、(その時点でPy2exeはPython 3.8に対応していなかったので)旧バージョンのPython 3.7をインストールもしました。

Py2exeの32bit版で作成したexeはウィルスとして誤検出はされません。

が、Py2exeの個人的な大きなデメリットは「1本のexeファイルにならないこと」です…

Py2exeのインストールについては以下のサイトを参考にしました。

私は試したことがありませんが、UPXというものを使用して1本のexeにできるという話があります。

他のウィルスチェックはどうなの?

SymantecのNortonではウィルスとして誤検出されますが、他のウィルス対策ソフトではどうなの?ということで、某ブログを参考にオンラインのファイルチェックサイトで確認しました。

VIRUSTOTAL

「ウイルスチェックのためにアップロードしたファイルはセキュリティベンダーなどに公開されてしまうため、機密情報を含むファイルには使用できません。」とのことです。

PyInstaller(32bit版)で作成したexeをアップロードしてみると、72種類のウィルスチェックエンジンのうち、10で陽性判定(ウィルスと判定)のようです。

私が知っているようなところでは、Symantecの他にMicrosoftとMcAfee-GW-Editionというものでウィルスと判定しているようです。

一方で、Avast、AVG、F-Secure、Kaspersky、Kingsoft、McAfee、TrendMicro、ZoneAlarm by Check Point等では陰性(問題ないファイル)と判定しているようです。

ちなみにMcAfee-GW-Editionでは陽性判定、McAfeeでは陰性判定です。2つの違いについてはこちら

それくらい判定が難しいというか、グレー部分が多いものなんでしょうね。

なので間違ってもいいのですが、間違いを正すフローはあるのかな?

基本は「疑わしきは罰せよ」だとしても、疑うのならちゃんと調べて疑いが晴れたら釈放してほしいものです。

ノートン先生は、間違ったら謝るって親に習わなかったのかな?

2020年06月11日追記

Nortonにチャットで質問して、再度フォームからファイルを送信しました。

一応、何かしらの応答はあるようですので何かありましたらここに追記します。

2020年06月25日追記

ノートンライフロックのフォームから質問しましたが返信はありません。

で、何がムカつくかっていうと、フォーム送信後の比較的早い段階で「対応についてアンケート」みたいなものが送られてきたこと。

まずはこっちの質問に回答してからアンケートしようや。

回答もせずにアンケート(質問)してくるって、どういう神経の会社なんだ?

ちなみに2020年02月くらいに「シマンテック」から「ノートンライフロック」に社名変更しているようです。

「Heur.AdvML.B」の誤検知問題については他のプログラミング言語も含め、多くのプログラマーがやられているようです。

デジタル署名+USBにコピー

デジタル署名(コードサイニング証明書)の有無とビット数の組み合わせに対して、USBにコピーしたとき以下のような動作になります。

デジタル署名32bit64bit
無しNGOK
ありOKOK

32bit版でデジタル署名無しの場合のみNG(Heur.AdvML.Bとして削除される)となります。

32bit版でもデジタル署名ありの場合は削除されません。

64bit版はデジタル署名の有無に関係なく削除されません。

要するにデジタル署名があれば、USBにコピーしたときに削除されない、ということです。

ノートンライフロックの件は応答ありません。調子こいてるカス企業。地道に不買運動とかやった方がいいのかな。

2020年08月17日追記 解決?

2020年08月08日に、PyInstaller 4.0がリリースされたようです。

修正履歴を見るとBugfixに

(win32) Fix Security Alerts caused by subtle implementation differences between posix anf windows in os.path.dirname(). (#4707)

(↓機械翻訳)

(win32)のposix anfウィンドウ間の微妙な実装の違いによって引き起こされるセキュリティ警告を修正しましたos.path.dirname()。(#4707

上記の記載がありました。

「--noconsole」の記載がないので不安ですが、これで直ることを願っています。

これから動作確認してみます。

確認してみました。

結論はNGでした。

直っていません。相変わらず誤判定されます。

確認環境は以下になりました。

  • Windows 10 Home(64bit)
  • Python 3.8.2(32bit)
  • PyInstaller 4.0でexe化
  • シマンテック ノートン インターネットセキュリティ オンライン Ver.22.20.5.39

期待して裏切られるって辛いな…

現時点での対策まとめ

大体の人が以下の対応になるかと思います。

  • 32bit版ではなく64bit版で何とかならないか再確認
  • 「--noconsole」をあきらめる
  • ウィルスとして誤判定されることを容認(デジタル署名で削除を防ぐ)
  • 削除されても復元する(USBで渡すときは要注意)
  • Py2exe等他の方法を用いる
  • 新しいPyInstallerが出るのを待つ
  • NortonかPyInstallerに対応してもらえるよう連絡して待つ

2020年08月24日追記 10月に「Python」3.9がリリースされたら試してみたいと思います。

その他PyInstaller関係

以下の記事を作成しました。PyInstallerで調べたいことがある方は読んでみてください。

以上。

後記

最後までお読みくださりありがとうございます。

こんなに更新したのに、現在はほぼ誰も見ていないゴミカスクズ無価値ブログです。

よければ(はてな)ブックマークや拡散をお願いいたします。

更新の原動力として励ましが欲しいのです…<(_ _)>

当ブログ内お薦め記事

記事はここまでです。