上下文
我做了一个java库,它使用jni的c库。c库在linux中编译成 .so
文件。这个图书馆需要 cap_net_raw
能力。
目标
在没有额外特权的情况下执行java进程,该进程使用所述java库。要使用库的实际进程是prod中已有的进程,我们不想给它们更多的权限。
为了验证这一点,我创建了一个 jar
不管有没有 sudo
. 不出所料,它成功了,但失败了。
复制测试的步骤
用本机方法创建一个java类,我们来调用它 SocketTester.java
```
static {
System.loadLibrary("SocketTester");
}
private native int socketTest();
生成 `socketTester.h` 使用命令归档
javac -h . SocketTester.java
创建 `socketTester.c` 实现的文件 `socketTester.h` 哪个需要 `cap_net_raw` 能力
编译
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
移动 `libSocketTester.so` 到/usr/lib
运行
sudo ldconfig
盖上盖子
cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so
创建 `Test.java` 班
public static void main(final String[] args) {
SocketTester tester = new SocketTester();
tester.socketTest();
}
创建一个带有 `SocketTester.java` 以及 `Test.java` 运行测试
java -cp socketTester.jar Test
### 我已经试过了
#### 在.so库中添加cap
sudo setcap cap_net_raw=epi libSocketTester.so
结果:失败
#### 向java添加cap
sudo setcap cap_net_raw=epi /usr/lib/jvm/java-14-openjdk-amd64/bin/java
结果:它可以工作,但这不是我想要的,因为现在所有java进程都有了这个功能(请参见目标部分中的粗体部分)。
### 问题
为什么要把帽子加在table上 `.so` 不起作用?我还能怎样实现这个目标?
暂无答案!
目前还没有任何答案,快来回答吧!