seccomp_export_bpf(3)

πŸ’– seccomp_export_bpf β€” export the seccomp filter πŸ’–

okay bestie, welcome to the libseccomp Documentation page for seccomp_export_bpf(3) ✨ this is the one where we take your filter and actually ship it out the door πŸšͺπŸ’¨


🌸 NAME 🌸

seccomp_export_bpf, seccomp_export_pfc β€” Export the seccomp filter 🫢


✨ SYNOPSIS ✨

#include <seccomp.h>

typedef void * scmp_filter_ctx;

int seccomp_export_bpf(const scmp_filter_ctx ctx, int fd);
int seccomp_export_pfc(const scmp_filter_ctx ctx, int fd);
int seccomp_export_bpf_mem(const scmp_filter_ctx ctx, void *buf, size_t *len);

and don't forget to link it up, queen: -lseccomp πŸ’…


πŸ¦‹ DESCRIPTION πŸ¦‹

so seccomp_export_bpf() and seccomp_export_pfc() are the duo that generates and outputs your current seccomp filter, and they do it in either BPF (Berkeley Packet Filter) or PFC (Pseudo Filter Code) πŸŽ€

  • the output of seccomp_export_bpf() is the one you can actually load into the kernel πŸ‘‘ like it's built for the real thing
  • the output of seccomp_export_pfc() is human readable and is intended primarily as a debugging tool for developers using libseccomp πŸ” it's giving "let me read my own vibes back"

both of them write the filter to the fd file descriptor, no cap πŸ’―

the filter context ctx is the value returned by the call to seccomp_init(3) β€” that's where you got it from, that's the source, periodt 🌟

while the two output formats are guaranteed to be functionally equivalent for the given seccomp filter configuration, the filter instructions, and their ordering, are not guaranteed to be the same in both the BPF and PFC formats. same energy, different font, iykyk 😭

now for the memory one β€” seccomp_export_bpf_mem() is largely the same as seccomp_export_bpf(), but instead of writing to a file descriptor, the program gets written to the buf pointer provided by the caller πŸ“

  • the len argument must be initialized with the size of the buf buffer
  • if the program was valid, len will be updated with its size in bytes πŸ“
  • if buf was too small to hold the program, len can be consulted to determine the required size
  • passing a NULL buf may also be used to query the required size ahead of time πŸ‘€ very "let me measure first bestie"

πŸ”₯ RETURN VALUE πŸ”₯

return zero on success πŸŽ‰ or one of these error codes on failure:

  • -ECANCELED β€” there was a system failure beyond the control of the library 😡 like, not our fault, not your fault, just vibes being bad
  • -EFAULT β€” internal libseccomp failure πŸ’€
  • -EINVAL β€” invalid input, either the context or architecture token is invalid 🚫
  • -ENOMEM β€” the library was unable to allocate enough memory, she's broke 😭
  • -ERANGE β€” the provided buffer was too small πŸ™ˆ
if the SCMP_FLTATR_API_SYSRAWRC filter attribute is non-zero then additional error codes may be returned to the caller; these additional error codes are the negative errno values returned by the system. Unfortunately libseccomp can make no guarantees about these return values. so like... you're on your own for those ones bestie πŸ’…

🌈 EXAMPLES 🌈

here's the whole moment, verbatim, slay:

#include <seccomp.h>

int main(int argc, char *argv[])
{
     int rc = -1;
     scmp_filter_ctx ctx;
     int filter_fd;

     ctx = seccomp_init(SCMP_ACT_KILL);
     if (ctx == NULL)
          goto out;

     /* ... */

     filter_fd = open("/tmp/seccomp_filter.bpf", O_WRONLY);
     if (filter_fd == -1) {
          rc = -errno;
          goto out;
     }

     rc = seccomp_export_bpf(ctx, filter_fd);
     if (rc < 0) {
          close(filter_fd);
          goto out;
     }
     close(filter_fd);

     /* ... */

out:
     seccomp_release(ctx);
     return -rc;
}

πŸ’œ NOTES πŸ’œ

while the seccomp filter can be generated independent of the kernel, kernel support is required to load and enforce the seccomp filter generated by libseccomp ⚠️ like you can write the letter but you still need someone to deliver it, fr fr

the libseccomp project site, with more information and the source code repository, can be found at https://github.com/seccomp/libseccomp 🌐 this tool, as well as the libseccomp library, is currently under development, please report any bugs at the project site or directly to the author πŸ›βœ¨


πŸŽ€ AUTHOR πŸŽ€

Paul Moore <paul@paul-moore.com> πŸ‘‘


⭐ SEE ALSO ⭐

seccomp_init(3), seccomp_release(3) β€” go read those next bestie, they're the prequel 🫢


okay that's the whole page!! πŸ’– big thanks to paul@paul-moore.com for writing it, and this version is from the 30 May 2020 era of libseccomp Documentation 🌸 stay safe out there, keep your filters tight, and remember: functionally equivalent does NOT mean identical. mwah πŸ’‹