Как запретить доступ к пространству имен пользователя для программы или пользователя?

Традиционно, единственная разница между /dev/urandom и /dev/random заключается в том, что происходит, когда ядро считает, что в системе нет энтропии - /dev/random не закрыт, /dev/urandom не открыт. Оба драйвера получали энтропию из add_disk_randomness(), add_interrupt_randomness() и add_input_randomness(). Подробности смотрите в /drivers/char/random.c.

Отредактировано для добавления: Начиная с Linux 4.8 /dev/urandom был переработан для использования CSPRNG.

Так когда вы должны отказаться от закрытого ключа? Для любого вида криптографического использования, в частности, для посева DRBG. Есть очень хорошая статья, объясняющая последствия использования /dev/urandom при генерации ключей RSA и недостаточной энтропии. Читайте Mining Your Ps and Qs.

2
25.01.2017, 02:24
1 ответ

Реализовал сам. Вот небольшой инструмент, использующий libseccomp :

https://github.com/vi/syscall_limiter/blob/master/ban_CLONE_NEWUSER.c

#include <linux/sched.h>                // for CLONE_NEWUSER
#include <seccomp.h>                    // for seccomp_rule_add, etc
#include <stdint.h>                     // for uint32_t
#include <stdio.h>                      // for fprintf, perror, stderr
#include <unistd.h>                     // for execve

// gcc ban_CLONE_NEWUSER.c -lseccomp -o ban_CLONE_NEWUSER

int main(int argc, char* argv[], char* envp[]) {

    if (argc<2) {
        fprintf(stderr, "Usage: ban_CLONE_NEWUSER program [arguments]\n");
        fprintf(stderr, "Bans unshare(2) with any flags and clone(2) with CLONE_NEWUSER flag\n");
        return 126;
    }

    uint32_t default_action = SCMP_ACT_ALLOW;

    scmp_filter_ctx ctx = seccomp_init(default_action);
    if (!ctx) {
        perror("seccomp_init");
        return 126;
    }

    int ret = 0;
    ret |= seccomp_rule_add(ctx, SCMP_ACT_ERRNO(1),  seccomp_syscall_resolve_name("unshare"), 0);
    ret |= seccomp_rule_add(ctx, SCMP_ACT_ERRNO(1),  seccomp_syscall_resolve_name("clone"), 1, SCMP_CMP(0, SCMP_CMP_MASKED_EQ, CLONE_NEWUSER, CLONE_NEWUSER));

    if (ret!=0) {
        fprintf(stderr, "seccomp_rule_add returned %d\n", ret);
        return 124;
    }

    ret = seccomp_load(ctx);
    if (ret!=0) {
        fprintf(stderr, "seccomp_load returned %d\n", ret);
        return 124;    
    }

    execve(argv[1], argv+1, envp);

    perror("execve");
    return 127;
}
$ ban_CLONE_NEWUSER /bin/bash
$ unshare -r
unshare: unshare failed: Operation not permitted
2
27.01.2020, 22:10

Теги

Похожие вопросы