丑丸さん、本日はよろしくお願いいたします。簡単に自己紹介をお願いできますか?
はい、よろしくお願いします。主な業務としては必要に応じてエクスプロイトを書いたりしてリバースエンジニアリングをしてます。昔はマルウェア解析を中心に制御システムのセキュリティをやったりしてました。
ではサイバーディフェンスに入社したきっかけを教えてください。
たしか22歳の時だったと思うんですけど当時「sutegoma2」というCTFチームに所属していて、社員の福森さんに声を掛けられてアルバイトを始めたのが最初のきっかけです。平日4日勤務で1年ぐらいアルバイトを続けていたら当時の社長に「社員にならないか」と誘われて、その場で「はい」と返事をしました(笑)まぁ、楽しいからいいかくらいの軽い気持ちだったと思います。
ということは初めての就職先がサイバーディフェンスだったんですか?
はい、なので一応新卒ってことになりますね。就活とかはしたことないんですけど(笑)
かれこれサイバーディフェンスで10年以上勤務されてきたわけですが、これまでに印象に残っている仕事のことを教えてください。
いくつかありますね。1つめはとある分解できない機器の診断なんですけど、それはPCじゃないのでデバッグ環境に懸念がありましたし、exploitしようにもリアルタイムOSっていうOSを使っていたのでシェルがないんですね。そういったあまりリッチじゃない環境下でどうやってデバッグするか試行錯誤するのが楽しかったです。最終的にはマシンが再起動するか(無限ループさせて)フリーズするかっていう擬似的なゼロイチの状態を作り出して、攻撃を試行してはその反応を見て、を繰り返してそこから少しずつ情報を集めながらデバッグしました。
脆弱性自体は見つかりクラッシュして簡単にRIP自体はとれそうなことはわかったんですがファームウェアを読んだだけなので、クラッシュしてるアドレスって想定してる場所?ってところの確認から苦労しましたね。デバッグにはマシンがクラッシュして再起動するか、無限ループなどさせるか、実行が継続できる状態に戻るかなどの挙動の違いを利用しつつ条件分岐などを駆使しながらちょっとずつleakして情報をかき集めながらROPを組んだ覚えがあります。
さすがに少しずつしかleakできないと辛いのでまとめてデータとれないかを探したら運よくPOSIXのsocket関連APIがあることがわかったのでそれでシェルコード組んでまとめて読み書きできるようになり作業が楽になりましたね。
最終的には機器自体を使って何か異変を表現したかったので、好きな画像を機器に表示したり音楽を鳴らす機能をあるコード部分を探して実行することを楽しみました。報告の際にはexploitに成功すると音が鳴るようなものにしたのでとてもわかりやすいPoCになったかと思います。
2つめはセットトップボックス(ディスプレイに接続して映像などを表示させる機器)の調査ですね。物理的に干渉できる案件だったのでeMMC(フラッシュメモリを利用した内蔵ストレージの規格のひとつ)の書き換え自体はできたんですが、Chain of trustによりちゃんと保護されてたので改ざんが検知されてしまうんです。
ただすべてが改ざん検知されるわけでなくファイルの一部が書き換えができることはわかりました。それで好きなファイルを置けばrootがとれるかと思いきやSELinuxによって保護されていたので強い権限はとれなかったんですよね、強くなれそうなファイルは保護下にあって改ざんできませんでした。
これは簡単にはrootできないなと思いながらよーく読み込んでいくと、SELinuxのポリシーの中に"隙"がありました。そこを突くことでなんとか完全なrootを取ることができました。eMMCのランドが剥がれるまで何回も試行錯誤してrootを取ったので凄く記憶に残ってます。ちなみにこれは松隈さんと一緒にやった案件です。物理的な作業はほぼ全部彼に投げつけてました。
3つめは2013年にとあるインシデントレスポンスの案件でIEの脆弱性が突かれているのを見つけたんですけど、それがゼロデイだったってことですかね。今でこそゼロデイってそんなに珍しくないですけど当時は珍しかったですから。最新バージョンで動作検証しても引っかかるし「うわ、ゼロデイじゃん!」ってなったのを覚えてます。
最後はStuxnetのマルウェア解析をやった時ですね。マルウェアやPLC(Programmable Logic Controller)の中にある実行コードなんかは入手できたんですが、その当時は国内はもちろん海外にもほとんど情報がなくて。フォーマットも何もわからない状態でこれがたぶんバイトコードだけどアーキテクチャとか何さ?と。なにもわからなかったのでひとまず開発ツールをダウンロードして普通に開発手順を追ってみようと、プログラミング言語について調べると、ラダーロジック(RAD)、ステートメントロジック(STL)、ファンクションブロックダイアグラム(FBD)、SCLとよくわからない言葉が並んでいて最初は困惑しました。でもSTLがマシン語に近い表記だったのでこれを基にすれば読めそうと思って進めたのが結果大正解でしたね。
命令のマニュアルは公開されてたので問題はなかったんですが、命令がどういうフォーマットで機械語になるかは仕様がなく、ディスアセンブラは素直に書けない状況でした。幸いなことに開発ツールに逆アセンブル機能があったので保存形式を調べて対象命令がどこにあるか調べて書き換えるみたいなことをすればわかるんじゃないか、と。そこでload 0xAAAAAAAA; foo; load 0xBBBBBBBB;
みたいに即値でマーカーをつけて書かれている場所を特定してからオペランドとかをいじりつつ命令フォーマットを少しずつ調べていくみたいな、地味ながらも当時は楽しくやっていた覚えがあります。
ディスアセンブラはできたもののエミュレータなんぞないですし、実行して検証する環境がない。そもそもStuxnetって遠心分離機を狙ったマルウェアなんで、PLC用意できても装置が用意できず検証できるわけないんですけど(笑)そういうのもあって逆アセンブル結果を読むのは、ちょっと変わった表現もあり苦労しましたね。たくさん読んでたら記法が脳に染みてきて慣れましたが、今はもう忘れちゃってて改めて読むと読めないかもしれません。
国家間のサイバー戦争に使われたマルウェアを解析したんですか!?
はい。ターゲットが一般的でなさすぎますし、遠心分離機に対しての操作方法のまともな仕様がなく頑張って探すと類似機種の仕様書が出てくる程度とか、そもそもウラン濃縮なんてどういう手順でやるかもまったくわからずといった苦労もありましたね。Symantecのレポートが詳しくて先駆者には大いに助けられましたが、本当に細かい部分は書いてないのでとにかく逆アセンブル結果を読み漁ってました。もはやうろ覚えなんで解説するのは大変ですけどいつかブログで書ければと思います(笑)
丑丸さんならではの強烈なエピソードですね(笑)当時のサイバーディフェンスではわりと自由に仕事をされていたんでしょうか?
かなり自由な会社だったと思います。なんせアルバイトの立場で海外出張に行けてましたからね(笑)もちろん、今でも自由度は高い会社だと思いますよ。
どういう時にそれを感じますか?
例えば上下関係をあまり感じないところですかね。若者だからといって甘く見られるということもなく、一人のエンジニアとしてお互いリスペクトできる関係性が維持できる会社だと思います。 あとは、業務としてのCTFへの参加が認められているのもありがたいですね。過去に海外のCTF大会に業務として参加させていただいたこともあります。
普段仕事をされているうえで大切にしていることはありますか?
うーんなんでしょう(笑)
診断とかであまり結果が出なそうな時に頑張ることですかね。もちろん脆弱性なんてない方がいいのですが、「(脆弱性が)ないことはない」と思うようにしてるので、そういう時こそ仕様書をもうちょっと深く読んでみたりしてもう一踏ん張りしてみることは心がけています。
まぁそうすることで少しでも自分の成長に繋がったり、面白いことが見つかるといいなぁって思ってますね。
ありがとうございます。では新卒の方が丑丸さんのグループに参加した場合どのような仕事を任されますか?
前提として僕が所属するリバースエンジニアリンググループに限った話ですが、まずある程度技術力をもった人しか受け入れていません。所属後は本人の希望や能力に応じた仕事をするというのが基本になると思います。これは新人に限らず、チームメンバーみんなが、希望と能力に応じて仕事にアサインされる感じです。
診断が特にない間なんかはリサーチなど好きなことをやってもらう感じになるかと思います。自分でテーマをきめてやったり、自分の好きなことを調べて技術力を磨く感じですかね。あとはエクスプロイトとかはトレーニング指導ができているので、これから新人の方が入ってきたらそういうのをやってみるというのはあると思います。
一方で、リバースエンジアニリングのトレーニングは範囲が広すぎて、正直どこからやればいいのかわからないっていうのはありますね。無難にIDAの使い方(Ghidraもありますが自分はそこまで詳しくない)とかになるんですかね。リバースエンジニアリングと言ってもマルウェア解析とかになれば方向性が決まって狭まるのでまだやりやすいのですが。
Webアプリケーション診断とかは普段からPCやWebに触れている人なら比較的とっかかりやすいのかなと思いますが、リバースエンジニアリングはやったことがないと本当にどこから手を付ければいいのかわからないレベルから始まりますから。最初の参加までの敷居がかなり高いかなと思います。
最初のその敷居を超えられる人ってどういう経験を積んでいる人だと思いますか?
うーん今だとCTFでPwnとかで逆アセンブル/デコンパイラ/デバッガにちょっと触れてる人とかがやりやすいんですかね。システムプログラミングとかC言語でのプログラミングがちょっとわかるとかあれば最初のハードルが下がるかもしれません。
そもそも丑丸さんは何がきっかけでリバースエンジニアリングの道に足を踏み入れたんですか?
最初の一歩は単純に「このプログラムの動作を知りたい」と思ったのがきっかけです。高校生の時にパソコンを使おうと思った時にプログラミング言語を明確に意識したタイミングがあって「なぜこのプログラムが動くのか」というような興味をもったのがきっかけでした。今もその気持ちは何も変わってないですね。プログラミングでなにか作りたいとかいう気持ちはほとんどなかった覚えがあります。
会社の研修でリバースエンジニアリングの能力は育つんでしょうか?
ある程度は可能だと思いますが、幅広くてどこから始めるのか、どこまで教えらえるのかはわかりにくいですね。でもいまだとデコンパイラが優秀なので、実はソースコードを読める能力があればそれなりに読めるようになると思います。
最近のデコンパイラが優秀なので敷居が下がったということですか?
まぁそうですね。昔はデコンパイラの性能によってはソースコードが綺麗に復元されなかったのでディスアセンブルを頑張って読む必要があったりしたんですけど、最近はちょっとやる分にはそこまでする必要がない時もあります。
なのでどちらかというと実はプログラミングの能力だったり、システムへの理解や知識があると最初の敷居は超えられるかもしれません。
少し話は逸れますが、昨今AIが普及している中でこれまでセキュリティエンジニアに必要とされていた知識がいらなくなる、みたいなことはあると思いますか?
いらなくなるっていうのは結構難しいんじゃないかなと思います。生成AIを使うことによって、文章を考えたりするのには楽になることはありますよね。たとえばリバースエンジニアリングの中でも、デコンパイルした情報から消失していた関数名や変数名を推測したりしてくれますので楽はできますが、それが正しいかどうかはまた別の話ですし。一般的によく言われている「AIが提供する情報が本当に正しいのかを見抜く力」は必要だと思うので、ベースとなる知識は絶対に必要なんじゃないでしょうか。
それに、よりディープな情報や特化した情報が欲しいって時にそもそも世の中に情報が出回っていないので、生成AI自体も学習してなくて結局役に立たないと思いますね。
では、最後にこれから入社する方へのアドバイスがあったらお願いします。
僕が特にリバースエンジニアリングをメインの仕事としているから特にそういう人向けになりますが、セキュリティの知識を深めること以外にも、普段からそのベースとなるいろいろなコンピュータ技術にも触れて楽しく遊んでいくと良いと思います。
ここで言うコンピュータ技術っていうのは何でもよくて、パソコンでExcelの達人になるとかとかマクロを極めるとか、競プロに参加したりオリジナルのゲームを作るとか、ネットワーク機器を買って設計したり変な機能を見つけて遊んでるみるとか、OS自作してみるとか、電子工作をするとか、シンプルに新しい技術に触れるとか……そういったこと何でも構いません。時間はかかりますが積み重ねることで多角的な視点や洞察力が身につき、より楽しい未来が待ってると思います。
本日はお時間いただきありがとうございました。
ありがとうございました。
丑丸 逸人 この世に生を授かった時からのバイナリアン。マルウェア解析のエキスパート。サイバーディフェンス研究所のインシデント対応、フォレンジック調査の業務においてマルウェアの解析および付随する脅威分析、バイナリを対象とした診断などを行っている。ハンドルネーム「ucq(勇士Q)」として世界各国のCTF大会を渡り歩き、過去優勝も経験している。codegateで発表したstuxnetに関する研究報告は世界のセキュリティエンジニアに高く評価されている。セキュリティキャンプでの講師、海外での講演、メディアへの露出など、活躍の幅は広い。 |
---|
サイバーディフェンス研究所は、新卒、第二新卒、中途の採用を常時行っています。 応募、カジュアル面談の申し込み、採用や選考に関する質問や相談は、弊社ウェブサイトのお問い合わせフォームやXのDMなどでお気軽にどうぞ!