如何将功能添加到本地库,而不是在运行它的可执行文件中添加功能?

 2023-01-20    296  

问题描述

上下文

我已经完成了一个使用JNI的C库的Java库.
C库在Linux中被编译为.so文件.该图书馆需要cap_net_raw capability .

目标

执行Java流程没有其他特权,使用Java库.将要使用库的实际流程已经存在于产品中,我们不想赋予他们更多的权利.

如何将功能添加到本地库,而不是在运行它的可执行文件中添加功能?

要测试,我创建了jar并在有或没有sudo的情况下运行它.正如预期的那样,它成功了,但没有它.

重现测试的步骤

  1. 用本机方法创建Java类,让我们称其为SocketTester.java
static {
    System.loadLibrary("SocketTester");
}
private native int socketTest();
  1. 使用命令生成socketTester.h文件
javac -h . SocketTester.java
  1. 创建socketTester.c实现socketTester.h和需要cap_net_raw capabitily
  2. 的文件

  3. 编译

gcc -o libSocketTester.so socketTester.c -shared -I/usr/lib/jvm/java-14-openjdk-amd64/include -I/usr/lib/jvm/java-14-openjdk-amd64/include/linux
  1. 移动libSocketTester.so到/usr/lib
  2. 运行
sudo ldconfig
  1. 设置帽子
cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so
  1. 创建Test.java class
public static void main(final String[] args) {
    SocketTester tester = new SocketTester();
    tester.socketTest();
}
  1. 用SocketTester.java和Test.java
  2. 创建一个JAR

  3. 运行测试
java -cp socketTester.jar Test

我已经尝试了

将帽子添加到.so lib

sudo setcap cap_net_raw=epi libSocketTester.so

结果:失败

将帽子添加到Java

sudo setcap cap_net_raw=epi /usr/lib/jvm/java-14-openjdk-amd64/bin/java

结果:它有效,但这不是我想要的,因为现在所有的Java过程都具有功能(请参阅目标部分中的BOLD).

问题

为什么将盖子添加到.so不起作用?我还能如何实现目标?

推荐答案

一十亿年前,我弄清楚了如何让PAM模块分叉一个助手程序来从非特权上下文中进行特权事件.这就是pam_unix.so能够调用unix_chkpwd来帮助无私人的应用程序(a screensaver或screen)接受以在Linux下解锁的用户密码.

最近,我学会了制作共享库对象(libcap.so,pam_cap.so等)用作独立的二进制文件.从那以后,我一直在考虑结合这两种技术…研究了这一点,我遇到了这个问题.由于我能够为绑定到port 80的无私人程序的示例任务执行此操作,因此我认为这可能是一个答案.

我已经完整地写完了它如何在中完全功能libcap 分销站点,但基本上归结为三件事:

  • 制作 .so文件可执行文件作为独立程序,具有自己的文件能力
  • 在.so文件中包含一些代码,这些代码在链接到另一个程序时会弄清楚自己的文件名(这使用_GNU_SOURCE扩展名:dladdr())
  • 为库本身创建一些机制,以将私人通信机制(我使用socketpair()使用socketpair()生成的Unix域套接字)返回到链接的链接共享库代码.

基本上,该流量为.so函数,该函数将.so文件作为分叉的孩子调用并执行特权操作.然后,它通过Unix域插座将结果返回到应用程序.

以上所述是小编给大家介绍的如何将功能添加到本地库,而不是在运行它的可执行文件中添加功能?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26134.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。