Fatal glibc error: cannot get entropy for arc4random

Arkadiusz Miśkiewicz arekm at maven.pl
Tue Jul 23 09:57:38 CEST 2024


On 22/07/2024 17:16, Elan Ruusamäe wrote:
> cannot get entropy for arc4random

Try maybe this code to see if it works (+ strace for it).

It blocks getrandom syscall (ENOSYS) on x86_64 with seccomp.

-- 
Arkadiusz Miśkiewicz, arekm / ( maven.pl | pld-linux.org )
-------------- next part --------------
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/prctl.h>
#include <linux/seccomp.h>
#include <linux/filter.h>
#include <linux/audit.h>
#include <stdlib.h>
#include <stddef.h>

#ifndef __NR_getrandom
#define __NR_getrandom 318
#endif

int main() {
    struct sock_filter filter[] = {
        BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct seccomp_data, arch)),
        BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, AUDIT_ARCH_X86_64, 1, 0),
        BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_KILL),

        BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct seccomp_data, nr)),

        BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, __NR_getrandom, 1, 0),

        BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),

        BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | ENOSYS),
    };

    struct sock_fprog prog = {
        .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
        .filter = filter,
    };

    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
        perror("prctl(PR_SET_NO_NEW_PRIVS)");
        return 1;
    }

    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
        perror("prctl(PR_SET_SECCOMP)");
        return 1;
    }

    printf("Testing arc4random() after blocking getrandom syscall:\n");
    unsigned int random_value = arc4random();
    printf("arc4random() returned: %u\n", random_value);

    return 0;
}


More information about the pld-devel-en mailing list