open&openat系统调用
openat日志
open
type=SYSCALL msg=audit(1710904082.640:49873): arch=c000003e syscall=2 success=yes exit=3 a0=5555567f3e40 a1=280800 a2=0 a3=0 items=1 ppid=249952 pid=249990 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts3 ses=122 comm="gitstatusd-linu" exe="/home/zzl/.cache/gitstatus/gitstatusd-linux-x86_64" subj=unconfined key="=dir_audit"' type=CWD msg=audit(1710904082.640:49873): cwd="/"' type=PATH msg=audit(1710904082.640:49873): item=0 name="/home/zzl/Desktop/dir_au_test" inode=5127935 dev=08:03 mode=040775 ouid=1000 ogid=1000 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0' type=PROCTITLE msg=audit(1710904082.640:49873): proctitle=2F686F6D652F7A7A6C2F2E63616368652F6769747374617475732F676974737461747573642D6C696E75782D7838365F3634002D470076312E352E34002D73002D31002D75002D31002D64002D31002D63002D31002D6D002D31002D7600464154414C002D74003136'
openat
a0参数为ffffff9c (AT_FDCWD)(AT_FDCWD 是 openat 和一些其他系统调用中使用的特殊文件描述符,它代表当前进程的工作目录。)
type=SYSCALL msg=audit(1715262263.624:108403): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7f82ca9caf40 a2=80000 a3=0 items=1 ppid=32914 pid=32918 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts2 ses=3 comm="auditctl" exe="/usr/sbin/auditctl" subj=unconfined key="my_syscall_watch"ARCH=x86_64 SYSCALL=openat AUID="randy" UID="randy" GID="randy" EUID="root" SUID="root" FSUID="root" EGID="randy" SGID="randy" FSGID="randy"
type=CWD msg=audit(1715262263.624:108403): cwd="/home/randy/work_for_corrosion"
type=PATH msg=audit(1715262263.624:108403): item=0 name="/lib/x86_64-linux-gnu/libaudit.so.1" inode=1580493 dev=08:03 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="root" OGID="root"
type=PROCTITLE msg=audit(1715262263.624:108403): proctitle="bash"
a0 参数中带有fd ,fd必须指向目录。
type=SYSCALL msg=audit(1715262282.739:177416): arch=c000003e syscall=257 success=yes exit=6 a0=5 a1=55a5ec283b50 a2=b0900 a3=0 items=1 ppid=33156 pid=33171 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=1975 comm="find" exe="/usr/bin/find" subj=unconfined key="my_syscall_watch"ARCH=x86_64 SYSCALL=openat AUID="randy" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
type=CWD msg=audit(1715262282.739:177416): cwd="/"
type=PATH msg=audit(1715262282.739:177416): item=0 name="partial" inode=273412 dev=08:03 mode=040700 ouid=105 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="_apt" OGID="root"
type=PROCTITLE msg=audit(1715262282.739:177416): proctitle=2F62696E2F7368002D65002F7573722F6C69622F7570646174652D6E6F7469666965722F7570646174652D6D6F74642D6877652D656F6C
处理分析
open,openat通常只涉及一个文件PATH
#a1,a2是open的flag,mode
#a2,a3是openat的flag,mode
exit是返回的文件描述符
首先通过eventdata与进程Fds信息获取路径描述符。 (根据PathRecord: path, mode, permissdion ,inode等,结合arg_a0与进程Fds得出最终路径,path,Fs,inode,subtype)
权限等信息,存储到节点状态。
根据对flag的解析,对r,w,create 操作进行不同的溯源解析。
最终将Fd,文件描述符加入到进程状态。
open
在标准的 C 语言库中,open() 系统调用的原型通常定义在 <fcntl.h> 头文件中。其原型如下:
这里是每个参数的含义:
pathname:一个以 null 结尾的字符串,表示要打开或创建的文件的路径名。flags:一个整数值,用于指定打开文件时的行为,例如读取、写入、创建等。可以使用一组位掩码来组合多个选项。mode:如果使用O_CREAT标志创建文件,则需要提供文件的权限。mode参数指定了新文件的权限掩码。
这是 open() 系统调用在标准的 C 语言环境中的原型。在不同的操作系统或环境中,open() 可能会有一些变化,但基本的参数和行为通常是类似的。
openat
openat() 系统调用的原型通常如下所示:
其中各个参数的含义如下:
-
dirfd:一个文件描述符,表示相对路径名的起始点。如果pathname是绝对路径名,则dirfd应该设置为AT_FDCWD(-100)以表示当前工作目录。如果pathname是相对路径名,则dirfd应该是一个已经打开的目录的文件描述符,表示相对路径名的起始点是这个目录。 -
pathname:要打开的文件或目录的路径名。它可以是绝对路径名或相对路径名,具体取决于dirfd参数的设置。 -
flags:打开文件时的标志,可以是O_RDONLY、O_WRONLY、O_RDWR等,也可以与O_CREAT、O_TRUNC、O_APPEND等标志进行按位或操作以组合使用。 -
mode:如果设置了O_CREAT标志,则指定新创建文件的权限。通常是一个八进制数,比如0644表示权限为rw-r--r--。
openat() 系统调用的返回值是一个文件描述符,如果出错则返回 -1,并设置相应的错误号到全局变量 errno 中。
Create
在Linux系统中,create() 系统调用实际上是 open() 系统调用的一个旧版本,用于以特定的标志创建文件。它已经被 open() 系统调用取代,并不再被推荐使用。create() 的原型与 open() 相似,通常是这样的:
int create(const char *pathname, mode_t mode);
但是,create() 函数实际上只是 open() 函数的一个宏定义,它的调用等价于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
其中:
pathname是要创建的文件的路径名。mode是新创建文件的权限掩码。
create() 系统调用的作用是创建一个新的文件,如果文件已存在,则将其截断为0(清空文件内容)。
在调用 create() 时提供的 mode 参数会被转换为 open() 的 flags 参数的一部分。在这种情况下,mode 参数会转换为 O_WRONLY | O_CREAT | O_TRUNC,用于指定以只写模式打开文件,如果文件不存在则创建它,并将其截断为0。
如果文件已经存在,create() 调用实际上就是在以只写模式打开文件,并将文件内容清空。

浙公网安备 33010602011771号