【问题标题】:Opening RAW sockets in linux without being superuser在 Linux 中打开 RAW 套接字而不是超级用户
【发布时间】:2015-05-05 15:31:47
【问题描述】:

我必须编写一个 ping 函数才能在 Linux 上运行。语言是 C++,所以 C 也可以。

在网上搜索并查看ping命令的源代码,原来我应该创建一个原始套接字:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

如果我以超级用户身份运行我的应用程序,socket 函数将返回 -1,即未成功创建套接字。如果我以超级用户身份运行它,一切正常。

现在,ping 命令会创建一个原始套接字,我可以在没有超级用户权限的情况下运行它

我的问题是:如何在不被超级用户执行的情况下授予我的应用程序创建原始套接字所需的所有权限?

【问题讨论】:

    标签: c++ c linux sockets


    【解决方案1】:

    您可以使您的程序成为 SUID 命令,有效地授予它 root 权限,而无需将这些权限授予执行用户。有关示例和说明,请参阅here

    【讨论】:

    • 仍然无法从非root用户调试SUID程序,就像setcap cap_net_raw+ep
    【解决方案2】:

    ping 需要cap_net_raw 功能才能在没有(其他)超级用户权限的情况下执行此操作,您的程序也是如此。运行

    setcap cap_net_raw+ep your_executable_file
    

    以root身份,然后普通用户就可以使用该程序了。

    【讨论】:

    • 谢谢,成功了!但是,如果我尝试在 Eclipse 中调试它,套接字函数会再次返回 -1。我尝试将 cap_new_raw 功能同时设置为 eclipse 和 gdb,但它不起作用。
    • 啊。是的,调试具有功能(或设置了 suid 位)的程序有点问题,因为允许非特权用户ptrace 他们将是一个相当大的安全漏洞。也许您可以配置 eclipse 以使用 sudo 运行 gdb,这将允许您通过一头扎进让非特权用户能够运行 suid 调试器的安全噩梦来调试应用程序。我认为这个问题没有完美的解决方案。
    • 好的,我试试看。谢谢。
    • 我发现的一种解决方法是以超级用户身份运行 eclipse。它不是很优雅,但很有效。
    • 好吧,用 sudo 打开 eclipse 不是个好主意!这里描述了一个更好的解决方案:stackoverflow.com/questions/2891356/…
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 2012-03-25
    • 1970-01-01
    • 2022-11-25
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多