使用EndpointSecurity读取终端输入



简介

我正在集成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不是一个参数,它是一个重定向,如这里所述

我试了什么

  1. 我也试着阅读env参数,但它们根本没有帮助
  2. 我尝试读取文件描述符,然后使用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(审计(都没有为此提供挂钩。

最新更新