アクセス制御について学んでいます。そして、LSM api で独自のフック関数を実装してみてください。しかし、カーネル バージョン 3.1.4 のカーネル ソースでコーディングする必要があることがわかりました。では、どうすれば始められますか?
誰かがそれについて例を挙げてもらえますか? どうもありがとう。
PS: いくつかの例を見つけましたが、カーネル バージョンは 2.6.20 です。LSM は変更されているため、これらの例は機能しません。
アクセス制御について学んでいます。そして、LSM api で独自のフック関数を実装してみてください。しかし、カーネル バージョン 3.1.4 のカーネル ソースでコーディングする必要があることがわかりました。では、どうすれば始められますか?
誰かがそれについて例を挙げてもらえますか? どうもありがとう。
PS: いくつかの例を見つけましたが、カーネル バージョンは 2.6.20 です。LSM は変更されているため、これらの例は機能しません。
2.6.35以降、LSMモジュールをロードできません(c1e992b99603a84d7debb188542b64f2d9232c07コミットを参照)。したがって、LSMをカーネルの外に出すことは有効なタスクではありません。ただし、実行時にいつでもカーネルを分解して、security_opsポインターなどのすべてのプライベートシンボルを見つけることができます。
たとえば、エクスポートされたsecurity_sb_copy_data
シンボルを見てください。
int security_sb_copy_data(char *orig, char *copy)
{
return security_ops->sb_copy_data(orig, copy);
}
EXPORT_SYMBOL(security_sb_copy_data);
ダンプは次のように見える場合があります(x86_64):
(gdb) x/7i security_sb_copy_data
0xffffffff811f61b0: push %rbp
0xffffffff811f61b1: mov %rsp,%rbp
0xffffffff811f61b4: data32 data32 data32 xchg %ax,%ax
0xffffffff811f61b9: mov 0x881690(%rip),%rax # 0xffffffff81a77850
0xffffffff811f61c0: callq *0x98(%rax)
0xffffffff811f61c6: pop %rbp
0xffffffff811f61c7: retq
したがって、0xffffffff81a77850
アドレスは正確なsecurity_ops
ポインタです。それをチェックしてみましょう:
(gdb) x/s* 0xffffffff81a77850
0xffffffff81850fa0: "default"
OK、これで有効なsecurity_ops
ポインタができ、カーネルの外部のLSMで何でもできるようになりました。
P.S.
素晴らしいLinuxカーネルセキュリティプロジェクトがあります-AKARI。分解せずにプライベートシンボル解決の興味深い方法を実装します(詳細についてはソースを参照してください)。