getrandom fallback

闲着没事一番研究,原来可以拦截 getrandom 这个函数的调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) {
int fd = open("/dev/urandom", O_RDONLY);
if (fd < 0) {
errno = EIO;
return -1;
}
ssize_t res = read(fd, buf, buflen);
close(fd);
return res;
}

docker中编译这段代码,几分钟搞定,只是docker hub难搞。

1
2
docker run --rm -v "$(pwd)":/work -w /work ubuntu:latest bash -c \
"apt-get update && apt-get install -y gcc && gcc -fPIC -shared -o getrandom_fallback.so getrandom_fallback.c"

gitea/runner-images 中使用 .so 需要两步

  1. 编辑 .gitea/workflows/docker.yml
1
2
3
4
5
6
7
8
9
jobs:
build:
runs-on: ubuntu-latest
container:
volumes:
- /volume1/docker/gitea-runner/getrandom_fallback.so:/usr/local/lib/getrandom_fallback.so:ro
env:
LD_PRELOAD: /usr/local/lib/getrandom_fallback.so
...
  1. act-runner config.yaml 中加白名单
1
2
3
container:
valid_volumes:
- /volume1/docker/gitea-runner/getrandom_fallback.so

gitea 中使用 .so 可以在DSM Container Manager中改配置,存储空间和环境变量增加如上配置。