Yamato-Security / hayabusa

Hayabusa (隼) is a sigma-based threat hunting and fast forensics timeline generator for Windows event logs.
GNU Affero General Public License v3.0
2.26k stars 200 forks source link

Enhancement: Print Maximum memory usage after scan #788

Closed YamatoSecurity closed 1 year ago

YamatoSecurity commented 1 year ago

手動で最大のメモリ使用を確認するのが大変なので、スキャンが終わったタイミングでメモリ使用を調べて、最後にElasped time:の直前にMaximum memory usage: 1.22 GBなどを出力したいです。(他の例: 100.20 MB等々)

調べたら、capやbench-rsのcrateを使うとglobal memory allocatorを変えないといけないので、procinfo (https://docs.rs/procinfo/0.4.2/procinfo/pid/fn.statm_self.html )を使ったら良いかも?

これで検証する時にメモリ使用率が急増しているかどうか簡単に分かります。

hitenkoku commented 1 year ago

ありがとうございます。1つ質問があります。 procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。 その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。

hitenkoku commented 1 year ago

procinfoを確認してみましたが、こちらはLinux用のものでしたのでWindows用のデータ取得は別途検討する必要があります

hitenkoku commented 1 year ago

こちらのほうがトータルのメモリ利用率の取得は容易なようです。ただし、プロセス単位では表示できなさそうです

https://crates.io/crates/memory-stats

YamatoSecurity commented 1 year ago

ありがとうございます。1つ質問があります。 procinfoのメモリ利用量を確認するタイミングを確認したいのですが、以下の3つで大丈夫でしょうか。 その中で最も高い値をメモリ使用量をElapsed Timeの前に表示するという形でよろしいでしょうか。

なるほど、確かに可能であれば違うタイミングで取って、最も高い値を出した方が良さそうですが、開始時はまだ少ないはずなので、不要かもしれません。(一回図ってみて、確認したら良いと思いますが) スキャンが終わったら、メモリが開放されて急に減る可能性があるので、本当は99.9%のタイミングと、スキャン後に増えた場合、結果を出力している間が一番高そうです。結果出力後だと、メモリが開放されて、大分減っているはずです。(私が見ている限り)

procinfoはlinuxのみだったんですね。。ふむ、、トータルメモリだとHayabusaなのか、他のアプリが影響しているのか分からないので、プロセス単位が良さそうですね。後で他に良い方法がないか調べてみます。

YamatoSecurity commented 1 year ago

@hitenkoku https://crates.io/crates/simple-process-stats これはどうですか?

hitenkoku commented 1 year ago

@YamatoSecurity ありがとうございます。こちらであれば利用しているプロセスに対してメモリ使用率が取れそうなので実装してみます。

hitenkoku commented 1 year ago

simplre-process-statsをcargo.tomlに入れた時にmemchrのバージョンの競合でコンパイルが出来ないことを確認(memchrはHTML出力のために利用してるpulldown-cmarkではmemchr 2.5.0を利用。simple-process-statsはMac用のdarwin-libproc0.2.0がmemchr 2.3台までを指定されている)

hitenkoku commented 1 year ago

simple-process-statsで問題となっているライブラリ(darwin-libproc0.2.0)の最新版を確認してみましたが、更新されていないのを確認済み。別crateを探す方針とさせてください。

YamatoSecurity commented 1 year ago

思ったより簡単にできないですね〜。 Windowsの場合は特にスキャン中にメモリ使用がかなり変動するので、ピンポイントで最大のメモリ使用のスナップショットを取るのが難しそうです。Linux/Macではtimeコマンドで最大のメモリ使用(max resident set size)を簡単に測れるので、とりあえず別のツールとの組み合わせでメモリ使用を測りたいと思います。(Windowsの場合は、procmon等が使えそうです)

例: /usr/bin/time -l ./hayabusa-1.8.0-dev -d ../hayabusa-sample-evtx -o bla.csv

Screen Shot 2022-11-06 at 11 00 59
fukusuket commented 1 year ago

@YamatoSecurity @hitenkoku

下記branchで試してみたところ https://github.com/Yamato-Security/hayabusa/tree/dev-print-mimalloc-stats-info

mi-malloc本体のmi_stats_print_out関数をunsafeで直接呼ぶことでmi-mallocのメモリ統計情報は出力できました。mi_stats_print_out関数(C言語)を直接呼んでいるので、残念ながら出力内容を良い感じにカスタマイズはできないですが...😅

↑branch実行すると、以下の感じでmi-malloc自身が持つメモリ統計情報(おそらく自プロセスの)が出力されます。 (手元のWindows10/M1 Macでは↓出力確認できました) mimalloc-stats-info

hitenkoku commented 1 year ago

@fukusuket 情報提供をしていただき誠にありがとうございます。素晴らしいです。デバッグの側面でもあるため出力に拘る必要は私はないと思いますのでこれで十分だと思います。他OS制限等もドキュメントを見た限りなさそうですね。

@YamatoSecurity unsafe関数ではありますがこれでピーク時(多分解析完了時付近)のメモリが取得できますがどうしましょうか。unsafe関数はなるべく減らすという方針もありますが、debug 用のオプションをつけることでデータを取得するようにするのも良いと思われますがいかがでしょうか。

hitenkoku commented 1 year ago

一旦作成判断を行うためissueをreopenします。

YamatoSecurity commented 1 year ago

良いですね。--debugオプションを付けた時に出力しましょうか?

fukusuket commented 1 year ago

@YamatoSecurity @hitenkoku

ご確認ありがとうございます🙇 debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔

OTHER-ACTIONS:
    ...
    --debug  Print memory usage.

またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?

hitenkoku commented 1 year ago

個人的には追加しても良いと思います

またメモリ統計情報出力タイミングは、以下のどちらのパターンがよいですかね?

私は解析完了時に出してしまうと、結果の中に埋もれてしまうので最後1回だけの出力で良いかと思っています(Peakのところでその分は出ていると推測)

YamatoSecurity commented 1 year ago

debugオプションで出力する場合は、command usageにも↓の感じで、help出力したほうがよいですかね?🤔

そうですね。 DISPLAY-SETTINGS配下の--debug Print debug information (memory usage, etc...)で良いと思います。 ※現在はメモリ情報だけですが、他にデバッグ情報を入れたい場合はこのオプションを使ったら良いと思います。

hitenkoku commented 1 year ago

それでは本機能を作成するということで承りました。 @fukusuket pull-requestを出してもらえればこちらで確認してマージ対応しますのでよろしくお願いいたします。

fukusuket commented 1 year ago

承知しました!↓にて作成次第、PRお送りさせていただきます:)