The documentation states that fflag should represent the kernel-applied mask.
Yes, and they do. That is, flags returned by the fflag field come from the kernel's fcntl.h file., not the user space fcntl.h file..
not the open(2) oflag values.
The behavior here is exactly the same as before. O_SEARCH is a perfectly valid kernel flag. and it was occurring on macOS 15 as well as on macOS 26. I suspect the main reason you haven't seen it before is simply that it was primarily used by system daemon's you'd already muted and/or target paths you'd also muted.
Is this an intentional change in macOS 26?
It depends on which change you're talking about. If you're talking about EndpointSecurity or the kernel, then nothing actually changed. However, if you're talking about specific implementations like:
Environment: macOS 26 beta 4 Endpoint Security Framework Observed during file copy operations (/bin/cp)
Yes, that was absolutely a deliberate change. More specifically, you can open multiple files in the same directory in two different ways:
(1) Directly open the files
int fd = open("/foo/bar", O_RDONLY);
int fd2 = open("/foo/bar2", O_RDONLY);
int fd3 = open("/foo/bar3", O_RDONLY);
OR
(2) Open the directory, then openat the files:
int dd = open("/foo", O_SEARCH);
int fd = openat(dd, "/bar", O_RDONLY);
int fd2 = openat(dd, "/bar2", O_RDONLY);
int fd3 = openat(dd, "/bar3", O_RDONLY);
Note that the second pattern is more secure when dealing with multiple files, since it guarantees that all three files came from the same source directory, minimizing TOC/TOU (Time of Check to Time of Use) race conditions.
And, yes, in macOS 26, cp's implementation changed from #1 to #2.
Should we now expect directory AUTH_OPEN events before file events?
Again, the problem here is with the word "expect". The EndpointSecurity system is simply telling you what happened, so you're now seeing different behavior because "what's happening" has changed. I think you probably will see more "O_SEARCH" opens but that simply because it's often the better approach, not because of any low-level/systemic change.
If so, should fflag still be interpreted as before, or does it now represent oflag values in some cases?
Again, the meaning of fflag has not changed at all. O_SEARCH has been a perfectly valid kernel open flag for a very long time. It just happened to be the case that you weren't monitoring the cases where the system was using it.
__
Kevin Elliott
DTS Engineer, CoreOS/Hardware.