Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
カーネル空間からの セキュリティ セキュリティキャンプ2015 全国大会 @RKX1209
Slide 2
Slide 2 text
自己紹介 ● るくす(@RKX1209) ● 神戸大学 工学部 B3 ● seccamp'14 ソフトウェアセキュリティクラス卒業 ● seccamp'15 解析トラックチューター
Slide 3
Slide 3 text
話すこと ● Kernel Exploitによる権限昇格と対策 ● rootkitによる汚染と対策 ● Kernelセキュリティの動向 ring0で繰り広げられる仁義なき戦い
Slide 4
Slide 4 text
Kernel Exploitによる権限昇格と対策
Slide 5
Slide 5 text
Kernel exploit ● カーネル空間における不正なコード実行やメモリ破 壊などによるexploit ● 最高権限を持つカーネル空間への攻撃 => 成功した場合非常に危険 ● ただし制約が厳しい場合が多い => 高度なテクニックを要求される
Slide 6
Slide 6 text
Kernel exploit ● Local (kernel) exploit => ローカルにログインした状態での権限昇格 ex. BadIRET(CVE-2014-9322), Futex Bug(CVE-2014-3153) ● Remote (kernel) exploit => 外部からのpayload参入などによる権限昇格 ex. ROSE(CVE-2011-1493), SCTP(CVE-2009-0065)
Slide 7
Slide 7 text
BadIRET(CVE-2014-9322) ● カーネルのsystemcall処理中のダブルフォルト発 生がトリガー ● 不正なSSセグメントを設定した状態でiret ● iret前に余分なswapgsが実行されGSセグメントに 任意の値を設定できる脆弱性 => 現在殆ど資料が無いためもう少し詳しく...
Slide 8
Slide 8 text
BadIRET(CVE-2014-9322) ● ユーザー空間にてSS=(不正な値) GS=(任意の値) に設定する ● swapgsによって現在のGSにユーザー空間で設定 したGS(任意の値)が設定される ● この状態でgeneral_protectionに飛ぶ [1] bad_iret: pushq $0 SWAPGS jmp general_protection [2] do_general_protection (GS = arbitrary value) …..
Slide 9
Slide 9 text
BadIRET(CVE-2014-9322) ● general_protection内でcurrent→tsk→threadに0 を設定する処理がある ● currentは%gs:0xc780とアクセスされるためGSを 書き換えると任意のアドレスに0を設定する事がで きる ● どこを書き換えるか? => カーネル内で関数ポインタをもつデータ構造 ここではproc_root->inode_operationsにする
Slide 10
Slide 10 text
BadIRET(CVE-2014-9322) ● 何に書き換える? => カーネル内のROP gadgetのアドレス ● Stack pivotを行い シェルコードを実行 ● カーネルモードで動作 しているためシェルコード 内でroot昇格可能
Slide 11
Slide 11 text
kernel exploit対策 ● Intel SMEP => カーネルモード時はユーザー空間のコードを実行出 来ないようにする 第3世代(Ivy Bridge)以降のCPUが搭載 ● Intel SMAP => カーネルモード時はユーザー空間のデータにアクセス 出来ないようにする BadIRETはSMEPをバイパス可能 しかしユーザー空間のデータFAKE_IOPSなどを利用するため SMAPはバイパスできない
Slide 12
Slide 12 text
rootkitによる汚染と対策
Slide 13
Slide 13 text
rootkit ● システムに侵入後、使用されるソフトウェアツールの セット ● 痕跡消去,backdoor作成など ● カーネルレベルの物とユーザーレベルの物がある => 今回は前者について
Slide 14
Slide 14 text
LKM rootkit ● LKM(Loadable Kernel Module)を利用したrootkit ● システムコールの書き換えにより自身の隠蔽などを 行う ● Knark, Adore, Rkitなど多くの種類が存在 ● カーネルレベルから偽装されるため解析が非常に 困難
Slide 15
Slide 15 text
Anti rootkit ● Kernel Module Signing => 署名されたモジュールしかロードさせない ● NICKLE => memory shadow-ingを用いてメモリ検証 VMMとして実装されている ● RG(Rootkit Guard) => Teh Jia Yew(2013)のペーパーより
Slide 16
Slide 16 text
RG(Rootkit Guard) ● Rootkitの検知を行うRIDS, 防止を行うRIPSにより 構成 ● Linux IMAによりあらかじめ正しいファイルやモジュー ルのデータベースを作成(SHA1) ● ユーザーの定義したクリティカルなファイルは暗号化 されたパーティションに格納(TPMを利用) ● ファイル保護にはSELinuxを用いる ● ブート時の汚染を防ぐためtrusted GRUBを利用する
Slide 17
Slide 17 text
RG(Rootkit Guard)
Slide 18
Slide 18 text
Kernelセキュリティの動向
Slide 19
Slide 19 text
Kernel security ● PaXなどのセキュリティパッチ ● “Return-less” kernel ● LLVM Linux ● Trinity(fuzzing) ● Symbolic実行
Slide 20
Slide 20 text
PaX ● grsecurityによる、最小特権保護を実装したLinux カーネル向けセキュリティパッチ ● カーネルスタックアドレスのrandomize ● SMAPを模したUDEREF ● スタックの再利用防止STACKLEAK => 多くのセキュリティ機構をカーネルに加える
Slide 21
Slide 21 text
Return-less kernel ● カーネルからret命令を排除する ● EuroSys10にて公開 ● Kernel exploitやrootkitにおけるカーネル内のROP gadget利用を防止する ● LLVMを用いて実装されている
Slide 22
Slide 22 text
LLVM Linux ● Linux kernelをclang(LLVM)でコンパイルするプロ ジェクト ● Linux kernelのコードにはgcc拡張が多いためメイ ンラインへの統合は難しい ● LLVM static analyzerを用いたkernelコードの検証 にも応用可能 => “Applying Clang Static Analyzer to Linux Kernel” LinuxCon(2012)
Slide 23
Slide 23 text
Trinity(kernel fuzzing) ● カーネルのfuzzing用ツール ● hardeningというよりはdetection ● 様々なパラメータによるシステムコールの呼び出し を行う ● 開発者が疲弊してるらしく存続するかは不明....
Slide 24
Slide 24 text
Symbolic実行 ● ソフトウェアテスト手法の一つ ● どの入力値でどの実行経路を通るか特定する ● 計算量爆発が起こるため多くの場合は動的symbolic実行 を行う ● LLVM bitcodeを用いたKLEEなどがある => カーネルドライバなどの開発においてこれらを用いるの は現実的か? => 現在の開発体制ではテスト方式は決まっていない => 開発サイクルとのトレードオフ
Slide 25
Slide 25 text
おわりに ● カーネルに関わるセキュリティ技術に関して3つの 観点から紹介しました ● ユーザー空間とは比較にならないほどの危険が潜 む ● 高度なテクニックやシステムに関する深い知識が要 求される ユーザー空間では物足りないと思ったら カーネル空間にダイブしてみましょう
Slide 26
Slide 26 text
reference ● Rootkit Guard (RG) - An Architecture for Rootkit Resistant File-System Implementation Based on TPM [http://psasir.upm.edu.my/30621/] ● Return-Oriented Rootkits: Bypassing Kernel Code Integrity Protection Mechanisms [https://www.usenix.org/legacy/event/sec09/tech/full_papers/hund.pdf] ● ももいろテクノロジー [http://inaz2.hatenablog.com/] ● 『A Guide to Kernel Exploitation: Attacking the Core』(Massimiliano Oldani pub. Syngress 2010) ● 一生あとで読んでろ [http://ntddk.github.io/] ● Writing kernel exploits [http://kmcallister.github.io/talks/security/2012-kernel-exploits/talk.pdf] ● Anatomy of a Remote Kernel Exploit [http://vulnfactory.org/research/h2hc-remote.pdf] ● Applying Clang Static Analyzer to Linux Kernel(LinuxCon 2012) [https://events.linuxfoundation.org/images/stories/pdf/lcjp2012_matsumotoh.pdf] ● Defeating Return-Oriented Rootkits with "Return-less"Kernels [http://eurosys2010.sigops-france.fr/slides/eurosys2010_session6_talk15.pdf]