gobfuscateされたChaChi

なんのことでしょうか。
ChaChiはGo言語で書かれたマルウェアです。
現在米国の学校をターゲットに大きく広がってきていることが確認されている注意が必要なマルウェアです。

このマルウェアは、実は新しくありません。
最初に観測されたのは2019年でした。
当時はまだ実装が全体的に若く、セキュリティ業界ではそんなに大きく注目されることはありませんでした。
難読化されていませんでしたし、ポート転送機能やDNSトンネリング機構もまだ持たなかったため、当時は注意が向けられることはありませんでした。
しかし、その後、急速に開発が進んでいきました。

このあたりに関連しそうな事柄があります。

Go言語を使ったことはありますか?
Go言語はcodeが書きやすいという特徴に加えて、並列処理が実現しやすい、メモリの安全性が高い、などの特徴があることから、スクリプティング言語の良いところとコンパイルが必要な言語のよいところを併せ持ったようなものとなっています。
ここだけみると、Go言語は良いものだと思えます。

一方で、Go言語で作成されてコンパイルされたバイナリは、コンパイルされた後のバイナリなんですが、フィールド名、文字列、パッケージパスなど、元のソースコードに関する多くの情報が含まれていることが判別できるようになっているという特徴もあります。
このため、Go言語で書かれたソフトウェアは、ある程度どのような機能が実現されていそうなのかを想像することができる可能性があります。
Go言語にはたぶんまだ逆コンパイルしてソースコードを取り出すような機構がありませんので、Go言語で書かれたものがどういうロジックであるかをバイナリから逆に突き止めることは容易ではありません。しかし想像する材料はあるといえそうです。

そこに一石を投じたのがgobfuscateでした。
gobfuscateは、その名前が示すように、「go」を「obfuscate」するものです。「Go言語で書かれたものを難読化する」ものです。
これは、次のような手法での難読化を提供します。

  • パッケージ名とPATHをHASH化する
    これによって、Go言語で書いたcodeをツリーで管理している際に表れやすいユーザ名のようなものがPATHに入っている際に、これをわからなくできます
  • グローバル変数、定数、および関数の名前をHASH化する
    これによって読み取れるものを減らせます
  • 構造体メソッドの名前をHASH化する
    なんでもかんでもHASHにすれば読み取りにくくできそうです
  • 文字列を関数に置き換える
    codeを書いた時点では文字列なのですが、gobfuscateするとその文字列は関数になります
    一見してそれが文字列であることが判別できなくできます

これだけしっかりした難読化ができるということであれば、せっかく書いたマルウェアが簡単に解読されて対策されてしまうことも避けることができそうです。
じゃ、がんばって機能拡張してみようか、ということだったのでしょうか。

そもそものgobfuscateには罪はないと思いますが、便利ツールというものはいつも諸刃の剣となりやすいものなのだと痛感します。

参考記事(外部リンク):PYSA Loves ChaChi: a New GoLang RAT
blogs.blackberry.com/en/2021/06/pysa-loves-chachi-a-new-golang-rat