枚举所有可用 Linux 系统调用的最佳方法是什么?
为了澄清这一点,我问如何在容器化环境中运行时发现 seccomp 过滤了哪些系统调用。
答案1
我发现了两种可能的方法来枚举 Linux 系统调用。其中一个涉及到bash 一行,但取决于您的发行版是否包含所有相关的联机帮助页。另一个,斯特雷斯,一个可用于发现和跟踪任何和所有可能的系统调用的工具。
斯特雷斯
strace
可以找到GitHub和GitLab。我无法保证您的环境,如果您希望检查容器内的系统调用,则此解决方案并不理想,但它比 bash 单行代码效果更好,因为可能未安装联机帮助页。
按系统调用类型过滤:
strace -e trace=%desc Trace all file descriptor related system calls. %file Trace all system calls which take a file name as an argument. %fstat Trace fstat and fstatat syscall variants. %fstatfs Trace fstatfs, fstatfs64, fstatvfs, osf_fstatfs, and osf_fstatfs64 system calls. %ipc Trace all IPC related system calls. %lstat Trace lstat syscall variants. %memory Trace all memory mapping related system calls. %network Trace all the network related system calls. %process Trace all system calls which involve process management. %pure Trace syscalls that always succeed and have no arguments. %signal Trace all signal related system calls. %stat Trace stat syscall variants. %statfs Trace statfs, statfs64, statvfs, osf_statfs, and osf_statfs64 system calls. %%stat Trace syscalls used for requesting file status. %%statfs Trace syscalls related to file system statistics.
但是,如果您有想要查找的特定系统调用的列表,则可以使用以下命令:
strace -e [syscall1],[syscall2],[syscall3],...,[syscalln]
我还包括这个博客有关 strace 的更多信息。
Bash 一行
我将参考系统调用手册页,链接1 链接2, 也这个网页提供有关如何完成枚举给定 Linux 系统的所有可用系统调用的任务的建议。
网页上的个人建议您可以参考您的联机帮助页以获取系统调用的完整列表。此示例在带注释的列表中提供输出。
ls /usr/share/man/man2 | sed -e s/.2.gz//g | xargs man -s 2 -k | sort | grep -v 'unimplemented system calls'
结论
再次,我要指出的是,如果您的发行版未能发送所有软件包及其所有相关的联机帮助页,那么 bash 一行语句将无法实现。如果不需要带注释的列表输出,并且此解决方案不适合您所需的输出,请更新您的帖子以更好地定义您的目标。
我还将包括一个链接到用于查找系统调用的 python 工具。这可能是一个很好的参考,可以将您发现的系统调用与可用的系统调用进行比较。
如果您对此答案有任何疑问或疑问,请发表评论。我强烈建议您在尝试命令之前仔细阅读我提供的每个链接。我感谢您提供反馈来纠正任何误解并改进我的帖子。我可以根据需要更新我的答案。
祝你好运!