--userns-block-fd can hang when given a closed descriptor

Aperta Adatta ai principianti
#826 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
c, linux

Direzione di ricerca

Inizia leggendo l’analisi dell’argomento --userns-block-fd e il codice di configurazione attorno a bubblewrap.c:3179-3180, dove il descrittore fornito viene letto e chiuso. Controlla come vengono allocati child_wait_fd e setup_finished_pipe, quindi esegui entrambe le riproduzioni dell’issue. Il lavoro è completato quando i descrittori chiusi vengono rifiutati con un errore prima che la configurazione possa bloccarsi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bubblewrap 0.13.1 accepts a closed --userns-block-fd descriptor and can reuse its number for its internal eventfd or, with --json-status-fd, its setup-completion pipe.

Both runs below hung until timeout -s KILL 20 killed them (status 137).

To reproduce:

bwrap --unshare-user --info-fd 1 --userns-block-fd 4 --ro-bind / / --proc /proc --dev /dev /bin/true 3<&- 4<&-

strace:

2865  openat(AT_FDCWD, "/proc", O_RDONLY|O_PATH) = 3
2865  eventfd2(0, EFD_CLOEXEC)          = 4
2865  clone(child_stack=NULL, flags=CLONE_NEWNS|CLONE_NEWUSER|SIGCHLD) = 2866
2866  read(4,  <unfinished ...>
2865  read(4, 0x7ffe9b5a5857, 1)        = -1 EINVAL (Invalid argument)
2865  write(4, "\1\0\0\0\0\0\0\0", 8)   = -1 EBADF (Bad file descriptor)

child_wait_fd gets descriptor 4. The parent's 1-byte read of opt_userns_block_fd fails with EINVAL. The parent closes that descriptor (bubblewrap.c:3180), which is also child_wait_fd. Its write to child_wait_fd fails with EBADF, leaving the child blocked.

With --json-status-fd:

bwrap --unshare-user --info-fd 1 --json-status-fd 2 --userns-block-fd 5 --ro-bind / / --proc /proc --dev /dev /bin/true 3<&- 4<&- 5<&- 6<&-

strace:

2939  openat(AT_FDCWD, "/proc", O_RDONLY|O_PATH) = 3
2939  eventfd2(0, EFD_CLOEXEC)          = 4
2939  pipe2([5, 6], O_CLOEXEC)          = 0
2939  clone(child_stack=NULL, flags=CLONE_NEWNS|CLONE_NEWUSER|SIGCHLD) = 2940
2940  read(4,  <unfinished ...>
2939  read(5,

opt_userns_block_fd is the read end of setup_finished_pipe (descriptor 5). The parent blocks in its read (bubblewrap.c:3179) before writing child_wait_fd. The child blocks in its read of child_wait_fd.

A patched build checks descriptors with fcntl (fd, F_GETFD) during argument parsing. Both commands returned status 1:

bwrap: Invalid fd: 4: Bad file descriptor
bwrap: Invalid fd: 5: Bad file descriptor
Lingua principale
C
Stelle
9.4k
Fork
408
Merge medio
6g 14h
PR unite (30g)
1

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di containers/bubblewrap

Tutte le issue di containers/bubblewrap

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.