@port139 Blog

基本的にはデジタル・フォレンジックの技術について取り扱っていますが、記載内容には高確率で誤りが含まれる可能性があります。

揮発性情報取得に伴うリスク

ITProの「今週のSecurity Check(第176回)」という記事を読んで、揮発性の順序やコマンドが人によって違うもんだなぁと改めて思ったのでちょっとメモしてみたり。

Windowsマシンへの不正アクセスを発見」---そのとき,どうする?
Windowsにおける証拠保全の具体的手順
http://itpro.nikkeibp.co.jp/article/COLUMN/20060831/246898/?ST=security

揮発性情報と、揮発性情報の取得を行う際の順序については、上記記事でも紹介されている RFC 3227 証拠収集とアーカイビングのためのガイドライン、に記述されています。
揮発性の高い情報、つまり時間の経過と共に消えていく情報に対して、情報が消える前に情報を取得しなければいけないので、その順序は消えやすいものから優先してということですやね。

本題とはずれるんですけど、揮発性情報を取得しよう!という記事では大抵「ログオン」の手順が抜けており、ログオンに伴う危険性の説明なしにいきなりコマンドの紹介に入っていることが(自分の書いたものを含めて)多いですよね(笑)
しかし、個人的にはログオンのトラップに引っかかった経験があるので、自動実行を仕掛けることが容易な Windows の場合は特に慎重な対応が必要になると感じています。
まぁ、システム管理者自らがトラップに引っかかって運用中システムを破壊したり、より被害を拡大させたり、本来必要だった証拠データを消したとしても、「しょうがない」って開き直ってしまえばそれまでかもしれませんがB-)
今時に構築されたシステムであれば、揮発性情報の取得をわざわざログオンして実施しなくても、ログでわかるようになっているのではないかとも思いますが...

揮発性の順序

個人的にはいつも悩むのですが、実行中のプロセス情報とTCP/IPの接続状態、どちらのコマンド実行を優先すべきなんでしょうかね?
揮発性の順序は“消えやすいものから”ですが、ここで考慮しておかなければいけないのは、コマンド実行後に情報取得に必要となる時間ですかね。揮発性というくらいですから、数秒の差で情報が取得できたり消えたりします。*1
例えば、netstat -na を実行したタイミングで TCP/IP の接続状態が多数存在する場合、実行結果の取得が完了するまでに数秒〜数十秒かかる場合があり、この間にひょっとすると不審なプロセスが終了してしまい、この次に実行したプロセス情報を取得するコマンド実行時には情報が消えているかもしれません。
恐らく、これらより消えやすいのはキャッシュ時間などから考えると ARP テーブルのほうではないかとも思いますが、ARPテーブルの情報を取得することがさほど重要でなければ、後回しでもいいのかもしれません。

まぁ根本的なところとして、TCP/IP の接続情報といった通信履歴はそもそもログに残しておけばいいような気がしますし、プログラムの実行情報は「プロセス追跡の監査」を有効にしておけばいいわけですよね。
最悪、それらのログが失われた又は取得設定が変更されロギングが停止状態にある場合には、揮発性情報からデータを収集する必要があるかもしれませんが、そんな危険な状態にあるシステムへログオンする勇気は私には無いです(笑)*2
ログオン情報のような基本的な情報を、揮発性情報から取得しなければいけないシステムってのは、かなり終わっている気がしないでもないです。

*1:たかが数秒というお話もありますが、その1秒差でデータが失われる可能性を考慮するのがそもそも揮発性の順序ですよね

*2:意図的に追跡できないようにログの取得などを止めているわけですから、管理者の調査に備えないというのは楽観視しすぎなんぢゃないですかねぇ

揮発性情報の取得に利用するコマンドの選択

例えば、現在実行中のプロセス情報を確認するという目的であれば、タスクマネージャのプロセスタブから確認することができますが、ここで表示される情報には、調査や追跡で必要となる実行パスが抜けてます。あえて揮発性情報を取得するのであれば、それが追跡や調査で利用できるだけの情報を取得できるものかを確認してから選択したほうがいいですよね。
個人的なお奨めは WinMSD のプロセス情報で出力されるのと同等の情報が得られるコマンドです。しかし、WinMSD であっても若干問題があります、WinMSD で出力されるプロセス情報には、実行ユーザ権限に関する情報が含まれていません。補助する目的で PULIST.EXE を実行したとしても不十分だったりします。DCOM 経由でプロセス実行しているケースでは、PULIST.EXE では正確なアクセス権が表示されません、情報がまったく無いよりはましですから、PULIST.EXE も気休めに実行しておいたほうがよいかもしれません。
最もお奨めは「プロセス追跡の監査」を有効に設定しておくことです。プロセスの開始日時・実行ユーザー名・プロセスパスなどが記録されていますし、すでに実行が終了しているプロセスについても調査できちゃうわけですからやはりログは大切です。*1
netstat コマンドも Windows XP/2003 であれば、netstat -nab などとすればプロセス情報とリンクした状態で確認することができますが、これも Port Reporter を導入していれば、あえて netstat でプロセスとポートの結びつきを確認しなくても OK のような気がします。*2
とはいえログの改ざんや消去といった事態も考えられますから、イベントログであれば EventReporter でリモートに飛ばしておくとか、事前に仕掛けはしておく必要がありますね。

*1:DCOM 経由でのプロセス実行も監査ログであれば最終的にどのユーザー権限で実行したのかわかります

*2:ただし、通信履歴はこれはと別に取っておいたほうがよいと個人的には思うです

MACtimeと削除領域も揮発性情報

コマンド実行時に失われる可能性がある情報として、MACtime があります。MACtime も時間の経過と共に更新され失われますので、一種の揮発性情報だと個人的には考えています。タイムラインを追跡したことがある管理者であれば、MACtime の重要性は認識されていると思いますが、揮発性情報の取得で利用するコマンドを選択する場合には、MACtime への影響が極力ないものを選択する必要があります。
また、コンピュータ・フォレンジック的には削除領域を上書きしてしまう、つまりディスクへの書き込みを発生させるコマンドの実行は大変困ります。隠蔽工作ということであれば仕方が無いですが ;-)、まちがっても OS を STOP させて DUMP ファイルをディスクへ書いてしまうのは避けていただきたいと思うわけです。削除領域も時間の経過と共に上書きされ失われていきますので、一種の揮発性情報と考えたほうがよいかもしれません。

揮発性情報は本当に必要なのか?

いやぁここ本当に考えていただきたいところなんですが『その揮発性情報は本当に必要なんですか?』という事です。それだけ必要な情報であれば、ログに記録するようにしたほうが良いのではないでしょうか?
もしログに残らないとか、その時点での情報がどーしても必要という場合に揮発性情報を取得する必要がありますが、おそらくかなり絞り込めるでしょうから、事前に準備しておけばすんなり取得できるでしょうしリスクをそれほど取らなくてすむかもしれません。

IPとMACアドレス

の確認はしたほうがよい気がするので、ケーブル抜く前に ipconfig /all を実行したほうがよいのではないでしょうかね。っていうような話題を数年前に港139MLでやった気がするけど、ipconfig 実行するのであればついで kjm 先生お奨めの /displaydns オプションも実行しておくと吉なんすかねぇ。/displaydns で得られる情報をログに残すの面倒っぽいし。

揮発性情報は信用できるのか?

揮発性情報の取得目的によりますが、怪しいものがいないか確認したいということであれば、そもそも『見えるのか?』という問題がありますね。
最近はすっかりメジャーになった? rootkit ですが、昔のファイル置換により隠蔽するタイプではなく、正規のコマンド実行でも情報を隠蔽できる、カーネルモード rootkit が最近では主流のような気がしないでもありませんし、その技術は日々進歩していますやね。
『見えない』かもしれないのに、揮発性情報としてプロセス情報や通信状況を確認しようとするのは何故なんでしょうか?
個人的な超勝手な推測では、恐らく参考文献に書いてあるからなんでしょうけど、それらが書かれた時代と現時点ではかなり状況が違っているような気もします。
見えないかもしれないのに、わざわざ危険を承知でログオンしてまで何を調べるのか疑問だったりするのですが、ひょっとすると単に気休めで情報を取得するケースが多かったりもするんでしょうか。
攻撃が進歩するのに対して、防御側の進歩つーのはあまりないんですかねぇ。*1
rootkit に対抗する検知ツールも進化していますが、なんつーか「ぜんぶすきゃんしてはけーん、すぐ削除」という感じで、被害状況などを把握したいといった向きではかなり微妙な動きをしてくれるものも多数あります。

*1:まぁ大抵この手のお話をしていると検知よりはいかに隠すかのほうが話題として盛り上がるわけですが

それでも揮発性情報として欲しいデータは何か?

なんだかんだ言いながら、仮にログが揃っているとしても、プロセス実行状況とTCP/IPの接続状況はあったほうが良いような気がしますね。でも、それ以外でどうしても必要な情報っていうとなんでしょうね?
最近流行のメモリダンプ?、確かに取得できるのであればあったほうが気休めにはなるかもですけど、ディスクの解析だけでもえらい時間かかるのに、このうえメモリダンプまで見る時間あるんすかねぇ。
メモリダンプで取得したいと考えている情報は、やはりログに残したほうが良いと思うのですが、メモリダンプから取得したい情報ってなんなんすかねぇ・・・。

発見することが終わりではない

インシデント・レスポンスの演習とかやると、rootkit などを発見したことで「終了」といった雰囲気になる場合がありますけど、実際には被害範囲の特定や、被害発生時期の確認とかのほうが復旧上は重要なわけですやね。そこで必要となるデータが得られるのであれば揮発性情報も大切なわけですけど、どうもそういった向きで、揮発性情報の積極的な必要性について思いつかない今日この頃。
例えば、情報流出があったかどうか確認するとかの場合、発覚や発見時点の netstat 情報だけあっても無意味なわけですよ、過去に出てないかも知りたいわけですから。そうするとやはり TCP/IP の通信履歴なりは残ってないと追跡のしようが無いわけですよね。で、TCP/IP の通信履歴だけだと、どのプロセスがその通信していたのかわからないので、過去に遡って該当ポートを利用していたプロセスが判明しないといけないわけなので、プロセス実行のログと利用したポート番号の組み合わせがログに残ってないと困るわけですやね。でもって、該当ファイルがアクセスされた痕跡があるかとかは Atime から確認するわけですが、これがウイルススキャンなどで潰されているとさっぱりわからないので、必要なファイルへのアクセスログは残っていたほうがいいわけですやね。と、ログならたくさん事後追跡での必要性について思いつくわけですが、揮発性情報って、復旧や被害範囲・時期の特定を行う上ではどんなの必要なんすかねぇ。