Hatena::ブログ(Diary)

とあるソフトの開発記録

3月4日, 2013年

遠隔操作ウイルス開発者のプロファイリング

00:48

世の中を騒がせてますね。素人が専門家にぼろ負けしてるという印象です。問題は素人が権力を持っていること?

ウイルス自体が手に入ると良いのですが、どこにもないので、警視庁のページを見てみました(PDFのコピー禁止設定とか、情報提供する気あるのかって思う……)。

資料まとめ

iesys.exeに対するコマンド

これによると、まずiesys.exeに対するコマンドは下記であるとされています。

  • ファイルのアップロード、ダウンロードなどに関する命令
    cd, del, dl, dltext, send
  • キーロガー、画面キャプチャなどに関する命令
    framecnt, kloff, klon, scrcap, scrcap_auto, scrcap_auto_stop
  • 掲示板の設定、アクセスに関する命令
    newuser, updatesv, bm, nm
  • iesys.exe自身の動作などに関する命令
    restart, exit, wait, fsuspend, force_, run, stat, suica, update, ver
  • ブラウザ機能に対する命令
    wbback, wbcap, wbclick, wbdef, wbget, wbpost, wbset, wbset_p, wbsubmit, wbtryselect

iesys.exeのクラス名・関数名

次に、クラス名・関数名です。

  • Form1
    fetchMyThreadId, makeNewUser, parseInstructions, waitTimer_Tick, runIns, startBurstMode, endBurstMode, selectDOM_point, selectDOM, _getElementById, _getAllElems, _getElementsByTagName, ins_end, ins_end_force, wb_DocumentCompleted, hbTimer_Tick, checkInsTimer_Tick, timerNewUsr_Tick, kakikoMyThread, kakikoMyThread_noEnc, fetchNewIns, kakikoMyThread_retrymode, kakikoRetryTimer_Tick, connection_emergence, decodeEscaped, uploadBitmap, snapTimer_Tick, startAutoSnapMode, endAutoSnapMode
  • Common
    GetUnixTime, getMyDir, setAutorun, rmAutorun, SaveSjisTextFile, exitAndDel, exitAndDel_p, exitAndUpdate, exitAndUpdate_web, getDefBrowser, targetSanitize
  • Common_Crpt
    EncryptString, DecryptString, GenerateKeyFromPassword, uidToPwd, uidToEndMark_S, uidToEndMark_E, uidToInterceptMark_S, uidToInterceptMark_E, encByUid, cutEncodedStr, decByUid, decByUid_partial, eraseIntercept, addKaigyo, removeKaigyo
  • Common_TCP
    asyGetRequest, getRequest, asyDoUrl, doUrl, sendFileMethodPost, asySendStreamMethodPost, sendStreamMethodPost, makeShitarabaThread, kakikoShitaraba, getShitarabaThreadListStr, getShitarabaThreadList, getShitarabaThreadDat, binDownload
  • Fileman
    runCmd, getCDName, getCDList, getFile
  • Operec
    isLogging, startLogging, stopLogging, getRawLog, getLog, clearLog, globalKeydown, globalMousedown, convLogToStr

感想

容疑者が誰かは置いておいて、これを日本人が作ったとすると、それなりにスキルは高そうという印象です。

  • 英単語の語彙が下位技術者のレベルではない。
    fetch, parse, instructions, burst, force, snap, generate, encrypt/decrypt, intercept, exit, partial
    hbTimer = hibernationTimer?
    sanitize (無毒化)などはそもそも高度な概念と思うけど、最近は違うのかな。
  • 英単語の微妙な使い方が正しい。
    instruction*s*, start*Logging*, get*Log*, Auto*r*un
  • 短縮語は大文字にするという几帳面な命名
    DOM, TCP, CD
  • 英単語の対応関係が明確
    start/end, set/rm, add/remove, start/stop
  • 固有名詞の扱いが妥当
    kakiko, shitaraba

ひとつふたつならともかく、この程度のきめの細かさでコーディングできるプログラマは少数だと思います。「俺は出来る」という自称プログラマなども、パターンなどうわべの知識だけで実際のコーディングは微妙ということが多いのに、なかなかのセンスに見えます。

技術的にもみるものがあります。

  • thread と asy がある。
    スレッドは有名な並列処理の方法ですが、最近は非同期呼び出し (asynchronous call) が主流です。上記を見ると、命名からスレッド処理なのか非同期処理なのか判別できますし、それらを使い分けていることも分かります。非同期については識別子の先頭にasyを付けるという開発者の固有ルールがあるのでしょう。優秀なプログラマには当たり前の特徴です。
    (追記)はっと気がつきましたが、thread は掲示板スレッドの意ですね。”My”が気になっていましたが、そりゃそうだ。よくよく考えられた名前だと思います。
  • Java言語も使える可能性が高い。
    C#もそうですが、Microsoft 系の言語の一般的な命名規則ではメソッドは大文字で始まります。一方、Javaは小文字です。上記はほとんどが小文字開始ですから、元々Java出身の技術者である可能性があります。もしくは私のように、privateな要素については小文字(もしくは大文字/小文字を気にしない)というルールかもしれません。その場合はより繊細なコーディングをしていることになります。
    略語がすべて大文字なのもJavaの流儀です。C#では、略語であっても二文字目以降を小文字にします(例外は名前空間)。
  • 記事やネットでは「いまどき通信でどうこうするプログラムは難しくない」という論調ですが、C#のような汎用記述言語で一からコーディングするにはかなりのスキルが必要です。また、実際に動くのは未知の環境下ですから「手元で動けばOK」という認識は通用しません。また、10分間隔できちんと動作することの確認など、実際問題としての課題はそれなりにあります。
  • 暗号化などもコピペのようで、巷では「そんなに難しくない」という評価のようですが、普通のプログラマであればまず「暗号化しよう」という発想に至りません。たとえコピペだろうとも、スクラッチプログラムでそれが実装され、期待通りに動作するというのはそれなりにすごいことです。

これらを総合すると、下記のような推論ができます。

  • まず除外できるのが、素人がほとんどのコードをコピペで作成したケース。新種ウイルスとして登録されていますし、全体コピーはないでしょう。開発者はスクリプトキディのような素人ではありません。
  • また、断片を寄せ集めて統合したケースも可能性は低いです。経験的に、コードスニペットを寄せ集めるタイプのエンジニアは「動けばよし」です。未知の環境で動作するネットワーク越しのアプリとして完成度を高める能力はありません。また、内部を理解しないのでリファクタリングすることができないため、コードに統一感がありません。今回のは、完璧に整ったとは言えないものの、寄せ集めという感じはあまりしません。
  • したがって、特別な記述が必要な暗号部分などを除いて、基礎部分は独自に開発されたとみて良いのではないかと思います。(暗号部分などは難しい割に使い回しが難しいので、私もよくコピペします。)
  • すでに述べたような特徴を持ったプログラムを一から開発できるのであれば、几帳面で、行動力と知識があり、5〜10年程度の実践的な実装経験があると思います。その技術者のスキルは上位20%に入っていると思います。
  • しかしながら、報道記事などによるとエラー処理が甘く落ちたりするらしいので、通信系の職業プログラマではないとは思います。通信系の職業プログラマであれば、基本処理と同じくらいエラー処理が重要であることを知っていて当然だからです。したがって、前述の実装経験は、エラー処理など異常系を考慮しなくてよい立場・環境で培われたものだと思います。

これまでの推論をまとめると、職業プログラマよりも、むしろたとえば学生や研究者、日曜プログラマのような技術者が開発者ではないかと思います。Web技術については、その分野の専門家というより、近代プログラミングの教養として身につけていた程度ではないですかね。エラー処理の甘さと対照的な、高度概念の導入などがそう思わせます。

   2013/03/06 22:04 所詮トロイなので、そこまでの信頼性を求めていないだけなきがします。>エラーで落ちる。
掲示板経由で指示すると言う設計ですから、その程度の信頼性で十分と言う判断かと思います。

個人投資家個人投資家 2013/03/06 23:43 真犯人は、むしろ警察の内部のセキュリティの研究者じゃないですかね?
サイバー犯罪への対応策や、取り調べの録音録画などがいくら提言しても遅々として進まないので、警察の無能さを示すショック療法をしようとしたのではないかと推測してます。

c299792458c299792458 2013/03/07 01:37 >ななしさん
ウイルス系は「闇に隠れる」のが王道なので、エラーダイアログは抑止したいと思います。
また、識別子の命名規則や暗号化に見られる慎重さを考慮すると、エラーで落ちるのはアンバランス(=その手の品質が必要でない職務)かと。まあ、私はコードを見たわけではないので、実際はエラー処理もかなりしているのかもしれません。

>個人投資家さん
可能性はあると思いますが、警察内部に限定する必然性は低いと思います。
今回の犯人はかなりの手間暇を掛けています。ウイルス作成はある程度の能力があればできますが、そのあと身元を隠しながら拡散したり、感染相手の個人情報を調べながら冤罪をでっちあげなければならないからです。
このような執拗かつ他人を犠牲にする行動は、純粋な正義感からというよりも、警察への怨恨のほうがしっくりくると思います。であれば、過去警察にIT関係で不条理な扱いを受けた技術者が疑わしそうです。すると、警察には前科持ちは少ないでしょうから、内部犯の確率は低そうです。

sakurai_youheisakurai_youhei 2013/03/07 01:59 ************************************
(1)
以下のアッパーキャメルケース (UCC)の関数名に着目し、その実装を
ILSpy等のツールで確認。

GetUnixTime
SaveSjisTextFile
EncryptString
DecryptString
GenerateKeyFromPassword

(2)
検索エンジンで上記関数名を検索して、ヒットするページに記載された実装と
1で確認した実装を比べる。

例:
EncryptString
http://dobon.net/vb/dotnet/string/encryptstring.html

DecryptString
http://dobon.net/vb/dotnet/string/encryptstring.html

など

(3)
特定したページのログ開示請求を行い、アクセス元のIPをリスト化する。
************************************

プロファイリングじゃないですが自分はこんな感じで情報提供しました。便乗で申し訳ないですが。

ガジェット通信編集部ガジェット通信編集部 2013/03/07 02:19 コメント欄より失礼致します。
ガジェット通信編集部と申します。

私どもは、『ガジェット通信』(http://getnews.jp/)
というウェブ媒体を運営しております。
こちらのブログ記事を、興味深く拝読させていただきました。

「遠隔操作ウイルス開発者のプロファイリング」
こちらの記事を、『ガジェット通信』に寄稿という形で掲載させて
いただきたいのですがいかがでしょうか。

尚、掲載の際には、元記事へのリンクも貼らせていただきます。
ご検討いただき、下記アドレスへお返事をいただけますと幸いと存じます。

post2012@razil.jp
以上、よろしくお願いいたします。
-----------
ガジェット通信編集部
http://getnews.jp/

c299792458c299792458 2013/03/07 02:56 >sakurai_youheiさん
おつかれさまです。よい着眼だと思います。
私もメソッド名は調べましたが、SaveSjisTextFile はどうも既存品がなさそうなので、スクラッチかなあと思っています。でもこれは大文字始まりだったりで、まあいまのところよく分かりません。

もし私が調べるなら、ディスク全体に対して強引に文字列をスキャンします。
Dropboxが使われていたらしいですが、あのようなソフトはローカルにキャッシュしますし、ファイルの更新を新規作成&リネームで行うことがあります。その場合はディスク上の空き領域に痕跡が残りますから、もし作成途中のコード断片が発見されれば、作者であることの証左になりそうです。(私は法律の素人なので、この方法の証拠能力などについては分かりませんが。)

>ガジェット通信編集部殿
大変ありがたいお申し出をありがとうございます。
ですが、ひっそりやっておりますので、辞退させていただければと思います。

ガジェット通信編集部ガジェット通信編集部 2013/03/07 03:02 お世話になっております。
ガジェット通信編集部でございます。

ご丁寧にお返事いただき、感謝申し上げます。
ご辞退とのこと、了解いたしました。

ご検討いただきまして、ありがとうございました。
また機会がございましたら、よろしくお願い致します。
-----------

ガジェット通信編集部
post2012@razil.jp
http://getnews.jp/

nana 2013/03/08 12:48 全ソースを一人が書いたとお考えか?

グズラグズラ 2013/03/08 22:27 exitAndDelでクグると2chのC#板での質問がヒットしますね。質問内容と合わせて考えると、メソッド名のexitAndDel_pは、parent ディレクトリを含めた削除用かか。だとすると、この質問者は怪しい。

c299792458c299792458 2013/03/09 00:57 >naさん
ひとつのプログラムとしてまとめあげた者という意味では一人でしょう。複数で行う理由がありません。
コードの著作権者が何人いるか、という意味だと、暗号化部分がコピペなのはすでにほぼ確実ですから、複数だと思います。

>グズラさん
あら、下記の 337 ですか?
もしや本当に当たりじゃないでしょうか?!
http://www.logsoku.com/r/tech/1340975670/?view=matome

別の記事において、遠隔操作ウイルスがbatを作成して自分自身を削除する動作をすると明らかにされています。このような自己削除動作は意外と難しく、それにバッチファイルという旧式の技術が有用だと知っていることはなかなかないと思います。
ですから、337 が犯人であったと仮定したときに、バッチファイルについて調べ、さらに所望の振る舞いを得るためにした質問だと考えることは、私はなんの違和感もありません。

また、337への回答338も気になります。グズラさんがご指摘のようにメソッド名が一致していますが、さらにbatの中身も類似しています。
338の回答から出力されるbatは、

@ECHO OFF
:Lbl0
RD /S /Q <path>\
IF EXIST <path>\nul GOTO Lbl0
DEL %0
EXIT

であり、遠隔操作ウイルスのbatは

:Lbl0
DEL "C:\AAA\AAA.exe"
IF EXIST "C:\AAA\AAA.exe" GOTO Lbl0
RENAME "C:\AAA\data" "AAA.exe"
START "" "C:\AAA\AAA.exe"
DEL %0
EXIT

らしいです。
http://www.logsoku.com/r/poverty/1349915952/530
# http://d.hatena.ne.jp/Kango/20121008/1349660951 経由

私の記憶によれば、自己削除型batの最終行は改行なしのDELコマンド行で終わらせるとよいはずなので、最後にEXITつけたりするのは特徴的かもしれません。
また、338の回答例だとbatがカレントディレクトリで実行されるので、338の期待する「ディレクトリ削除」はできないんじゃないかな……。勘ですが。だとすると、ウイルス作成に当たってディレクトリ削除を諦めてファイル削除に変更したのかもしれませんね。

まとめると、私の中で 337 のやりとりはかなり遠隔操作ウイルスに類似していると思います。ちょっとびっくりしました。

c299792458c299792458 2013/03/09 01:39 びっくりして少し勘違いしました。
337, 338, 339 が同一人物なんですね。んで 342 が回答と。
だとすると、342 の回答で動くようになるはずですね……。

あと、質問日時が 2012/07/09 で、ウイルスによる最初の被害が 2012/07/29 というのも…。

c299792458c299792458 2013/03/09 01:45 bat のコードのおおもとはこれですかね。
http://mimizun.com/log/2ch/tech/1045542179/146-150
http://mrxray.on.coocan.jp/Delphi/plSamples/850_DeadSelf.htm

グズラグズラ 2013/03/09 13:28 ファイル削除・リネームしてる遠隔操作ウイルスのbatファイルは、ドロッパーを削除して、dataという名前で退避してたオリジナルのアプリを正しい名前に戻すためのようですね。337で質問してる内容は、遠隔操作コマンドでiesys.exeやそのディレクトリを削除する際に使いたかったものだと推測します。真犯人のメールで自己削除コマンドsuicaと書いていたやつです。

 2013/03/10 03:06 確証バイアス。

c299792458c299792458 2013/03/10 12:28 >グズラさん
そうですね。ここまで技術的要素があるんだから、ある人に、犯人として必要なスキルがあるかないかはすぐ分かりそうなものですね。

>とおりすがりさん
そのままお返しします^^

にーとにーと 2013/03/10 15:02 とても記事おもしろかったです。
個人的には作成者は
業務用アプリ作ってる下位SE〜PGって印象かな。
共通関数クラスを複数に分けているので、
意外と丁寧に作った感じですので、
PGの癖がでてそうですね。
関数名の先頭をほぼ動詞にしているので
変数名なんかハンガリアンになってそうw

いおいお 2013/03/10 23:19 この記事を誰かが分析したらしいですよ。
http://anond.hatelabo.jp/20130310135938

c299792458c299792458 2013/03/11 00:40 >にーとさん
ありがとうございます。
識別子の名前は、機能にまったく影響しないがゆえに、開発者の性格がでますよね。
ソースコードがあればもっといろいろ推測できるんでしょうけど、無い物ねだりだし。

>いおさん
お知らせありがとうございます。知りませんでした。
私の分析を分析する行為に、どういう意味があるのか分かりませんね……。

私への名指し批判ですから反論いたしますと、
  1) 「分析の分析」を論旨にしちゃうという若気の至り
  2) 構造のまったくない文章
など、あらら。。。
特に(2)については、犯人からのメールの構造:
 ・はじめに(名乗りと証拠)
 ・私の目的
 ・宛先を選んだ理由
 ・トロイについて
 ・関与事件一覧
 ・結び(警察・検察の方へ)
 # http://d.hatena.ne.jp/satoru_net/20121016/1350397183
と比べると、書きたいことをただ書いただけという幼さを感じます。改めて、「こんな文章なら俺でも書ける」と「自分が書く」は違うのだなと思います。
念のため読み直してますが、可笑しくて楽しいです。