最近、スマートフォンやモバイルバッテリーに使われるリチウムイオン電池による火災が話題になることがある。これは、リチウムという元素の性質に起因するもので、周期表を見ればわかる通り、リチウム(Li)はナトリウム(Na)と同じ「アルカリ金属(1族元素)」に属す。アルカリ金属は非常に反応性が高く、特に空気中の水分や水と激しく反応して発火する性質がある。実際、ナトリウムは通常、灯油などの炭化水素系の溶媒に浸して保存されている。
このような性質は、高校レベルの化学で学ぶ基礎知識で、よく「学校で習ったことは社会で役に立たない」と言われるが、実は現実世界の理解に直結することも多い。学校の授業って重要。昔、どこかの有名難関大学の研究室で、化学実験中に火事ができて、実はナトリウムか何かで水をかけたらさらに炎上という事件があったが、センター試験や受験勉強だけではとても立ち向かえない。
今回はエントロピーについて取り上げる。エントロピーはもともと熱力学の概念で、有名な例として、「水にインクを垂らすと一気に広がる」実験がある。これは、インクの分子が無秩序(乱雑)に拡散していくことで、系全体のエントロピー(乱雑さ)が増大する現象。理論的には、絶対零度では分子の運動が最小となり、エントロピーはゼロになる。ここまでは大学で習うと思しき内容。
一方、コンピューターの世界にも「エントロピー」という概念がある。これは、情報理論においてシャノンによって定式化されたもので、データのランダム性や予測困難さを数値化したもの。フォン・ノイマンもこの分野に貢献?(命名だけかもしれないが。)
ここでも、分子の「ランダム性」が「データのばらつき(情報の無秩序さ)」に置き換わっただけで、本質的な考え方は熱力学と共通していると言える。
閑話休題
ここからが本題。
情報エントロピーは、ランサムウェアの**振る舞い検知(Behavioral Detection)**にも応用されています。具体的には、ファイルのエントロピーの変化を解析して異常を検出する方法。エントロピーが増大したら、ランサムウェア暗号化されている!とみなす。
実際に、エントロピーを測定してみる。Goでいろいろソースを作って、試してみたのだが、AIがサクっと作れるレベルなのでソースは割愛。結果だけで話すと、
以下のファイルを作ってエントロピーを測定してみた。
• zero.txt(中身は「0」が32文字並ぶ)
→ エントロピー: 0.2006(Low entropy: テキストや設定ファイルに多い)
• zero.txt.xz(上記を .xz 圧縮。正常なファイル)
→ エントロピー: 4.5433(Normal entropy: バイナリファイル相当)
圧縮によって、同一内容のファイルであってもエントロピーが一気に22倍以上に増加することがわかる。これは、圧縮処理によってランダム性の高いバイナリ列が生成されたから。さらに、圧縮を使わなくても高エントロピーなファイルを意図的に生成が可能。これもAIにGoで書かせてみた。
• entropy8.bin(Go言語でランダムバイト列を生成)
→ エントロピー: 7.9826(Max entropy: 暗号化の疑いがある)
エントロピーは0(完全な規則性)〜8(完全なランダム性)の範囲をとる。最大値は底が2のlog 256 。詳しくは情報のエントロピーをネットで調べると書いてある。
ここで言いたいのは、どちらが良い・悪いというものではなく、データの性質によってエントロピーは自然に決まる。正常なファイルで、エントロピーが低いものもあれば、もともとエントロピーが大きいものもある。エントロピーが高いからランサムウェアの暗号化の被害を受けたわけたというわけではない。(世間では半分独り歩きしてそうな節もあるが。。。)
ランサムウェアの検知では、「エントロピーの増加」をトリガーとするアルゴリズムがよく使われる。たとえば、元は低エントロピーだったファイルが、急に高エントロピーに変化すると、「暗号化された可能性がある」と判断される。そのため、テスト時には実際にファイルをパスフレーズで暗号化する必要はなく、「単に強度の高い圧縮をかける」だけで擬似的にエントロピーを増やすことが可能。これは非常に簡単に再現できる方法。(逆に圧縮ファイルなどで、高エントロピーのファイルで試しても再現は難しいと思う。)このランサムウェアの検知には、注意点もあって(もう予想できるかもしれないが)、ユーザーが業務上の理由で大量のファイルを .xz や .7z で一括圧縮した場合も、同様にエントロピーが急増する。すると、検知システムは誤検知(False Positive)を引き起こすことがある。そのため、正確な検知には、ファイルのエントロピー変化を時間的に追跡し、圧縮か暗号化かの文脈を考える必要がある。
まとめ
- エントロピーの解析は、ランサムウェアの振る舞い検知に有効。
- 暗号化でなくても、「圧縮」によってエントロピーを急増させることで検知対象となる。
- エントロピーだけでは、「圧縮か暗号化か」の区別はできない。
- 誤検知を避けるには、変化の傾向やファイルの種類も加味する必要がある。
- 強力な圧縮(.xz や .7z)が、エントロピー上昇の代表例
ここからが書きかけで、実際、このような検証がしやすい、エントロピー測定ツールを作った。(自分じゃなくてAIだけど。)
後日、Githubに上げる予定。Linux以外でもWindowsでも動かせるようしたんだが、不具合が見つかってしまった。実は、ARMで動くようにしている。NAS上で動かすと、ランサムウェア攻撃と誤検知されそうで怖いので。
しばし、おまちお。