企業内セキュリティリサーチャー(R&D寄り)としての生活

Intro

この記事は、whywaita Advent Calender 2024 3日目の記事です。
昨日はnahareportさんの記事でした。
僕はいまだに有線ぶらぶらです。

はじまり

こんにちは、molyです。
退職RTA常連の歴戦の猛者です。(今はもう落ち着いています)
今日は自分のロールである企業内のセキュリティリサーチャーとしての生活や、求められる事項等を話したいと思います。

セキュリティリサーチャーって何?

僕はR&Dと脅威リサーチ(サイバー脅威に関する研究)を主に行っています。
RedTeamに特化したり、マルウェア解析、攻撃キャンペーンの調査、R&D、独自調査の結果から啓蒙活動などを行うロールが、セキュリティリサーチャーだと思っています。

企業内セキュリティリサーチャー(R&D寄り)に求められるもの

セキュリティリサーチャーに求められるものは色々とあります。

  • 社内で知見を広める
    • 社内でのレピュテーション稼ぎと、全体のレベルの底上げ
  • カンファレンスや勉強会で情報発信をする
    • マストではないですが(NDAで発表できないことが多い)、やると有名になれてよいのではないでしょうか
  • 特定の領域の調査分析及び研究
    • プロダクトのために的を絞ったり、研究にダイレクトに関わることは必須です
  • 「お金」を生み出すためのR&D
    • これは好き勝手なんでもやり放題ではなく、企業内のリサーチャーなのでBIZサイドも考えなければいけません
  • 他セクションの技術支援
    • ためにためた技術を還元するのもリサーチャーとしての使命です

と、大きく分けて5つかなと思います。

一日のタイムスケジュール

僕は完全にフレックスポジションです。
ただ、「お金」を生み出すためのR&D はマストです。

朝、出勤すると脅威情報がないかどうかSNSやインテリジェンスサービス等で調査した後、気になるものを分析/研究します。
日々の新たな脅威に対抗するためには知見をためければいけませんので必須です。

検体(マルウェアなど)の解析や、TTPs(戦術・技術・手順)について分析して、緩和策などを考えたりしています。
その後は本格的にR&Dを行います。
カーネルドライバを書いたり、アイデア出ししたり、技術調査したり、実験したりと多岐にわたります。

企業内研究者(R&D寄り)として求められるもの

企業内のリサーチャーは確実に抑えておくべきポイントがいくつかあります。 以下にまとめます。

  • 会社の方針に忠実にあるべきということ
  • お金に絡むのでビジネス的視点が大事ということ
  • 報告会などでわかりやすい資料をつくること

会社の方針に忠実にあるべきということ

上司やマネージャーが求めてビジネスとして動くものなので、完全に自由と言うわけではありません。
とはいえ、自分のエゴをある程度出して提案をし続けることも大事です。
うざいと思われるくらい巻き込むくらいがちょうどいいのかなと思います。

お金に絡むのでビジネス的視点が大事ということ

R&Dでの成果物は製品になります。
なので売れるものを作ろうという気概は必要です。
わけのわからん物を作って売れないのなら、このポジションはニートに近いです。

報告会などでわかりやすい資料をつくること

報告会に参加する人がセキュリティに特化していることは、あまりありません。
なのでなるべくわかりやすく資料を作って進捗をみせることが大事です。
そうしないと研究というモヤモヤとしたなにかをやっている謎の人認定されてしまいますし、他のロールの方とのコラボレーションができない可能性があります。
自分のため、周りのためのものです。

おもしろいこと

やはり毎日上がる脅威情報や、テレメトリデータから調査研究を行うことは楽しいです。
R&Dも形になるまでは試行錯誤ですが、アイデアが褒められると脳汁が出ます。
日々、学びがない日はありません。
ただ、ビジネスになるアイデアを思いつかなければならないというプレッシャーはあります。
上司に相談してなるべく圧がかからない環境を整備してもらいましょう。

限界

「どうしてもこのアイデアがやりたいんだ!」、「こういうものがつくりたい!」と思う方も多いと思います。
でも会社は営利目的の組織であるため、すべてが思い通りになるとは限りません。
なので、本当にやりたいことがどうしてもやりたいのなら、自分でエゴを出して開拓するか、独立するのがいいと思います。

最後に

簡単にですが、企業内セキュリティリサーチャー(R&D寄り)の生活と求められるもの、するべきことを紹介しました。 少しでもリサーチャーになる方の参考になれば幸いです。
明日はkyontanさんの記事ですね!楽しみですね!

AVTOKYO2022に登壇しました

はじめに

こんにちは。morimolymolyです。

Hello

whywaita Advent Calendar 2022 - Adventar 5日目の記事です。

昨日はなはれぽさんTerraformをローカル環境で勉強できるようにするという記事でした。

今回はAVTOKYO2022に登壇者として参加したので参加ブログを書きます。

続きを読む

イベントにおけるCode of Conductの重要性

はじめに

こんにちは。morimolymolyです。 某氏と揉めてさぞ心配&嫌厭なされた方もいらっしゃると思いますので、両者の話し合いも住んだことですし、詳細を伏せてサマリーブログを書こうと思います。

ことの成り行き

某氏が某イベントのアフターパーティにてセクシャリティを弄る行為やセクハラなどを複数人の人間に行いました。 また、そのイベントはCFPで発表者を募っており、私は登壇者として参加していました。 つまり、登壇者の顔すら立てずに(というより登壇内容に触れてくれw)自分のしたいママ、セクハラを続けていたという問題がありました。 そこで「こんな大人がいるのか」と驚き、その場では何も言えませんでしたが、以下の事を考え攻撃することにしました。 *1

「多様性が尊重されて久しい世の中、セクハラやセクシャリティを弄るような行為が“キャラ”として許されるのはどう考えてもおかしい」 「パブリックスペースでけちょんけちょんにしてやれば聴衆も気がつくのでは!」

Code of Conductがあればどうなったのか

Code of Conductがあれば、その場でより上のスタッフを呼び出禁にすることができます。 今回攻撃をしている中でわかったのは、攻撃している僕にメリットが一切ないどころか攻撃的として認識されてしまうことや、そもそも断片的な情報しか得られない第三者が情報不足が故に様々なことを勘ぐってしまうことです。 攻撃をする前に考えておくべきでした。この場を借りて謝罪させていただきます。 パブリックスペースで攻撃をせず、Code of Conductに従うことができればよかったと思っております。

もし、あなたのオーガナイズするイベントにCode of Conductがない場合、すぐさま作ることをおすすめします。

まとめ

某氏との話し合いは付きまして、今ではいざこざなど一切ない状況にあります。 そのため会社や個人に対して攻撃をすることは絶対にしないでください。

*1:今回の被害報告を個人に対する攻撃と解釈した人もいるためここでは自戒の意味も込めて攻撃と言っております。

ドラゴンの力でControl Flowからバイナリ解析を手助けする

はじめに

こんにちは。morimolymolyです。 今日はControl Flow Graphを用いてバイナリ解析を手助けする手法をご紹介いたします。

背景

GoogleCTFのRev問題についてとある人物から連絡を受けました。

「似たような処理がある関数が多数ある場合どのようにして解析していますか?」

基本、私はCFGを見ます。 ですが、CFGを一瞥して似ているなーだけで終わらせるのもあれなのでGhidraスクリプトを書いてみました。

問題は以下のようなかんじでした。

defineで関数定義

関数の登録

この似たような関数がまとめられると解析が楽になりそうですね。

GhidraスクリプトでCFGを生成する

スクリプトの前に実際に関数のCFGを生成してみましょう。 今回は2つの関数について生成してみます。

add

sub

このようにしてみるとほぼ同一のコードであることがわかりますね(addとsubだしね)

BasicBlockの数とEdgeの数とで比較してしきい値をもうけて比較検討して関数を自動命名させてやれば解析はぐんと楽になるでしょう。

さて、GhidraスクリプトでCFGを得るにはどうしたら良いのでしょうか。

ghidra.re

このAPIを使えば良さそうですが、なんとドキュメントもexampleもなくぶん投げてしまいました!

そのためかんたんのためにBBの数とEdgeの数を計算して求めることにしました。 いかがコードになります。

gist.github.com

みたままBBを探して次があればそれも見に行くというコードです。 自動命名までは実装していませんが、それは読者の課題にしておきます(setNameメソッドでかんたんに命名できます)

おわりに

いかがだったでしょうか。 CFGは強力な武器になり得ることが皆様もおわかりかと思いますが、Ghidraではスクリプトの力を用いて更に強力にすることができます。

以上でおわります。

GhidraでBinDiffする

はじめに

どうもこんにちは、morimolymolyです。 最近は完全に体調を崩してしまいました。 さて、今日はGhidraでBindiffする方法を伝授いたします。

背景

2016年03月22日報道のリリースによると、GoogleによりBindiffが無償化されたようです。

www.zynamics.com

また、これに伴いBindiffに必要なExportファイルをGhidraやBinary Ninjaで生成できるツールも公開されました。

github.com

GhidraでのBinExport方法

まず、binexportに必要なバージョンのGhidraをインストールします。 binexportのZIPファイルをReleaseからダウンロードします。 その後はGhidraを立ち上げて、「File→Install Extensions」からBinExportを選択します。

次に、検体をインポートした後に自動解析にかけます。 最後に検体のディスアセンブラ画面を閉じて、検体を右クリックしてExportを選択します。 ここで注意したいのは、Binary BinExport (V2) for BinDiffを選択することです。

これでBinExportは成功します。

BinDiffしてみる

BinDiffの使い方は省きますが、難しいところはないでしょう。

とある検体とバージョンの違う検体のBinDiff結果

同じバージョンのBinDiff結果

CFGレベルでも命令列レベルでも比較ができるので、非常に便利ですね! IDA Proなしでここまでできるのであれば文句はありません!

おわりに

いかがでしたか。 GhidraでBinDiffをやってみました。 実際、私の現状ではBinDiffを使う機会というのが少ないのですが、特定のマルウェアを追いかけている際に、バージョンごとにどのようにことなるのか大雑把に測るには丁度いいツールだと思います。

MoqHaoのiOS用ランディングページの難読化処理

はじめに

こんにちは、morimolymolyです。
MoqHaoの検体をfuckする話はアクティブディフェンス研究所でネタにしましたが、最近はそのインフラについて調査を進めています。
blog.activedefense.co.jp

また、感染端末の電話番号をどのように悪用するのかも調査をしています。
blog.activedefense.co.jp

今回はランディングページに焦点を当てようと思います。

ランディングページ概要

ランディングページには大きく分けてPC、AndroidiOSの3つがあります。

SMSで配信されるURLについて、UserAgentを識別して分岐していきます。

PCには404を返し(最近の話ですが)、Androidには配信されるURLにある文字列をパスとして付与したページへ、iOSはduckdnsで取得されたページへ遷移していきます。

PC: 404
Android http://配信URL/特定の文字列
iOS hxxp://hogehoge[.]duckdns[.]org

難読化処理

さて、iOSのランディングページには難読化処理が施されており、IoCを隠す意図があると考えられます。
以下が実際に取得できたランディングページのソースコードです。
moqhao-ios-landing-page.html · GitHub

コードとしては単純で配列にある文字列の最後の要素をkeyとしてXORしてevalするだけです。

すると以下のようなコードが現れ、これを実行します。

alert("APP Storeアカウントは安全異常があるので、再度ログインしてください。");
location.replace('hxxp://yrdlaebbqt.duckdns.org');

たしかにIoCは一見すると取りづらいと思いますが、自動化の手法としてSeleniumなどを用いればかんたんに突破できます。

おわりに

MoqHaoの用いるランディングページの概要とその難読化処理を解説いたしました。
より発展した難読化処理が実装されるだろうことは予見されるため、一応備忘録的に記事を書いてみました。

CS:GOのナイフが奪われた話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の8日目の記事です.

本日は僕が2年前にCS:GOのナイフ(スキン)が奪われて,1.8万の損害を出したことについて書きたいと思います.

CS:GOにおけるスキンとは武器の見た目を切り替えるだけのもので,高級なものだとウン十万円もする代物です.
僕は2万円以下と決めて購入していました.

本記事はインターネット詐欺の撲滅を啓発する目的です.

とある日

陽気な外国人からチャットが届きました.

「Hey, 君のスキンかっこいいね!僕のと交換しない?」

相手のインベントリをみるとなかなかかっこいいスキンがあったため了承しました.
すると相手はBitSkins.comやCS.MONEYなどの正規のウェブサイトで価格の比較をするように指示してきました.
定番のサイトばかりだったので指定されたサイトでログインして比較しました.

その後,相場がわかったので値段を伝えると,じゃあこのスキンと交換しようと,僕のものより少し高いくらいのスキンを提示されました.
喜んで取引を開始し特に何も見ずに承認をすると,手元には何も残っていませんでした.

何がおかしい?

今のやり取りで一体どこに罠があったでしょうか?

  • 提示されたサイトにログインしている
  • 取引内容をきちんとみていない

この2点に罠がありました.

詐欺の手法

詐欺の手法は以下の通りになっています.
まず詐欺師は正規のサイトに紛れ込ませフィッシングサイトにログインさせます.
被害者はまずトレードのリクエストを送ります.(from:被害者, to:詐欺師)
詐欺師は盗んだ認証情報を用いて,詐欺師のbotが自動的にリクエストをキャンセルし,新しい偽のトレードを作ります(from:被害者, to:詐欺師のbot).
詐欺師のbotは詐欺師と同じプロフィールをしています.
トレードを承認するためにモバイルアプリを用いますが,UIがあまりよくできておらず,偽のトレードだと気づくことが難しいです.(2019年当時)

フィッシングサイト

フィッシングサイトは以下のようになっています.
f:id:morimolymoly:20211202150034j:plain

一見分かりづらいですが,Steamのログイン画面はJSで作られたWindowsの窓にみせかけたフローティングウィンドウです.(picture-in-picture attack)
この攻撃に気が付かないとログイン画面は極めて正当にみえます(URLやSSL表示など)

詐欺サイトは誰が作ったのか?

早速ソースコードをダウンロードし,解析,OSINTを行いました.
github.com

このサイトを販売しているのは,Fakerと呼ばれる人物でした.
Telegram: https://t[.]me/savage67

また詐欺のチュートリアルマニュアルを発見いたしました.

Fakerの提供するサービスは以下のサイトにあります.
https://webdev0[.]com/services/

f:id:morimolymoly:20211202150754j:plain

おわりに

現在でもFakerの作成したフィッシングキットは使われているようです.
謎のウェブサイトにログインするときはpicture-in-picture attackなどにも気をつけてログインしましょう.
またトレードの際にはしっかりとトレード内容を確認するようにしましょう.

Out-of-the-box VMIでチートをした話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の2日目の記事です.
DeNAではセキュリティ技術グループでゲームのチート対策などを行っております.
詳しいことは僕のインターン参加ブログをご参照ください.

morimolymoly.hateblo.jp

そんなわけ(?)で今日はチートのかなりベーシックな手法をOut-of-the-box VMIで試したのでご紹介いたします.

Out-of-the-box VMIとは

Virtual Machine Introspectionとは,仮想マシン(VM)を監視・解析するための技術です.
VMIにはOut-of-the-boxとIn-the-boxの2種類存在し,前者はVMの外から,後者はVMの内部から監視・解析するものです.
Out-of-the-box VMIは完全にVMの外から監視・解析を行うことから,マルウェア解析などの用途に使われます.

libvmiやDRAKVUFなどが有名なプロダクトです.

https://libvmi.com/
drakvuf.com

Out-of-the-box VMIをチートに使うことにより,チートをしていると気づかれにくく,特権的な操作を行うことができます.
最近はアンチチートがカーネルドライバになっているケースがありますが(VALORANTのVanguardが有名),それはRing0つまりOSの権限で動くのですが,VMを管理するソフトウェアであるハイパーバイザは所謂Ring-1で動作します.したがって権限が絶対的に上になります.

そのためこれを用いたチートができないか調査をいたしました.

memflow

調査をした結果,memflowというライブラリがみつかりました.
以下に特徴を列挙いたします.

  • Rustで書かれている
  • Rustでツールがかける
  • KVM based
  • PCI Leech対応
  • Windowsの解析に対応

名目上,DMAライブラリとしていますが,明らかにチートツールに転用することができます.
関係ないですけどRustでかけるのがいいですね!!!!!

memflowの使い方

以下にmemflowの使い方を説明します.

まずmemflowupをします.
これはmemflowのconnectorをセットアップします.

git clone git@github.com:memflow/memflowup.git
cd memflowup
python3 memflowup.py

次に以下のリンクからReleaseされているkvmのconnector(KVMとのコミュニケーションをとるもの)をインストールします
github.com

sudo dkms install --archive memflow-0.1.4-source-only.dkms.tar.gz
sudo modprobe memflow

次にmemflow-cliのインストールをします.

git clone git@github.com:memflow/memflow-cli.git
make install

最後にKVMにWindows10なVMをつくり,接続テストをします.(VM名はwin10としました)

memflow conn new kvm -a win10

チートシナリオ

早速チートをしましょう!!!
対象となるゲーム?は以下のようなゲームです.
変数や関数のアドレスを表示しているのはデバッグ用でチートには使用しません.

f:id:morimolymoly:20211119173133p:plain
samplegame

連打してポイントを稼いで,10000000点以上になるとwin!と表示されます.
ソースコードは以下のようになっています.

#include <iostream>

void win(int counter) {
    if (counter >= 10000000) {
        std::cout << "win!!!" << std::endl;
    }
}

int main()
{
    std::cout << "Simple Counter!!!!\n";
    int counter = 0;
    std::cout << "counter address: 0x" << &counter << std::endl;
    std::cout << "win address: 0x" << &win << std::endl;

    while (1) {
        win(counter);
        getchar();
        std::cout << "counter:" << counter << std::endl;
        counter++;
    }
}

シナリオとしては以下のようなものを想定します.

  • 点数を自由に操作する
  • win!!!を毎回表示させて優勝してお酒が飲みたい

それでは行きましょう.

チートツールを書く

以下にチートツールのレポジトリを貼ります.
github.com


チートツールで行っているチートは以下のようになっています.

  • 点数を自由に操作する == スタック上の変数の改ざん
  • win!!!を毎回表示させて優勝してお酒が飲みたい == メモリ上のコード領域の改ざん

スタック上の変数の改ざんには独自のメモリ検索エンジンを実装し,スタック上から目的の変数を探して改ざんします.
メモリ上のコード領域の改ざんには優勝するために改ざんするべきコードを改ざんします.
これらはすべてOut-of-the-box VMIで行われています.
完全にVMからは不可視で改ざんを行います.

スタック上の変数の改ざん

今回は変数がスタック上にあることが事前にわかっているので,スタック領域を求めます.
これはTEBを用います.
en.wikipedia.org

TEBはThread Information Blockのことで,現在走っているスレッドの情報が格納されています.
スレッドの情報にはスタックについての情報も載っています.
memflowはTEBのアドレスを求めてくれる機能があるので,そこからオフセットを用いてメモリからスタックのベースアドレスとリミットアドレスを取得します.
その後はメモリ検索エンジンを自前で実装し,終了です.

メモリ上のコード領域の改ざん

毎回優勝したい場合,10000000点以上を取らなければいけませんが,それは面倒くさいです.
なんなら変数の改ざんをしなくても済むようにコード領域を改変しましょう!

まずはどこにターゲットになるコードがあるかを解析しましょう!
まずはGhidraをおもむろに立ち上げて,exeファイルを読み込ませます.
その後に"win!!!"文字列を検索します.

f:id:morimolymoly:20211119172510p:plain
win!

みつかりました!
XREFをみるとwin!!!文字列を参照しているコードがどこにあるかがわかります.

早速みてみましょう!

f:id:morimolymoly:20211119172506p:plain
ターゲットコード

これをみるとベースアドレス+ 0x1119 にあるJL命令を潰してやれば良さそうです.
memflowの動的メモリ改ざん機能でここを0x90(NOP)で潰します.

結果

それではOut-of-the-box VMIなツールでチートをします!!!!
チートツールは以下のようになっています.

f:id:morimolymoly:20211119173047p:plain
cheat tool

結果は以下のようになっています!!!!

f:id:morimolymoly:20211119173057p:plain
チート結果

優勝しました!!!!!!!!!!!!!!!!!!!!!!1

対策方法

流石にチートしましただけではどうしようもないので思いつく対策を以下に列挙いたします.

  • 特徴的な文字列は暗号化する
  • 点数の値を暗号化する
  • VM検知をする(アーティファクトがどこかにあります)
  • コードのインテグリティチェックをする

……あまり参考になりませんね…….
Out-of-the-box VMI cheatを倒すにはどうしたら良いのでしょうか…….
これは今後の課題としてブログに対策方法を考えて書くことにします!!!

最後に

今回はかんたんなゲーム?に対してKVM + memflowを使ったOut-of-the-box VMIでのチートを行いました.
スタック上の変数の改ざんと,メモリ上のコード領域の改ざんでゲームをチートしました.
以上で今回の記事を終わりたいと思います.
ありがとうございました.

JIS版MagicKeyboardをLinuxで動作させるパッチがマージされた

ついにマージされてリリースされた

前回の記事

morimolymoly.hateblo.jp

前回の記事でつくったパッチがついにマージされてリリースまで行きました。

以下が情報科学若手の会で発表した資料になります。

speakerdeck.com

時系列

時系列をお話します。

  • 7/29 linux-inputにパッチ投稿
  • 9/15 linux-inputのメンテナからappliedされた連絡
  • 10/5 AUTOSELでbotにパッチがレビューされるように選ばれる
  • 10/14 あのGreg Kroah-Hartmanがマージするよ〜と連絡
  • 10/17 リリースされる

今後の展望

ハックできるところがあるかちょこちょこ探すかもしれない。 いまのところ心理的障壁はかなり軽減された。

関連リンク

github.com

git.kernel.org

hid-apple.c - drivers/hid/hid-apple.c - Linux source code (v5.16.10) - Bootlin