Auther:idkqh7
自己紹介
}  脆弱性攻撃の基本
}  ○○大学の本当にあった怖い話
} 
名前:idkqh7
経歴:ニートしてたら大学へ
専門:バイオインフォマティクス
趣味:プログラミングと解析
}  講義で共用のパソコンを使っていた
}  保守契約の関係で放置され続ける脆弱

性があった
}  $apt-get install ○○が使いたかった。
}  教授に許可だけはもらえた
※パソコンの入れ替えに伴い、バグはFixさ
れています
 

セキュリティホールを利用して
本来ならばありえない動作
をさせるコードのこと。

  これらはセキュリティホールの検証コードとしてアプ
リやソースコードの形で一般に配布されている。
ただのバグだから
「よく分からないけどアプリが強制終了する!」
ときには同じ原因によるときも……	

「サーバーのルートとられた!!!」
セキュリティホールを利用した攻撃
}  バッファオーバーフロー攻撃(バッファのバグ)
}  フォーマット文字列攻撃(書式のバグ)
}  ダングリングポインタ攻撃(ポインタのバグ)

モニタリングによる攻撃
¨  スニッフィング(パケットキャプチャリング)
¨  キーロガー(キーロギング)
CVE-2009-2692
  The Linux kernel 2.6.0 through 2.6.30.4, and
2.4.4 through 2.4.37.4, does not initialize all
function pointers for socket operations in
proto_ops structures, which allows local users to
trigger a NULL pointer dereference and gain
privileges by using mmap to map page zero,
placing arbitrary code on this page, and then
invoking an unavailable operation, as
demonstrated by the sendpage operation
(sock_sendpage function) on a PF_PPPOX socket.	
} 
proto_ops構造体(プロセス同士で通信を行うための
構造体)に関数ポインタが存在するんだけど、ある方
法でアクセスするとポインタを初期化せずに(NULLポ
インタ)使える(デリファレンス)らしいよ。
 そこから mmap()関数でメモリの領域を取って(プロ
グラムの書き込める領域をメモリ上に確保)その中に
やばいコードを書くとrootとられちゃうよ。
NULLポインタの確認もしないクソ野郎は
sock_sendpage関数です。本当にありがとうござい
ました。
struct	
  roto_
p
ops	
  	
 
{
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 f iy;
am l 	
 
	
 	
 	
 	
 	
 	
 	
 	
 struct	
  odul
m
e	
 	
 	
 *ow ner;
	
 
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ( ease)
*rel
	
 	
 	
 (
struct	
  ocket	
  sock)	
 
s
*
;
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ( nd)
*bi 	
 	
 	
 	
 	
 	
 (struct	
  ocket	
  sock,
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 struct	
  ockaddr	
  m yaddr,
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 int	
  ockaddr_en)	
 
s
l ;
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 (
*connect)
	
 	
 	
 (
struct	
  ocket	
  sock,
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 struct	
  ockaddr	
  vaddr,
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 int	
  ockaddr_en,int	
  l ;
s
l 	
  fags)	
 
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 (
*socketpai (struct	
  ocket	
  sock1,
r)
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 struct	
  ocket	
  sock2)	
 
s
*
;
	
 	
 	
 	
 	
 	
 	
 	
 int	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 (
*accept)
	
 	
 	
 	
 (struct	
  ocket	
  sock,
s
*
	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 struct	
  ocket	
  new sock,int	
  l ;
s
*
	
  fags)	
 
	
 	
 	
 	
 	
 ..
.	
 
}	
 
;
}  rootを取るってどういうこと?

}  NULLポインタデリファレンスでどうなるの?
#include <unistd.h>
#include <stdlib.h>

	

int main(void)
{
setuid(0);
system("/bin/sh");

//ファイル所有者の権限でコマンドを実行
//シェルの呼び出し

return 0;
}
System()はシステム・
コールであるexecve()
のWrapper関数
ファイル所有者の権限でプログラムを実行する機能。

使い方
>chmod 4711 hogehoge

user s-bit(4000) が立っているコマンドはそのファ
イル所有者の権限で実行 (setuid) される。
→所有者をrootにすればrootの権限で実行できる!
普通SetUIDは一般ユーザーに一時的に特権を与
えるために使う物。
} 
} 
} 

Linux のプロセスは、task 構造体で表現されている
task 構造体にはプロセスが使用するさまざまな情報がある
cred構造体はuid、gid、groups 等の資格情報を表す
struct	
 cred	
 {
	
 
	
 	
 	
 	
 atom i
c_t	
 	
 	
 	
 	
 	
 	
 	
 usage;
	
 
	
 	
 	
 	
 ui
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ui 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 realU I 	
 of	
 the	
 task	
 */	
 
d;
	
  D
	
 	
 	
 	
 gi
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 gi 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 realG I 	
 of	
 the	
 task	
 */	
 
d;
	
  D
	
 	
 	
 	
 ui
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 sui 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 saved	
 U I 	
 of	
 the	
 task	
 */	
 
d;
D
	
 	
 	
 	
 gi
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 sgi 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 saved	
 G I 	
 of	
 the	
 task	
 */	
 
d;
D
	
 	
 	
 	
 ui
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 eui 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 effecti U I 	
 of	
 the	
 task	
 */	
 
d;
ve	
  D
	
 	
 	
 	
 gi
d_t	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 egi 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 /*	
 effecti G I 	
 of	
 the	
 task	
 */	
 
d;
ve	
  D
..
.	
 
	
 	
 	
 	
 struct	
 user_struct	
 *user;
	
 	
 	
 	
 	
 	
 	
 /*	
 realuser	
 I 	
 subscri on	
 */	
 
	
 
D
pti
	
 	
 	
 	
 struct	
 group_i *group_i 	
 	
 /*	
 suppl entary	
 groups	
 for	
 eui
nfo	
 
nfo;
em
d/fsgi */	
 
d	
 
..
.	
 
}	
 
;
#include <unistd.h>
#include <stdlib.h>

	

int main(void)
{
setuid(0);
system("/bin/sh");

//ファイル所有者の権限でコマンドを実行
//シェルの呼び出し

return 0;
}
System()はシステム・
コールであるexecve()
のWrapper関数
前提:所有者がrootのとき、 SetUID(0)を実行

euid(effective uid) = 0(root)
つまり、 SetUID(0)のやっていることは、自プロセス
cred構造体のeuid部分を書き換えているだけ。
Credを操れるならば権限は無法地帯
return sock->ops->sendpage(sock, page, offset, size, flags);
	
 #include <unistd.h>
	
 #include <stdlib.h>
	
 int main(void)
{
	
setuid(0);
//ファイル所有者の権限でコマンドを実行
system("/bin/sh"); //シェルの呼び出し
	
return 0;
	
}
	
NULLポインタデリファレンスをうまく使うと、上記コードが実行できる!!!
sock_sendpage()関数は	
	
return sock->ops->sendpage(sock, page,
	
	
offset, size, flags);
	
といきなり書いていた。	
	
if (unlikely(!sock->ops->sendpage))
 return -EINVAL;
このようにすれば関数ポインタの初期化はチェックされてい
たはず。
NULLポインタ=どのアドレスも指していないポインタ
簡単に言うと、初期化していないポインタ。
((void *)0) …NULLポインタ定数(定義)
これをデリファレンスすると……
*((void*)0) ⇔ *0
アドレスの0番値を指定することになる

	

【デリファレンスとは】
}  ポインタが指し示す内容を得ること
}  間接参照・参照外しとも訳される
}  C言語でいうところのコイツ→*

NULLポインタを用いると0番地のアドレス内容
にアクセス可能となる
(アクセス違反などで強制終了する原因にも)
	

バグの原因!
1. 
2. 

mmap関数 を使って、 0 番地に権限昇格コード
を仕込んでおく。
まちがって NULL ポインタを関数ポインタとして
デリファレンス すると、その権限昇格コードが実行
される。	

管理者権限でメシウマ状態!
 mmap関数を用いて新規アドレス空間を作成
↓
0 番地に権限昇格コードを仕込んでおく。

↓
ヌルポインターでガッ!
↓
特権プログラムからシェルを起動	

実装するのは言うほど
簡単じゃない!
ソースコードが読解できなくても普通です。
Exploitのソースコードはかなり特殊(低レイヤー操作)
な部類に入るので、初見ではまず理解できない。	

} 

AndroidOSのrootハックでも同じ脆弱性が使われた
※繰り返しになりますが、パソコンの入れ替えに
伴いバグはFixされています
	

取り敢えず
>sudo apt-get install sl
} 

	

            ====                ________                                ___________  
    _D  _|    |_______/                __I_I_____===__|_________|  
      |(_)---    |      H________/  |      |                =|___  ___|            _________________    
      /          |    |      H    |    |          |      |                  ||_|  |_||          _|                                _____A  
    |            |    |      H    |__--------------------|  [___]  |      =|                                                |  
    |  ________|___H__/__|_____/[][]~_______|              |      -|                                                |  
    |/  |      |-----------I_____I  [][]  []    D      |=======|____|________________________|_  
__/  =|  o  |=-~~    /~~    /~~    /~~  ____Y___________|__|__________________________|_  
  |/-=|___||        ||        ||        ||        |_____/~___/                    |_D__D__D_|    |_D__D__D_|  
    _/            __/    __/    __/    __/            _/                              _/      _/        _/      _/  
	
 

A. ぬるぽ→ガッ!

○○大学の本当にあった怖い話