第01回北関東情報セキュリティ勉強会に参加してきました

2012/12/8日に群馬県新島短期大学でおこなわれた第01回北関東情報セキュリティ勉強会に参加してきました.なんか参加者の方がすごかったです..

午前

午前には目覚ましLTということで10:30から1時間ほどLTがありました.

・@dragon_TA さん
ボランティアとセキュリティについて
何よりも自己責任!


・園田さん
SVM(サポートベクタマシン)について
おすすめの本:http://www.amazon.co.jp/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3-%E7%9F%A5%E3%81%AE%E7%A7%91%E5%AD%A6-%E5%B0%8F%E9%87%8E%E7%94%B0-%E5%B4%87/dp/4274204413
amazonのレビューがすごい(笑)」
応用例)apacheのパケットログから攻撃パケットを検知するとか?


・自分
前日まで発表する予定がなかったのですが人数が少ないということなので急遽LTをしました.「ファイルの隠し方」というタイトルで内容はこことかこことかこことか
ここの内容の初歩的な部分を紹介したものです.

実際ここでの説明はかなり簡略したものです.上に挙げた参考ページの中で特に一番初めのものが図があって分かりやすいので興味のある人は是非読んでみてください.
質問) 園田さん
ファイルのスラック領域を利用する場合そのツールの存在が隠蔽の存在を示唆するのでは?
対策 : ツールをUSBメモリに格納しておく -> USBの差し込み履歴でばれるのでは?

まぁ,個人的にはファイルを隠すのであればUSBメモリtruecryptを利用するのが一番なのかなぁと思ったりします.


・まっちゃさん
IT勉強会カレンダーについて
4500件近く登録!
検索もできる!

午後

初めに挨拶のあと,自己紹介.その後本講演

・アンドロイドのセキュリティ
LAC山城さん キャンプ卒業生(2004)とのこと
一部オフレコだったので一部だけ
・スマフォのマルウェアは亜種を除いて2件(2009)から70件以上(2011)に
・正式なアプリが改竄されてアップロードされる例も
パーミッション許可の判断が難しい,確固とした判断基準なし.また利用規約の様に形骸化
ワンクリック詐欺アプリはパーミッション許可によりandroidから電話番号等を抜き出し利用するのでよりリアルなものになる
・スマフォのマルウェアの特徴は,1) 通常のアプリケーションに見せかける,2) アプリケーションの削除で駆除可能(ただしシステム領域に書き込まれると駆除は難しい),3) ユーザ自らがインストールして感染(他端末への感染するものは見つかっていない,というか勝手にアプリをインストールする機能はない)
・スマフォのアプリを作るときはhttp://jssec.org/『Androidアプリのセキュア設計・セキュアコーディングガイド』を参考にしましょう.
スマートフォンフォレンジックスについて
・まとめ 1) アプリは改竄されないように対策を実施,2) ウェブブラウジング機能等外部への通信機能がある場合は,脆弱性チェックをしっかり実施,3) androidは機種によりシステム解析が難しいのでアプリ側でログ機能をつけるとベター


Androidはあまり触ったことがなかったのですが分かりやすい話で非常に面白かったです.個人的にはフォレンジックスについてもっと詳しく聞いてみたかったです.まぁフォレンジックスしたい場合はしかるべき組織でしかるべきツールを使わないと難しそうですね.



・LT
村山直紀 さん
セキュリティスペシャリスト等の本を執筆
試験は国語力?


@cchanabo さん
セキュリティ女子を増やそう!
*表向き*はセキュ女WGの話(JNSA教育部会)


@dry2 さん
オフレコ.なんかすごかった..




記念すべき第一回目でしたが,偶然にも天気にも恵まれ,非常に面白い勉強会でした.最後は電車の関係でばたばたしてしまい碌に挨拶もできず申し訳なかったですが,主催者の方,本当に有り難うございました.あとスイーツおいしかったです!!!

エンディアンの話

x86の場合
nasm(intel syntax)

    mov dword[eax+0x08],0x1234

アセンブル結果

    c7 40 08 34 12 00 00

機械語解読のためにはオペコードのフォーマットに関する知識が必要で、詳しくはインテルのマニュアル参照ですが簡単にまとめると

prefix(1-4byte) opcode(1-3byte) ModR/M(1byte) SIB(1Byte) displacement(1,2,4byte) imm(1,2,4byte)

となります。伊達にCISCと呼ばれてないだけあります。絶対に必要なのはopcodeで、後は命令によってあったりなかったりです。
今回の場合はprefixはなく、c7がopcodeでレジスタorメモリに32bitの即値を転送する命令を示します。
実際にどこへ転送するかということは命令の次のバイトである ModR/M で指定されます。ModR/M の構造は次のようになっています。

Mod(2bit) Reg/Opcode(3bit) R/M(3bit)

このフィールドの解釈は複雑なのでマニュアル参照..ですがとりあえず Mod と R/M 合わせて5bitでレジスタやアドレス指定のモードを構成します。今回の場合は Mod と R/M は 01 000 で、これは[eax + disp8]を示します。つまりこの次に8bitのディスプレースメントが来ることになります。Reg/Opcodeのフィールドはオペランド拡張になっています。マニュアルをみると"オペコード c7/0"と書いてありますがこの/0が拡張オペコードです。
さて、ということで ModR/M の次は SIB はなくて8bitのディスプーレスメントになります。当然これは0x08です。そして次が4byteの即値で0x1234ですが、リトルエンディアンなので "00 00 12 34" ではなく "34 12 00 00"となっています。

mipsの場合

add $1,$0,0x1234

mipsの場合はエンディアンを切り替えることができます。gasの場合は引数に-EBか-ELをつけることでエンディアンを指定できます(デフォルトはビッグエンディアン)。
ビッグエンディアンの場合

  20 01 12 34

トルエンディアンの場合

  34 12 01 20

mipsのadd命令はI形式というフォーマットに分類されます。I形式の場合、

opcode(6bits) rs(5bits) rt(5bits) imm(16bits)

となります。つまり、今回の場合、

opcode: 001000 (add)
rs: 00000 ($0)
rt: 00001 ($1)
imm: 0x1234

となります。ということで命令は0x20011234ですが、ビッグエンディアンの場合は "20 01 12 34"、リトルエンディアンの場合は"34 12 01 20"となります。



エンディアンの話をするとき、機械語的にはどうなってるのか、と思ったので実際に調べてみましたが、x86の場合は命令自体は1byteごとに解釈をおこなっていくので、あくまで4byteのディスプレースメントや即値がリトルエンディアンとして逆向きに格納されます。一方mipsの場合は必ず1命令4byte固定なので、各命令はエンディアンに従って格納されます。結局のところ複数バイトで扱う場合にエンディアンが効いてくるということですね(って当たり前か

macbookのHDDをSSDに交換

今使ってるMBPは確か2009 midなんですが2週間ぐらい前に普通に使ってたところ突然終了して、電源入れて数十分待ってもログイン画面が出なくなりました、しかたがないので起動ディスクからディスクユーティリティを使ってディスクチェックしてみると「深刻なエラーが発生しました」。とうとうだめか..と思いましたがその後もう一度電源を入れ直してみると無事に起動しました。それからその状態で数週間使ってた訳ですが流石にいつ吹っ飛んでもおかしくないので思い切ってHDDをSSDに変えました。


予算的に1万以上はとても出せないのでこれを買いました。
http://www.amazon.co.jp/Intel-Series-2-5inch-Reseller-SSDSC2CT120A3K5/dp/B007P71J9W
まぁ同じ性能/容量であればどの製品も大きく変わるということはないと思います。
あとはOS自体はクリーンインストールするつもりだけどHDDの中身が完全に使えなくなると困るので2.5inch HDD用USBケースも購入。ちなみに買ったSSDにはwindows用ですがデータ移行ソフトがついてました。完全にコピーするだけだったらddでいけるんだろうか。


交換はプラスの精密ドライバーとトルクスドライバーが必要です。適当に裏面開ければ交換できます。
交換してOSをクリーンインストールしたら起動時間が5分44秒()から15秒になりました。まぁSSDの方はクリーンインストールしてるから速くなるのは当たり前だしHDDの方は多分ディスクチェックしてたからそんなに遅いんですがそれにしてもだいぶ快適になりました。そういえばOSをインストールし直す時に初めインストール可能ディスクが何も表示されなくて困りました。最初は接続ミスったのかなと思いましたがなんのことはないです、SSDがフォーマットされてないから表示されないだけです。ディスクユーティリティからディスクを選んで「消去」からフォーマットすればいけます。それにしてもこの辺は不親切というか分かりにくいよういな..(appleは個人がHDDを変えることをあまり期待していない?なんて)


以下xbenchのベンチマーク
HDD

Disk Test 4.50
Sequential 9.64
Uncached Write 8.95 5.50 MB/sec [4K blocks]
Uncached Write 5.88 3.33 MB/sec [256K blocks]
Uncached Read 14.66 4.29 MB/sec [4K blocks]
Uncached Read 15.41 7.74 MB/sec [256K blocks]
Random 2.93
Uncached Write 0.86 0.09 MB/sec [4K blocks]
Uncached Write 7.63 2.44 MB/sec [256K blocks]
Uncached Read 24.53 0.17 MB/sec [4K blocks]
Uncached Read 41.24 7.65 MB/sec [256K blocks]

SSD

Disk Test 327.24
Sequential 198.68
Uncached Write 246.35 151.26 MB/sec [4K blocks]
Uncached Write 273.55 154.78 MB/sec [256K blocks]
Uncached Read 101.35 29.66 MB/sec [4K blocks]
Uncached Read 391.87 196.95 MB/sec [256K blocks]
Random 927.23
Uncached Write 1332.98 141.11 MB/sec [4K blocks]
Uncached Write 451.89 144.67 MB/sec [256K blocks]
Uncached Read 2463.05 17.45 MB/sec [4K blocks]
Uncached Read 1058.45 196.40 MB/sec [256K blocks]

SSDは流石ですがHDDがひどい..


OSはクリーンインストールしたついでにsnow leopardからmountain lionにアップグレードしました。snow leopardからのアップグレードだったんで結構UIが変わりましたがとりあえず速攻でスクロールは逆にしました。まぁ慣れだと思いますがwindowsとかと違うのはちょっと.. あとlionからOS側でフルスクリーンがサポートされたようですがディアルディスプレイでフルスクリーン化させるとどちらかのディスプレイでアプリケーションが最大化してもう一つのウィンドウは灰色になって使えなくなってしまうというなんとも残念な感じ.. itermはいつも片方のディスプレイで全画面かして使っていたのにこれだと一つの画面しか使えなくて困っていましたがitermの設定で「Use lion-style fullscreen windo」のチェックを外せば従来通りの動作になりました。めでたしめでたし。

セキュリティキャンプ2012参加してきました

8/14-8/18までセキュリティキャンプに参加してきました.非常に内容の濃い5日間でとても楽しかったです,(そして眠い…)
僕はセキュアなOSクラスで,セキュアなOSクラスでは各参加者一人一人がOSとセキュリティに関連するテーマを選び,開発をおこないました.僕は隠しファイルシステムの設計ということで,BitVisorから使える隠しファイルシステムの設計と実装をおこないました.というか実はまだ完成してないので絶賛開発継続中です.とりあえずの完成の目処はついているので完成したら公開します.開発の感想等についても後日もうちょっと詳しくまとめるつもりです.


キャンプの流れ
7月末にサイボウズライブでOSクラスのグループを作り,テーマを決定.事前準備ということで予めテーマ作業を進めていきました.

1日目
電車に乗って会場へ.新習志野駅から会場に行くのに全然違う方向行ってしまって迷いました.会場についたらOS組の人がいて,サイボウズライブで知っていたのですぐに話すことができたのでよかったです.昼ご飯を食べたあと,開講式,その後は講演を聞きました(アノニマスの話や,大橋検事のお話がありました).また,グループワークがあり,これは各クラス(ネットワーク,Web,ソフトウェア,OS)から一人ずつの4人のグループでセキュリティに関するテーマを設定し,その問題に対する解決方法を最終日に発表するというものでした.

2日目
午前は坂井先生のgdbを使ったバイナリ解析の講義と,竹迫先生によるバッファーオーバーフローの講義.午後も引き続いて竹迫先生によってバッファーオーバーフローやlinuxカーネルモジュール作成についての講義があり,その後それぞれのテーマの開発となりました.

3日目
一日開発.ファイルシステムの仕様が決定しました.夜にはチューターの人のプレゼンがあったり,グループワークの作業の続きをしました.

4日目
午前がキャンプ中での開発最後の時間でした.結局途中までしかできなくて,グループ内の発表も分かりづらいものだったと思います.すいません.. がんばって完成させます.
午後はCTF.で戦います.問題には一応ジャンルがあり,僕はOSの問題ばっか解いてました.OSの問題はセキュリティの問題は少なく,アセンブラやCの知識を問う問題が多かったです.半分ちょい解きましたが,解けない問題が多く,まだまだだなぁと実感しました.時間は6時間で最初は長すぎじゃないかと思いましたが実際そんなことはなく全然足りなかったです.チーム的には最初の方は結構上位でしたが最後の方は1位のチームと結構離されてしまいました.まぁでも,チームの人と協力して問題解いたりしてとっても楽しかったです.この後明日のグループワーク発表のための準備…

5日目
午前は全体でクラス別の発表とグループワーク,CTF MVPの発表がありました.他のクラスもおもしろそうだな-と思いました.特に個人的にはネットワークとか.
午後に閉講式があり,15時ごろ終わりました.びっしりと詰まったスケジュールであっという間でした.


ということで上にも書きましたがセキュアなOSを作ろうクラスは開発合宿のような感じでした.キャンプが始まる2週間以上前の7月末に先にサイボウズライブ上でグループを作り,テーマを決め,事前準備と称して作業を進めていましたが,それでも実際にはキャンプ中全然時間が足らなかったというのが正直なとこです.もっと事前にやってれば…という感じですね.僕は隠しファイルシステムでしたが,僕は少し変わってる方で,他の人はrootkit関連のことやメモリ保護機能関連,セキュアOSに関連することなどやっていました.OSクラスは先生6人,チューター4人体制で,一人の先生に1〜2人ついて開発を進めていくという感じで,OS関連の開発がやりたい人にとって非常に恵まれた環境だったと思います.OSクラスは他のクラスと比べると倍率は低かったようですが,非常に素晴しい内容でした.ただし,実質的にクラスとしての講義は2日目のみで,後は実装だったので,C言語アセンブリの知識がちゃんとないとつまらないと感じてしまうのかもしれません.ちなみにマルウェア解析とかしたいのならソフトウェアセキュリティクラスです.


僕はいろんな人に会ってみたい,そう思ってこのキャンプに参加しました.実際にキャンプで同世代の人にたくさん会って,自分はまだまだ全然駄目だなぁと思うとともに刺激を受けました.講義の内容も非常に良かったですが,いろんな人と知り合いになれたことが一番良かったことなのかなと思います.今年は夏の予定がはっきりしなくて,キャンプは無理かなぁと思ってましたが直前に行けることが判命したので応募締切最終日に書類を書いて締切5分前に応募書類を送ったんですが,行けてよかったです.この機会を無駄にしないために今以上にいろいろとアウトプットしていきたいと思います.


関係者のみなさん本当にありがとうございました.

セキュキャン2012 セキュアなOSを作ろうクラスに参加します

今月はいろいろと所用が重なっていてここに書くのが遅くなりましたが,セキュキャン2012 セキュアなOSを作ろうクラスに参加することになりました.精一杯頑張ろうと思います.



応募用紙のプログラムについて少しだけ.とりあえず,プログラムの処理の流れはにらめっこして割とすぐ分かりました.最初はどこもおかしなところがないんじゃないか.と思ってしまいましたが,dictionary_match()を信用するとしてあのコードで怪しいところはmemcpy()しかないのでman見てしばらく考えてたら第三引数のsize_tで負数のことに気付きました.言われてみれば,あぁ,という感じですが実際のところ見落しがちなところだなと思いました.

LinuxにおけるTSS

めも.
(2/25 一部追記)
参考: http://wiki.osdev.org/Context_Switching

Linux はTSSを利用していない(Windowsも).その理由は
・速くない
ディスクリプタテーブルの上限は8192 (但しコンテキストスイッチ時に GDTR を切り替えればこの制限は突破できる)
x86 のみ (Potable じゃない)
浮動小数レジスタなどには関与しない


ハードウェアでやっちゃった方がレジスタの切り替えが速いような気がしなくもないけど,遅い理由としては,
linuxではセグメントを利用していないけれどTSSではセグメントレジスタの待避をおこなっている
・さらにセグメントレジスタをロードするときは,GDTへのアクセスや特権レベルのチェックなどがおこなわれる
といったことがあるよう.


ただし,TSSを利用することで特権レベルが変化したときにスタックが自動で切り替わるので,一つだけTSSを利用している(というよりそもそも特権レベルを0から3へ変更するためにTSSが必要).これによって,割り込みが発生して特権レベルが0になったとき自動でスタックが切り替わる.コンテキストスイッチ時にはTSSの特権レベル0のスタックの切り替えもちゃんとおこなっている.


なお,スタックを切り替えなかった場合,


1. ユーザーモードでスタックオーバーフローが発生
2. 一般保護例外のハンドラが呼ばれる
3. ハンドラが呼ばれる過程で現在のEIPの値などをスタックにpushするが,既にスタックが一杯なので再びオーバーフロー(ダブルフォールト)
4. 3.と同じことが発生し,トリプルフォールトが発生する


といったことが起る可能性がある.トリプルフォールトが発生した場合,プロセッサは強制終了する.