简介
我正在集成EndpointSecurity Framework并观察ES_EVENT_TYPE_AUTH_EXEC
事件。我可以看到命令参数,但无法读取命令输入。
假设命令如下:
thirdPartyApp do something < ~/Desktop/file.txt
我的代码是:(msg是类型为es_event_exec_t *
的值(
for (int i = 0; i < es_exec_arg_count(&msg->event.exec); i++) {
es_string_token_t arg = es_exec_arg(&msg->event.exec, i);
print("arg: %s",arg.data);
}
挑战在于
代码输出仅为:
thirdPartyApp做某事,没有</桌面/文件.txt
问题是,</Desktop/file.txt不是一个参数,它是一个重定向,如这里所述
我试了什么
- 我也试着阅读env参数,但它们根本没有帮助
- 我尝试读取文件描述符,然后使用NSFileHandle读取文件,但它们都是空的,0字节
等待
通过shell在fork(2(ing或posix_spown(2(ng之前打开(2(重定向的文件并将其复制到0,1,2上(取决于重定向(,并允许child(派生的命令(来重定向工作。这意味着EPS将无法将它们视为es_exec_args,因为(正如你正确地说的(它们不是自变量。
如果您使用
const es_fd_t * _Nonnull
es_exec_fd(const es_event_exec_t * _Nonnull event, uint32_t index);
您应该能够返回es_fd_t,但是唯一相关的字段是fdtype:
typedef struct {
int32_t fd;
uint32_t fdtype;
union {
struct {
uint64_t pipe_id;
} pipe;
};
} es_fd_t;
因此,一个更好的选择是离开EPS,使用proc_info(2((通过libproc.h(,它可以为您获得任何进程和FD的完整FD信息(很像http://newosxbook.com/tools/supraudit.html确实如此(。
注意,这仍然不会给你输入本身。该输入由使用读(2(的进程消耗(当然,使用写(2(进行输出(,而EPS和BSM(审计(都没有为此提供挂钩。