小编tom*_*x86的帖子

功能与Linux和Java

我正在试验Java应用程序的Linux功能.我不想为解释器(JVM)添加功能,所以我尝试编写一个简单的包装器(将调试信息打印到stdout):

#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>

int main(int argc, char *argv[]){
        cap_t cap = cap_get_proc();

        if (!cap) {
                perror("cap_get_proc");
                exit(1);
        }
        printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));

        return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以看到为此可执行文件设置了功能:

./runner: running with caps = cap_net_bind_service+p
Run Code Online (Sandbox Code Playgroud)

getcap节目

runner = cap_net_bind_service+ip
Run Code Online (Sandbox Code Playgroud)

我有能力设置为可继承,所以应该没有问题.但是,java仍然不想绑定到特权端口.

我收到此错误:

sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

java linux linux-capabilities

6
推荐指数
1
解决办法
1037
查看次数

ubuntu和libcap(功能)未定义的引用

我正在尝试在ubuntu 10.10上编译以下最小C代码:

#include <sys/capability.h>

void main(void)
{
        cap_t cap;
        cap = cap_get_proc();
}
Run Code Online (Sandbox Code Playgroud)

gcc -lcap test.c它给我以下错误:

/tmp/ccCQFyXS.o: In function `main':
test.c:(.text+0x9): undefined reference to `cap_get_proc'
collect2: ld a retourné 1 code d'état d'exécution
Run Code Online (Sandbox Code Playgroud)

我安装了libcap2-dev和libcap2-bin,版本2.21

ls /lib/libcap.*
/lib/libcap.a  /lib/libcap.so  /lib/libcap.so.2  /lib/libcap.so.2.21
Run Code Online (Sandbox Code Playgroud)

具有相同gcc命令的相同代码在arch和gentoo上成功构建

我该怎么做才能让它在ubuntu上构建?

c ubuntu undefined-reference linux-capabilities

6
推荐指数
1
解决办法
9304
查看次数

如何定义运行时已知大小的CUDA共享内存?

__shared__CUDA中的内存似乎在编译时需要已知的大小.但是,在我的问题中,__shared__内存大小只在运行时知道,即

int size=get_size();
__shared__ mem[size];
Run Code Online (Sandbox Code Playgroud)

这将最终导致"错误:常数值未知",我不知道如何解决这个问题.

cuda gpu-shared-memory

6
推荐指数
1
解决办法
1万
查看次数

尽管缺少基于文件系统的功能,如何执行进程并保留功能?

我想让系统在没有setuid文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。

使用这种方法(init集合PR_SET_NO_NEW_PRIVS和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。

如何在execve不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......

我可以永久制作整个文件系统=ei吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。

linux execve linux-capabilities

6
推荐指数
1
解决办法
3326
查看次数

setuid(0) 与 CAP_SETUID

我正在尝试将我的 uid 更改为 0 作为具有该CAP_SETUID功能的非 root 用户。我有以下程序:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
    printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
    printf("%s\n", cap_to_text(cap_get_proc(), NULL));
    printf("uid: %d\n", (int) getuid());
    setresuid(0, 0, 0);
    printf("uid: %d\n", (int) getuid());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我将 setuid 功能分配如下:

sudo /sbin/setcap cap_setuid=ep ./capsetuid
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000
Run Code Online (Sandbox Code Playgroud)

我希望第二个 printf() 也能显示出这种CAP_SETUID能力。不知何故,我的进程没有获得 …

linux privileges linux-capabilities

5
推荐指数
1
解决办法
9502
查看次数

setuid()之后失去能力

试图设置cap_setgid,cap_setuid,cap_setpcap.

#include <sys/types.h>
#include <sys/capability.h>

int main()
{
    cap_t caps;
    caps = cap_get_proc();
    cap_value_t cap_list[2];

    cap_list[0] = CAP_SETUID;
    cap_list[1] = CAP_SETGID;

    cap_set_flag(caps, CAP_EFFECTIVE, 2, cap_list, CAP_SET);
    cap_set_flag(caps, CAP_INHERITABLE, 2, cap_list, CAP_SET);
    cap_set_proc(caps);
    cap_free(caps);
    setgid(65534);
    setuid(65534);

    cap_get_proc();
    setgid(0);
    setuid(0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

执行是在root用户下进行的.跟踪程序显示了这一点

capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, 0}) = 0
capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_SETGID|CAP_SETUID|CAP_SETPCAP}) = 0
setgid(65534)                           = 0
setuid(65534)                           = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, …
Run Code Online (Sandbox Code Playgroud)

c linux privileges linux-capabilities

5
推荐指数
1
解决办法
5222
查看次数

是否可以即时(jit)编译CUDA内核?

CUDA是否支持CUDA内核的JIT编译?

我知道OpenCL提供此功能。

我有一些在运行时不会更改的变量(即仅取决于输入文件),因此我想在内核编译时(即在运行时)使用宏定义这些值。

如果我在编译时手动定义这些值,我的寄存器使用率将从53下降到46,这将大大提高性能。

jit cuda

5
推荐指数
1
解决办法
2554
查看次数

在C#中,当我调用BeginXXX时有两个线程

我对IOCP有所了解,但我对APM有些困惑.

static FileStream fs;
static void Main(string[] args)
{
    fs = new FileStream(@"c:\bigfile.txt", FileMode.Open);
    var buffer = new byte[10000000];
    IAsyncResult asyncResult = fs.BeginRead(buffer, 0, 10000000, OnCompletedRead, null);
    Console.WriteLine("async...");
    int bytesRead = fs.EndRead(asyncResult);
    Console.WriteLine("async... over");
}

static void OnCompletedRead(IAsyncResult ar)
{
       Console.WriteLine("finished");
}
Run Code Online (Sandbox Code Playgroud)

我想知道,IO线程异步执行的读取操作是什么?还是线程池中的工作线程?

和回调函数一样OnCompletedRead,它是否也由CLR线程池中的IO线程执行?

这两个线程是同一个吗?如果没有,则生成两个线程,一个执行读取操作,另一个执行回调.

.net c# asynchronous

5
推荐指数
1
解决办法
295
查看次数

较新版本的 docker 有 --cap-add,可以添加哪些 CAP?

较新版本的 docker(我认为 1.2 及更高版本)有一个 --cap-add功能。

这提供了对功能功能的细粒度控制,而无需打开所有内容 --privileged=true.

我用谷歌搜索过,但找不到功能列表及其含义。任何人都可以帮忙吗?

linux docker linux-capabilities

5
推荐指数
2
解决办法
7320
查看次数

如何使用PAM功能模块向特定用户和可执行文件授予功能?

我正在尝试制作一个程序,该程序使用原始套接字正确运行,具有Linux功能的非root用户.该计划如下:

#include <netinet/ip.h>

int main()
{
  int sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
  if(sd < 0)
  {
    perror("socket() error");
    return 1;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我编译它并以非root身份运行它,我会收到错误,如预期的那样:

[user@localhost ~]$ make socket
cc     socket.c   -o socket
[user@localhost ~]$ ./socket 
socket() error: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

如果我添加该cap_net_raw功能,作为一种有效且允许的功能,它可以工作.

[user@localhost ~]$ sudo setcap cap_net_raw+ep socket
[sudo] password for user: 
[user@localhost ~]$ ./socket 
[user@localhost ~]$ 
Run Code Online (Sandbox Code Playgroud)

现在,我想用pam_cap.so它来制作它,以便只有特定的用户才能运行这个程序cap_net_raw,而不是每个人.我/etc/security/capability.conf是:

cap_net_raw user
Run Code Online (Sandbox Code Playgroud)

/etc/pam.d/login是(注意我也尝试过,/etc/pam.d/sshd但似乎也没有用):

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so …
Run Code Online (Sandbox Code Playgroud)

c sockets linux pam linux-capabilities

5
推荐指数
1
解决办法
1343
查看次数