accept系统调用
日志
type=SYSCALL msg=audit(1714980638.367:4662): arch=c000003e syscall=43 success=yes exit=5 a0=3 a1=7fff2a116900 a2=7fff2a1168bc a3=0 items=0 ppid=1 pid=924 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="sshd" exe="/usr/sbin/sshd" subj=unconfined key="my_syscall_watch"ARCH=x86_64 SYSCALL=accept AUID="unset" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root" type=SOCKADDR msg=audit(1714980638.367:4662): saddr=0200A7EAC0A8FD840000000000000000SADDR={ saddr_fam=inet laddr=192.168.253.132 lport=42986 } type=PROCTITLE msg=audit(1714980638.367:4662): proctitle=2F7573722F7362696E2F73736864002D44
处理过程
首先关键字段有 exit=5表示成功时返回新创建的套接字描述符。a0=3表示监听客户端连接的套接字。
comm表示运行程序。
进程924接受了 客户端的一个连接,客户端地址是laddr=192.168.253.132 lport=42986
1. 创建此进程描述符,更新进程的状态(添加 fd--5, agent更新 )
2. 创建socket描述符,添加socket节点。
3. 创建accept边,应该属于 artifact信息流到process,
之后可能会通过recv()与send()系统调用发送信息。
系统调用原型
`accept` 系统调用用于接受一个从客户端发起的连接,并创建一个新的套接字来处理该连接。
其原型通常定义在 `<sys/socket.h>` 头文件中。其原型如下:
```c
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
其中:
- `sockfd`:是一个已经通过 `socket` 系统调用创建的套接字描述符,用于监听客户端连接的套接字。
- `addr`:是一个指向 `struct sockaddr` 结构的指针,用于存储客户端的地址信息。
- `addrlen`:是一个指向存储客户端地址信息长度的变量的指针。
`accept` 系统调用会阻塞程序执行,直到有一个客户端连接请求到达为止。一旦有连接请求到达,`accept` 就会创建一个新的套接字来处理该连接,并返回一个新的套接字描述符,用于后续与客户端通信。同时,它也会将客户端的地址信息填充到 `addr` 指向的结构中,并将客户端地址信息的长度填充到 `addrlen` 指向的变量中。
`accept` 系统调用在成功时返回新创建的套接字描述符,失败时返回 -1,并设置 `errno` 来指示错误的原因。

浙公网安备 33010602011771号