http://permalink.gmane.org/gmane.linux.tomoyo.user.japanese/257
RHEL6でも動くと謳っていたので、軽く解析してみました。
モジュールロード時にsecurity_opsを使っている関数のアドレスを/proc/kallsyms
から取得し、その関数に対しバイナリ解析を行うことでsecurity_opsのアドレスを
算出し、上書きしているようです。
興味がある人は、ccs_find_security_ops() 近辺を読んでみるといいと思います。
バイナリ手法が面白いというか奇抜というか、いい感じなのですが、
Linuxカーネル本体に
int security_file_alloc(struct file *file)
{
return security_ops->file_alloc_security(file);
}
という関数があるので、
static int lsm_addr_calculator(struct file *file)
{
return ccs_security_ops->file_alloc_security(file);
}
というほぼ同じ関数を作ったら security_ops のアドレス以外は一致する
命令が出力される「はず」だから、関数の命令列を比較していって、不一致箇所を
security_opsだと仮定するという。そんなん。
# security_file_alloc()は公開関数なので/proc/kallsymsでアドレス取得できるしね
たぶん、コンパイラのバージョン合わせないとだめよね。これ。
コメント