3月4日, 2013年
遠隔操作ウイルス開発者のプロファイリング
世の中を騒がせてますね。素人が専門家にぼろ負けしてるという印象です。問題は素人が権力を持っていること?
ウイルス自体が手に入ると良いのですが、どこにもないので、警視庁のページを見てみました(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技術については、その分野の専門家というより、近代プログラミングの教養として身につけていた程度ではないですかね。エラー処理の甘さと対照的な、高度概念の導入などがそう思わせます。
トラックバック - http://d.hatena.ne.jp/c299792458/20130304/1362412084
リンク元
- 3877 http://blog.livedoor.jp/dqnplus/archives/1753833.html
- 1299 http://anond.hatelabo.jp/20130310135938
- 1239 http://b.hatena.ne.jp/
- 793 http://developers.slashdot.jp/story/13/03/08/0323226/遠隔操作ウイルスのクラス・メソッド名はどうな?%
- 738 http://t.co/fQWSkYjGli
- 647 http://slashdot.jp/
- 517 http://t.co/CeWhXqFPBA
- 512 http://developers.slashdot.jp/story/13/03/08/0323226/
- 449 http://gahalog.2chblog.jp/archives/52176091.html
- 347 http://b.hatena.ne.jp/hotentry
掲示板経由で指示すると言う設計ですから、その程度の信頼性で十分と言う判断かと思います。
サイバー犯罪への対応策や、取り調べの録音録画などがいくら提言しても遅々として進まないので、警察の無能さを示すショック療法をしようとしたのではないかと推測してます。
ウイルス系は「闇に隠れる」のが王道なので、エラーダイアログは抑止したいと思います。
また、識別子の命名規則や暗号化に見られる慎重さを考慮すると、エラーで落ちるのはアンバランス(=その手の品質が必要でない職務)かと。まあ、私はコードを見たわけではないので、実際はエラー処理もかなりしているのかもしれません。
>個人投資家さん
可能性はあると思いますが、警察内部に限定する必然性は低いと思います。
今回の犯人はかなりの手間暇を掛けています。ウイルス作成はある程度の能力があればできますが、そのあと身元を隠しながら拡散したり、感染相手の個人情報を調べながら冤罪をでっちあげなければならないからです。
このような執拗かつ他人を犠牲にする行動は、純粋な正義感からというよりも、警察への怨恨のほうがしっくりくると思います。であれば、過去警察にIT関係で不条理な扱いを受けた技術者が疑わしそうです。すると、警察には前科持ちは少ないでしょうから、内部犯の確率は低そうです。
(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をリスト化する。
************************************
プロファイリングじゃないですが自分はこんな感じで情報提供しました。便乗で申し訳ないですが。
ガジェット通信編集部と申します。
私どもは、『ガジェット通信』(http://getnews.jp/)
というウェブ媒体を運営しております。
こちらのブログ記事を、興味深く拝読させていただきました。
「遠隔操作ウイルス開発者のプロファイリング」
こちらの記事を、『ガジェット通信』に寄稿という形で掲載させて
いただきたいのですがいかがでしょうか。
尚、掲載の際には、元記事へのリンクも貼らせていただきます。
ご検討いただき、下記アドレスへお返事をいただけますと幸いと存じます。
post2012@razil.jp
以上、よろしくお願いいたします。
-----------
ガジェット通信編集部
http://getnews.jp/
おつかれさまです。よい着眼だと思います。
私もメソッド名は調べましたが、SaveSjisTextFile はどうも既存品がなさそうなので、スクラッチかなあと思っています。でもこれは大文字始まりだったりで、まあいまのところよく分かりません。
もし私が調べるなら、ディスク全体に対して強引に文字列をスキャンします。
Dropboxが使われていたらしいですが、あのようなソフトはローカルにキャッシュしますし、ファイルの更新を新規作成&リネームで行うことがあります。その場合はディスク上の空き領域に痕跡が残りますから、もし作成途中のコード断片が発見されれば、作者であることの証左になりそうです。(私は法律の素人なので、この方法の証拠能力などについては分かりませんが。)
>ガジェット通信編集部殿
大変ありがたいお申し出をありがとうございます。
ですが、ひっそりやっておりますので、辞退させていただければと思います。
ガジェット通信編集部でございます。
ご丁寧にお返事いただき、感謝申し上げます。
ご辞退とのこと、了解いたしました。
ご検討いただきまして、ありがとうございました。
また機会がございましたら、よろしくお願い致します。
-----------
ガジェット通信編集部
post2012@razil.jp
http://getnews.jp/
ひとつのプログラムとしてまとめあげた者という意味では一人でしょう。複数で行う理由がありません。
コードの著作権者が何人いるか、という意味だと、暗号化部分がコピペなのはすでにほぼ確実ですから、複数だと思います。
>グズラさん
あら、下記の 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 のやりとりはかなり遠隔操作ウイルスに類似していると思います。ちょっとびっくりしました。
337, 338, 339 が同一人物なんですね。んで 342 が回答と。
だとすると、342 の回答で動くようになるはずですね……。
あと、質問日時が 2012/07/09 で、ウイルスによる最初の被害が 2012/07/29 というのも…。
http://mimizun.com/log/2ch/tech/1045542179/146-150
http://mrxray.on.coocan.jp/Delphi/plSamples/850_DeadSelf.htm
そうですね。ここまで技術的要素があるんだから、ある人に、犯人として必要なスキルがあるかないかはすぐ分かりそうなものですね。
>とおりすがりさん
そのままお返しします^^
個人的には作成者は
業務用アプリ作ってる下位SE〜PGって印象かな。
共通関数クラスを複数に分けているので、
意外と丁寧に作った感じですので、
PGの癖がでてそうですね。
関数名の先頭をほぼ動詞にしているので
変数名なんかハンガリアンになってそうw
http://anond.hatelabo.jp/20130310135938
ありがとうございます。
識別子の名前は、機能にまったく影響しないがゆえに、開発者の性格がでますよね。
ソースコードがあればもっといろいろ推測できるんでしょうけど、無い物ねだりだし。
>いおさん
お知らせありがとうございます。知りませんでした。
私の分析を分析する行為に、どういう意味があるのか分かりませんね……。
私への名指し批判ですから反論いたしますと、
1) 「分析の分析」を論旨にしちゃうという若気の至り
2) 構造のまったくない文章
など、あらら。。。
特に(2)については、犯人からのメールの構造:
・はじめに(名乗りと証拠)
・私の目的
・宛先を選んだ理由
・トロイについて
・関与事件一覧
・結び(警察・検察の方へ)
# http://d.hatena.ne.jp/satoru_net/20121016/1350397183
と比べると、書きたいことをただ書いただけという幼さを感じます。改めて、「こんな文章なら俺でも書ける」と「自分が書く」は違うのだなと思います。
念のため読み直してますが、可笑しくて楽しいです。