2016-10-17 2 views
2

シンプルなsys_call_table書き換えを使用して、 システム内のすべてのexecve呼び出しをログに記録します。sys_call_tableは4.8カーネルで読み取り保護されていますか?

4.8カーネルでUbuntu 16.10に移動すると、この 機構が突然動作を停止しました。 16.04では で4.6カーネルが動作していました。

1: write_cr0 (read_cr0() & (~ 0x10000)); 

    2: original_execve = (void *)syscall_table[__NR_execve]; 
    3: syscall_table[__NR_execve] = (unsigned long)&new_execve; 

    4: write_cr0 (read_cr0() | 0x10000); 

ページフォールトがすでに古いエントリを読んだときに起こる、それは私が使用しsys_call_tableアドレスをretriveするライン2 です:

sudo cat /boot/System.map-`uname -r` | grep -e '\ssys_call_table' | awk '{ print $1}')" 

コードからです:https://github.com/eiselekd/shinterposer/tree/master/mod

誰もい何が起こったのか知っている?たぶん一部の 保護機構が導入されましたか?

+0

今まで解決策が見つかりました:4.8カーネルを再コンパイルし、シンボルsys_call_tableをエクスポートしました。 はconst指定子を削除しました。そうすれば、sys_call_tableをモジュールから直接参照することができます。それでも、なぜそれが4.6のために働いたバージョンで墜落したのかまだ分からない。読み取り専用セクションのリンクは変更されていますか? –

+0

[this](https://outflux.net/slides/2016/lss/kspp.pdf)プレゼンテーションで、Linuxが実装したすべての緩和策(いずれにしても、4.2まで)の良いサマリーを見つけることができます。 –

+0

ありがとうございます。質問:kaslrが存在する場合、実際にsyscallテーブルのアドレスを取得する方法はありますか?とにかくそれは悪用と見なされるだろうと思う... –

答えて

2

4.8カーネルでは、デフォルトで 行わシステムコールテーブルの上にアドレス空間レイアウトのランダム化(kASLR)があるように思われます。 sys_call_tableシンボルをエクスポートして宣言し、それをモジュールから直接リンクする場合、sys_call_tableのアドレスはブートごとに変更されます。 /boot/System.map-xxxからのアドレスは無駄です。

は、カーネルコマンドラインに

nokaslr 

を追加することができますUbuntuの16.10カーネル4.8一つにkaslrを無効にします。

関連する問題