~主にプログラミング関係この広告は、90日以上更新していないブログに表示しています。attackはじめに企業や個人に対するサイバー攻撃の頻度は年々増加の一途を辿っているが、これらはskiddyによる悪戯程度の物から、企業を標的とした高度な標的型攻撃、あるいは政府による諜報活動に至るまで多岐にわたっている。大規模な組織や政府による綿密に練られたサイバー攻撃は、確実に目的を果たすために高度な手段が講じられる事が多い。本記事では高度標的型攻撃や政府による諜報活動で用いられる手法の一つとして、"システムソフトウェアに対する攻撃"について紹介する。仮想マシン、ファームウェアといった基盤システムを標的とする物で、ひとたび成功すれば検出は非常に難しく高度な潜伏、スパイ活動が可能となる。一般的な脅威と見なせるかについては意見が別れるだろうが、その気になれば誰もがターゲットにされうるという潜在的なリスクである事は間違い無く、決して軽視されるべきでは無い。アメリカを始めとする諸外国では、古くからサイバースペース上での高度な諜報活動が展開されてきた。TAOチームによって既に2008年の段階からBIOSに感染するバックドアが開発されていた事が示されている。2017年に流出したCIAのVault7にも、スマートフォンに対する複数のexploitが収集、開発されている事が記述されており、OS(カーネル)を標的とした物も報告されている。Granted"の欄を見てみよう。Groupなど高度な技術を所有し諜報活動に活用している例は多くある。これについては私は分からない。内閣情報調査室(CIRO)や内閣サイバーセキュリティセンター(NISC)がどこまでのサイバーオペレーションを実施しているのかについて知るすべが無いからだ。特定秘密保護法の施行によって、これらのインテリジェンス機関が国内外問わずより連携が取りやすくなったため、今後はオペレーションの質も益々上がるだろう。メッセージが乗っており、秘密保護法についても少し言及しているので興味がある人は見てみると良いかもしれない。出来る事は、まず敵の手の内を知ることだ。高度なハッキングチームと言えど、基本的には公の場で議論されている研究成果を利用している物がほとんどであり、ある程度の素養があれば充分理解できる範疇である。そこでこの記事では、システムソフトウェアに対する攻撃に関する研究成果を歴史と共に紹介していき、概説していく。(特に高度な物、ブレイクスルーとなった物は詳説)セキュリティのアナリストや研究者、あるいは基幹システムのオペレーター、メーカーの方々の参考になれば幸いである。Reportとして知られるこの資料では、あらかじめ確保したメモリ領域を超えるサイズの入力を許してしまうようなロジックバグが存在する場合、意図しない領域を上書きしてしまいシステムがクラッシュする可能性について論じている。Wormがバッファオーバーフローバグを侵入のための手段として用いる事で実用的な攻撃として認知され始めた。[5]にてshellcodeをスタック上に配置し、オーバーフローによって制御を移す事で任意のコードを実行する方法についてまとめた。Profit"と題したこの記事はスタックバッファオーバーフロー攻撃の原典として今でも多く参照されている。Aleph1による記事から1年、翌年の1998年にはスタックバッファオーバーフロー対策としてランダムな値をスタックに配置し、値の変化を検出する事でオーバーフローを特定するStackGuard[6]が発表され、gccにマージされたこの機能は、今日でも-f-stack-protectorとして活躍している。[7]、一ヶ月後にはスタックではないヒープ領域を対象とする、ヒープオーバーフローによるエクスプロイトが開発される程[8]エクスプロイトの開発は画期的であった。それから3年後の2001年にはPaXがリリースされ、エクスプロイトに対する本格的なMitigation(緩和策)が実装され始めた。Studioコンパイラにスタッククッキー機能を導入するなど徐々に対策が講じられて行った。System)の中でも特にカーネルと呼ばれる中枢ソフトウェアは、システムの中で最も高い権限で動作しておりひとたび攻撃者の介入を許せばシステム全体が乗っ取られる可能性がある。攻撃者によるカーネルへの介入には主に2つの方法が取られる。一つはカーネルモジュール等の正規の手段を悪用する事で、カーネルの動作を攻撃者の意のままに改変する物である。悪意のあるカーネルモジュールを開発しインストールするのが一般的な方法で、これについては古くから研究されている。現在でもよく用いられるprocfsに対するgetdentsシステムコールの改竄によるプロセス隠蔽は1998年に既に紹介されている。[9]あるいはカーネルモジュールを使用せずとも/dev/kmemやSIDT命令を用いる事でユーザーの権限でリアルタイムにカーネルのメモリを書き換える手法もあった。Manipulation)と名付けられた。[17]さてカーネルへの介入の2つめの方法は、カーネル自体の脆弱性を利用する事で非正規の手段で動作を改変する、カーネルエクスプロイトと呼ばれる物だ。LinuxやBSD、Windowsといったカーネルにもバグや脆弱性は存在するためエクスプロイトする事は可能である。これについては2002年にOpenBSDのselect(2)の脆弱性を利用し、カーネルスタックオーバーフローによる任意コード実行を行ったnoirの記事が非常に秀逸である。これはselect(2)に与えるバッファのサイズ検証にバグがあり、ユーザーから巨大なバッファを与える事で、カーネル内のバッファにコピーする際オーバーフローが発生するという物。この記事が特に優れているのは、カーネルへの副作用をなるべく与えないようにする事で不用意なカーネルクラッシュを避け、確実でreliableなエクスプロイトを実現している点である。カーネルエクスプロイトを書いた事がある人間であれば分かると思うがこれは非常に難しい事で、例えばこのような理想的なペイロード実行は簡単には成功しない。カーネルコード実行中に無理にiretでユーザー側に制御を戻せば、本来行うべき後続処理が完了しない上に、多くのロックやシグナルの処理を放置する事になり瞬く間に整合性が崩壊、システムがクラッシュしてしまうからである。そこでnoir氏はペイロード実行後、本来returnするべき正規のアドレスをメモリから検索し制御を戻す事でカーネルの正規の処理を継続させている。これにより副作用を最小限に抑えた。2002年の黎明期に行われたとは思えないほど信頼性の高いエクスプロイトだ。このようにローカルのユーザーが権限昇格を行うためにカーネルの脆弱性を突くエクスプロイトを特にローカルカーネルエクスプロイトと呼ぶ。このタイプの手法は近年ではゲーム機やスマートフォンのJailBreakに使用される事も多い。カーネルのネットワークスタック等の脆弱性を利用する事で、リモートから攻撃を行うリモートカーネルエクスプロイトについてもさかんに研究されていた。kernel)のWiFiスタックに対するエクスプロイト[12]を始め様々な攻撃の実証が行われた。privilege)"を提示している。Shapiroによるナノカーネル[3]が挙げられるがいずれも実装の難しさやIPCコミュニケーションによるパフォーマンスオーバーヘッドにより普及は難しく、代わりにLinuxやBSDといた古典的なモノリシックカーネルが普及していった。そのためカーネルの肥大化に伴うセキュリティリスクの懸念は拭いきれなかった。protectionについては最近まで殆ど議論されて来なかった。そもそもカーネルに対する攻撃自体が珍しく、暫定的な脆弱性の修正である程度は対応しきれていたのもあるだろう。Project(KSPP)[87]が立ち上げられたのも2015年と比較的最近の事だ。Cook氏による成果である。一方でカーネルの機能を悪用するrootkitの検出手法については古くから議論されてきた。Michael[14]といったLKMを利用したカーネルデータ改竄検知システムが多く開発されていた。Access)によるコプロセッサ[13]からの監視を行うなど目覚ましい進化を見せている。Enforcementや、Vistaからはカーネルのデータ改竄を防止するPatchGuardが追加されている。-対策が講じられれば当然それを超えるための攻撃手段が開発され始める。Pill[23]を提案した。これはVM上でSIDT命令を実行した際にゲストではなくホストのIDTアドレスを取得してしまうハイパーバイザの問題[12]を利用したものだ。ゲストOSではなく常にホストOSに依存したIDTのアドレスが取得される事がVM内で動作していることの証拠となる。0x13(ディスクに対する読み込み)をフックする事で、ローダーがカーネルを読み込む際カーネル本体の一部を書き換える事に成功した。この動的なカーネルパッチによりバックドアのインストールに成功している。Trustが完全に崩壊してしまった。Pill[28]と呼ばれるハイパーバイザベースrootkitを提案し、世間を騒がせた。PillはSubVirtのようにブートプロセスを侵害するわけではなく、既に動作しているシステムの上で、OSをハイパーバイザの制御下に置いてしまうという革新的な方法で、ターゲットに気づかれないままVMBRをインストールしてしまう物だ。Trustに介入する方法と違い、この手法は単にOS上でハイパーバイザを起動し自身をゲストとして制御下に置くように調整しているだけにすぎず、検出は非常に難しい。ステルスマルウェア[32]のレジェンドとも言うべき存在だろう。rootkit[42]と続く。-画期的なマルウェアが開発される一方で、カーネルやハイパーバイザの持つ脆弱性を利用したエクスプロイトも次々に進化していた。これを受けてLinuxはバージョン2.6.23からvm.mmap_min_addrというパラメーターでユーザーからmmap可能なアドレス領域を制限した。Miller氏が発売後数週間で任意コード実行に成功した事を報告した。同年のBlackHatで氏が発表した技術レポートによれば[36]、WebKitの正規表現エンジンの脆弱性を利用する事でユーザー空間での任意コード実行を可能にしたと言う。同年10月にはJailBreakMe1.0がリリースされiOSの"untethered"なJailbreakも可能となった。余談だが、iOSのJailBreakとは、Androidと違い必ずしもroot権限への昇格に成功した事を意味するわけではなく、Appleによる何らかの制限をバイパスできた事を示す(多くは、非正規アプリのダウンロード制限機能の突破である)"tethered"なJailBreakはデバイスを再起動すれば元に戻ってしまうハックであり、一方"untethered"は恒久的な物を指す。iOSのカーネルエクスプロイトは後者の"unthethered"なJailBreakに用いられる事が多い。カーネルエクスプロイトを用いていた初期のJailBreakツールとしてはJailBreakMe2.0やGeohotによるlimera1nが挙げられるだろう。スマートフォンの発売に伴いカーネルエクスプロイトが浸透し始める一方で、アカデミアの世界では仮想マシンモニター、つまりハイパーバイザへの攻撃が研究され始めている。labに参加しシステムセキュリティの研究はさらに加速する。Rafal両氏によってXenをターゲットとしたエクスプロイト、rootkitに関して3つの発表があった。Rafalは、攻撃者がXenのdom0にてroot権限を持っている状況でのpost-exploitationとしての2種類のハイパーバイザrootkitを提案した。[43]まず1つはHDDやNICによるDMAに介入(フック)するモジュールを開発する事でXenのコードを書き換える手法だ。CPUを介したメモリアクセスでは当然Xenの領域(hypercall_table)にはアクセスできないためホストのハードウェアの持つDMA機能を悪用する。dma_map_sg等のカーネル関数をフックし、Xenのdo_ni_hypercallやdo_set_debugregをバックドアコードに変更する事で実現している。これはIOMMUが有効な場合は使えない。frameworkを用いて同様のハイパーコール改竄を行う方法も提案されているが、正規のハイパーコールとのパフォーマンス比較によるチェックで検出される可能性がある。backdoorという物も提案されている。これはdom0やXenの領域への改竄が一切発生しないため検出はできない。Module(XSM)[33]などの極端なポリシー制御を行えばこれらは防ぐ事ができるだろう。2つめのJoanaの発表[44]ではさらにこれらIOMMUやXSMさえもバイパスする方法についても提案された。前者はDRAMコントローラのリマッピング機能(ある物理アドレス領域を他の物理アドレスにリマップする機能)を悪用する事でIOMMUによるアドレス制限を回避するものだ。(本来この機能はBIOSによって制限がかけられているべきだが、Q35チップでは行われていなかった)。他にもNSAによるXSMの実装であるFLASKが持つ脆弱性を利用した攻撃も提案した。Surfaceを無くすことは困難を極めるとし、開発中のIntegrityチェックシステムHyperGuardも提案している。これはSMMモードで動作しながら、改竄検知のためのハッシュの計算等は外部のチップセットで行う事により信頼性を担保する物だ。3つめの同じくJoannaの発表[45]ではさらに、XenをBluePill上で動作させる方法について提案した。話が少しややこしくなってきたが、BluePillはハイパーバイザ技術を利用してターゲットのシステムを監視するrootkitだ。Xenやその上で動作するVM全てを含んだシステムをBluePillハイパーバイザによって監視するというのがこの発表の主旨である。