Bug 53913

Summary: Failed to open /var/lib/systemd/coredump/core.neomutt.500.03abba8b7e084e27816f51dca72fc4a1.1699072.1745188860000000.zst: Permission denied
Product: Sisyphus Reporter: Vitaly Chikunov <vt>
Component: systemd-coredumpAssignee: Alexey Shabalin <shaba>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: arseny, shaba
Version: unstable   
Hardware: x86   
OS: Linux   

Description Vitaly Chikunov 2025-04-21 02:00:41 MSK
coredump созданный под пользователем не читаем для пользователя.

$ coredumpctl gdb
           PID: 1699072 (neomutt)
           UID: 500 (vt)
        Signal: 11 (SEGV)
     Timestamp: Mon 2025-04-21 01:41:00 MSK (15min ago)
  Command Line: neomutt
    Executable: /usr/bin/neomutt
 Control Group: /user.slice/user-500.slice/session-2005.scope
          Unit: session-2005.scope
         Slice: user-500.slice
       Session: 2005
     Owner UID: 500 (vt)
       Boot ID: 03abba8b7e084e27816f51dca72fc4a1
    Machine ID: d22b3ff7d165468497a3bcd66058be11
       Storage: /var/lib/systemd/coredump/core.neomutt.500.03abba8b7e084e27816f51dca72fc4a1.1699072.1745188860000000.zst (inaccessible)
       Message: Process 1699072 (neomutt) of user 500 dumped core.

                Stack trace of thread 1699072:
                #0  0x00005611612c73ed imap_sync_mailbox (/usr/bin/neomutt + 0x1193ed)
                #1  0x00005611611fc9a6 mx_mbox_close (/usr/bin/neomutt + 0x4e9a6)
                #2  0x0000561161214ca8 op_quit (/usr/bin/neomutt + 0x66ca8)
                #3  0x00005611612183ab index_function_dispatcher (/usr/bin/neomutt + 0x6a3ab)
                #4  0x000056116120cd0d dlg_index (/usr/bin/neomutt + 0x5ed0d)
                #5  0x00005611611dd8a7 main (/usr/bin/neomutt + 0x2f8a7)
                #6  0x00007f255d339d6a __libc_start_call_main (libc.so.6 + 0x29d6a)
                #7  0x00007f255d339e25 __libc_start_main_impl (libc.so.6 + 0x29e25)
                #8  0x00005611611ddfc1 _start (/usr/bin/neomutt + 0x2ffc1)
                ELF object binary architecture: AMD x86-64

Failed to open /var/lib/systemd/coredump/core.neomutt.500.03abba8b7e084e27816f51dca72fc4a1.1699072.1745188860000000.zst: Permission denied

$ ls -l /var/lib/systemd/coredump/core.neomutt.500.03abba8b7e084e27816f51dca72fc4a1.1699072.1745188860000000.zst
-rw-r----- 1 root root 49659086 Apr 21 01:41 /var/lib/systemd/coredump/core.neomutt.500.03abba8b7e084e27816f51dca72fc4a1.1699072.1745188860000000.zst

Это немного снижает пользу от coredumpctl.
Comment 1 Arseny Maslennikov 2025-04-21 02:10:20 MSK
Присутствует ли на сжатой корке ACL?

Если нет, то, может, на /var/lib сломаны ACL, и дело в этом? Написал ли coredumpd об этом в логи?
Comment 2 Vitaly Chikunov 2025-04-21 03:28:47 MSK
На core.neomutt.*.zst нет acl (при этом на ней есть user.coredump xattr). systemd-coredump в журнале про это ничего (и никаких других ошибок) не писал.

Apr 21 01:41:00 й systemd-coredump[1700328]: Process 1699072 (neomutt) of user 500 terminated abnormally with signal 11/SEGV, processing...
Apr 21 01:41:01 й systemd-coredump[1700329]: Process 1699072 (neomutt) of user 500 dumped core.
Comment 3 Arseny Maslennikov 2025-04-21 11:05:03 MSK
(In reply to Vitaly Chikunov from comment #2)
> На core.neomutt.*.zst нет acl (при этом на ней есть user.coredump xattr).
https://github.com/systemd/systemd/blob/34c10968cbe3b5591b3c0ce225b8694edd9709d0/src/journal/coredump.c#L164
  160 static int fix_xattr(int fd, char *argv[]) {
  161         int r = 0;
  162 
  163         /* Attach some metadate to coredumps via extended
  164          * attributes. Just because we can. */
Comment 4 Arseny Maslennikov 2025-04-21 11:05:38 MSK
(In reply to Vitaly Chikunov from comment #2)
> На core.neomutt.*.zst нет acl.
> systemd-coredump в журнале про это ничего (и никаких других ошибок) не писал.
https://github.com/systemd/systemd/blob/v257.5/src/coredump/coredump.c#L249

Появилось, кажется, тут:
https://github.com/systemd/systemd/blob/34c10968cbe3b5591b3c0ce225b8694edd9709d0/src/journal/coredump.c#L118

как и установка xattr.
Comment 5 Vitaly Chikunov 2025-04-21 11:12:31 MSK
Установка xattr мне не нужна и не интересна, я лишь сказал, что она есть на случай если это чем-то поможет. Если это не помогает, то считайте, пожалуйста, что я про это не говорил.
Comment 6 Arseny Maslennikov 2025-04-21 12:18:58 MSK
(In reply to Vitaly Chikunov from comment #5)
> Установка xattr мне не нужна и не интересна, я лишь сказал, что она есть на
> случай если это чем-то поможет. Если это не помогает, то считайте,
> пожалуйста, что я про это не говорил.
Да это понятно; меня процитированный в comment 3 фрагмент исходника про xattr позабавил. К делу это отношения не имеет.

Вот как сохранённая корка у меня на одной из машин выглядит:
  % getfacl /var/lib/systemd/coredump/core.zig2.1000.fcb63df0c80f45988701bd0b23367111.654.1744471718000000.zst
  getfacl: Removing leading '/' from absolute path names
  # file: var/lib/systemd/coredump/core.zig2.1000.fcb63df0c80f45988701bd0b23367111.654.1744471718000000.zst
  # owner: root
  # group: root
  user::rw-
  user:ar:r--
  group::r--
  mask::r--
  other::---

Предлагаю попробовать в /var/lib от root создать файл с dac-правами 0400, с ACL-записью о том, что, мол, усеру vt разрешить `r--`. Может, от руки тоже не получится это сделать?
Comment 7 Vitaly Chikunov 2025-04-21 17:46:52 MSK
Вручную установить u:vt:r получается, так что дело не в fs.
Comment 9 Vitaly Chikunov 2025-04-22 05:25:50 MSK
neomutt не suid.

  -rwxr-xr-x 1 root root 1985056 Apr 10 17:56 /usr/bin/neomutt
Comment 10 Vitaly Chikunov 2025-04-22 05:37:39 MSK
Понятно. system-uid-max=999.

fix_acl::
        if (uid_is_system(uid) || uid_is_dynamic(uid) || uid == UID_NOBODY)
                return 0;

Решение, видимо, только помнеть UID пользователю.
Comment 11 Vitaly Chikunov 2025-04-22 05:43:41 MSK
Наверное, более умная и обратно совместимая проверка могла бы быть другой. Например, если пользователь имеет shell, то можно предоставлять ему доступ. Или если uid_is_system, но пользователь в группе wheel, то наверное он сисадмин и можно дать ему доступ.
Comment 12 Arseny Maslennikov 2025-04-24 22:55:42 MSK
(In reply to Vitaly Chikunov from comment #11)
> Наверное, более умная и обратно совместимая проверка могла бы быть другой.
> Например, если пользователь имеет shell, то можно предоставлять ему доступ.

Свести к этому вопросу uid_is_system() — это умная идея (причём не только для coredumpd, а вообще). Но, чтобы это узнать, на сегодняшний день нужно сходить к nss.

Дешёвое системное решение — ввести отдельный файл с системными уидами, который синхронизировать с базовой локальной password database, и во всём софте предикат uid_is_system сводить к этому файлу. У такого решения как минимум те же недостатки, что и у обычного /etc/passwd (ключевые слова chroot(2), PR_SET_NO_NEW_PRIVS)

Другое системное решение — сервер усеров, такой accountsservice здорового человека. Это решает тонну похожих задач одним махом, сильно упрощает жизнь в доменных организациях.
systemd-userdbd, говорят, стремится стать такой службой, но я на сегодняшний день в нём разбираюсь плохо.