【问题标题】:How to programmatically get the pid of a socket's peer in MacOS?如何以编程方式获取 MacOS 中套接字对等点的 pid?
【发布时间】:2020-10-01 23:35:03
【问题描述】:

在 MacOS 中,除了启动 lsof 命令之外,还有没有办法从绑定到本地主机的 TCP 服务器中获取套接字对等方的进程 ID?如果没有,是否保证从 10.11 (El Capitan) 开始的所有 OSX 版本中都存在lsof

编辑:服务器进程正在当前用户上下文中运行(它没有提升的权限)。并且连接过程也有望在相同的权限级别上运行。

TIA。

【问题讨论】:

  • 问题是,除非你有一个保证的本地套接字(即AF_LOCAL 套接字),否则你不知道对等点在哪里运行。它可以是本地的,也可以是世界各地的。
  • 另外,您需要解决的根本问题是什么?为什么需要获取peer的pid?
  • 就像我更新的一样,只有本地进程才能连接到服务器。目标是验证连接过程的真实性。也就是只允许某些特定进程使用 TCP 服务器。

标签: macos


【解决方案1】:

有,但它非常专有,在达尔文以外无法使用。您可以使用 com.apple.network.statistics PF_SYSTEM 套接字来有效地执行 netstat(1) 和特定于 Darwin 的 nettop(1) 所做的事情,并获取所有套接字活动(包括实时更新)。

私有 NetworkStatistics.framework 甚至包含对此的包装器,并且(到目前为止)它不需要权利或 root 权限。查看清单 16-26 中的代码示例http://newosxbook.com/bonus/vol1ch16.html 以获取确切的详细信息,并将其与 getpeername(2) 结合使用。

仅供参考,这仍然不是一个好主意,因为任何进程都可以轻松欺骗其名称。如果您已经在 macOS 中并且正在处理代码签名进程,那么更好的选择是,一旦您掌握了 PID,就可以使用 csops(2) 系统调用来获取代码签名身份,而这不能被欺骗。

【讨论】:

  • 谢谢。我同意,一旦获得 PID,就必须使用系统调用来验证进程二进制文件。我发现这个 API - SecStaticCodeCreateWithPath - 可能只是完成这项工作。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 2011-06-05
  • 1970-01-01
  • 2013-04-09
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多