感染すると2020年6月27日以降にMayaが無限ループに陥ってクラッシュするマルウェアが報告されています。
https://knowledge.autodesk.com/ja/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/JPN/How-to-diagnose-and-clean-Maya-ScriptExploit-issues.html
こちらについて調べた内容をざっと書いてみます。
マルウェアの動作
マルウェアのコードは以下で整形した形で公開されています。
https://gist.github.com/OriginalAdric/acbe902c89064e8300f2bc475a953e05
このマルウェアはざっくり以下のような動作を行います。
- userSetup.melまたはanimImportExport.pres.melにコードを挿入する
- 内容はMayaMelUIConfigurationFileノードに指定されたスクリプト
- anim〜の方はMayaを管理者権限で実行したりしてなければ基本的には影響を受けないはず
- 開いたシーンに対してMayaMelUIConfigurationFileノードを作成する
- ただし、感染したuserSetup.melが存在する状態でも、無害なスクリプトを実行するノードが挿入されるだけ
- 2020/6/27以降にMayaを無限ループによりクラッシュさせる
これだけ見ると、マルウェアコードはどのタイミングでuserSetup.melなどの設定ファイルに挿入されるの?となります。
実際、感染したuserSetup.melを持った環境でシーンを保存しても、以下のような内容が追加されるだけです。
createNode script -n "MayaMelUIConfigurationFile"; rename -uid "B2197C74-432B-846A-23FE-F4815EE25777"; setAttr ".b" -type "string" "// Maya Mel UI Configuration File.Maya Mel UI Configuration File..\n"; setAttr ".st" 1;
ではどうすればマルウェアコードが設定ファイルに挿入されるかというと、うちの環境では上のコードがまるっと指定されたMayaMelUIConfigurationFileノードを持つシーンファイルがありました。
このシーンを開いてしまうと、上に書いた動作により、このノードに指定されたスクリプトがまるまる挿入された設定ファイルができあがってしまうわけです。
そもそもこのようなシーンが出来上がる感染源にはついてはまだ分かっていないので、引き続き調査したいところ…。
マルウェアの対応
公式プラグインの利用
基本的にはAutodeskが公式で用意しているプラグインを入れれば大丈夫かなとは思います。
https://knowledge.autodesk.com/ja/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/JPN/How-to-diagnose-and-clean-Maya-ScriptExploit-issues.html
MayaScannerCBを有効にすれば、シーンオープンなどにフックして以下に該当する場合に問題を処理し、保存するか確認するダイアログを出した後、Mayaを終了してくれます。
・userSetup.melにマルウェアコードが含まれている場合
・MayaMelUIConfigurationFileノードのスクリプトにマルウェアコードが指定されている場合
・マルウェアコードが生成するscriptJobが存在する場合
詳しい使用方法の記事はこちら。
knowledge.autodesk.com
マルウェアコードを含むuserSetup.melで作業を続行させないためにMayaは検出の度に終了させられるので、シーンファイルを一括で綺麗にしたい場合は以下の記事のツールを使用させていただくのがよいかと思います。
myara CG blog Maya mel Malware
もしくは、公式のプラグインに含まれるMayaScannerCleaner.pyを実行するコードを作成し、mayapyなどで実行するとよいです。
たとえばこんな。
from maya import standalone from MayaScannerCleaner import clean_malware, log, rollOverLogFile standalone.initialize() # ログが既に存在したらローテート rollOverLogFile() target_dir_path = r"基点となるパス" for dir_path, dir_list, file_list in os.walk(target_dir_path): for file_name in file_list: if os.path.splitext(file_name)[1] not in [".ma", ".mb"]: continue path = dir_path + "/" + file_name log.info(u"[Scan Start] path={0}".format(path)) cmds.file(new=True, force=True) cmds.file(path, o=True, force=True) issuesFound, issuesFixed = clean_malware("fileOpen") if issuesFixed: cmds.file(save=True, force=True) log.info(u"Saved path={0}".format(path))
MayaScannerを実行してもいいんですけど、これだとログが毎回ロールオーバーされてしまうのでどのファイルが処理されたのか分かりづらいです。
また、上に書いたマルウェアコードを含まない無害なMayaMelUIConfigurationFileノードに関してはMayaScannerCleanerの処理対象外になるので、これも削除したい場合はMayaScannerCleanerのコードを少し変更する必要があります。
あとMayaScannerCleanerのコードを読めばわかりますが、少しでもメソッド名などの異なる亜種がでたらまた対応が必要になる(現在のMayaScannerCleanerでは対処できない)ので、今後のためにどんな処理をしているかは読んでおくとよさそうです。
userSetup.melの変更による対応
最初に貼ったgistのコメントにもありますが、userSetup.melに以下の2行を追加しておけばマルウェアは動作しないので、この方法でも対応が可能です。
global int $autoUpdateAttrEd_aoto_int; $autoUpdateAttrEd_aoto_int = -1;
マルウェアコードはこの値が0のときだけ上記の動作をするscriptJobを生成するので、あらかじめそれ以外の値を入力することでscriptJobの生成をブロックする形です。
既にuserSetup.melが感染している環境ではuserSetup.melのマルウェアコードを削除した上でこちらを追加してください。
もしインハウスツールでMaya起動時にmelやPythonを実行するような環境の場合、userSetup.melに上記を書き込む代わりにその処理の中で実行する形にしておくとより安心感があると思います。
from maya import mel mel.eval("global int $autoUpdateAttrEd_aoto_int;$autoUpdateAttrEd_aoto_int = -1;")
おわり
きちょうなえいぎょうじかんをかえして…