法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: システムコール呼び出し記録

FreeBSD 11.1R では、ユーザ空間でシステムコール xxx() が呼び出されると、回り回ってカーネル空間では kern_xxx() という関数が呼び出されます。

kern_xxx() では、先頭付近で AUDIT_ARG_yyy() というマクロ関数が呼び出されています。これはセキュリティ機能の一環として、システムコールの引数を記録するためのマクロ関数です。多くの場合、yyy の部分は引数の型(意味、役割)ごとに用意されているようです。しかし中には、AUDIT_ARG_SOCKET() のようにシステムコール socket() の引数をそのまままとめて記録するためのマクロ関数もあるようです。

AUDIT_ARG_yyy() は sys/security/audit/audit.h でマクロ定義されています。AUDIT_ARG_yyy() では、現在の thread が audit を必要としている場合にのみ、対応する実関数 audit_arg_yyy() が呼び出されます。audit_arg_yyy() は sys/security/audit/audit_arg.c で定義されていて、実際の記録作業を行なっています。その際の記録形式は内部形式で、記録を取り出すためには kaudit_to_bsm() などの関数を呼び出す必要があります。kaudit_to_bsm() は sys/security/audit/audit_bsm.c で定義されています。

なお、sys/security/audit の役割については「The Design and Implementation of the FreeBSD Operating System, Second Edition」の第5章第11節「Security Event Auditing」(p.200〜205)で解説されています。この書籍については https://www.mckusick.com/books.html に情報が掲載されています。