先谈一下ptrace有什么潜在的安全问题。ptrace是一个系统调用,调用它可以让两个进程形成“跟踪”关系。跟踪进程可以查看和修改被跟踪进程内存、寄存器、信号等,可以了解被跟踪进程系统调用情况。也就是说,在跟踪进程面前,被跟踪进程毫无秘密可言。
Linux原有的、自主访问控制下的对ptrace的操作控制是满足下列两个条件之一即可:
(1)跟踪进程的uid同时等于被跟踪进程的uid、euid、suid,并且跟踪者进程的gid同时等于被跟踪者进程的gid、egid、sgid。
(2)跟踪者进程具备能力CAP_SYS_PTRACE。
看一下代码:
这里的问题是,uid/gid相同的进程可以互相跟踪,如果一个进程被攻破,与之同uid/gid的进程都沦陷。而如果特权进程被攻破,全系统的进程都不能幸免。
Yama提供了四种模式:disabled、relational、capability、no_attach。disabled就是Yama不起作用,和没有它一样。capability就是只有在跟踪者进程具备CAP_SYS_PTRACE能力时允许跟踪进程和被跟踪进程之间形成跟踪关系。no_attach就是根本不允许任何进程之间形成跟踪关系。relational是在以下三种情况之一出现时允许形成跟踪关系:(www.xing528.com)
(1)跟踪者进程和被跟踪者进程之间存在纵向亲缘关系,跟踪者进程是被跟踪者进程的父进程、祖父进程……
(2)被跟踪者进程曾经通过系统调用prctl的选项PR_SET_PTRACER,声明愿意被某个(跟踪者)进程跟踪。
(3)跟踪者进程具备CAP_SYS_PTRACE能力。
Yama在系统调用prctl中增加了一个选项:PR_SET_PTRACER,通过它,进程可以明确向内核注册自己可以被哪个进程跟踪。举个例子:
这个例子意思是:进程可以被系统中pid为1972的进程跟踪。如果传入的进程号是0,表示进程不愿被任何进程跟踪(有纵向亲缘关系的除外),如果传入的进程号是-1,表示愿意被任何进程跟踪。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。