GDB可以在没有su权限的情况下附加到任何进程这一事实令我感到恐惧。例如,阻止我编写使用GDB使用相同系统调用的恶意软件/病毒(/无论正确的术语是什么)来附加到任何进程,发送中断,即时更改指令,在分支指令中添加断点以更改ZF等。

使用此功能,您显然可以做很多有害的事情。例如,我正在使用一些GDB Python脚本进行一些小技巧,但是我看不出是什么阻止了我编写一些严重危险/恶意的东西。

所以我有一些与之相关的问题这是怎么可能的,又是如何安全的呢?

(我假设是操作系统允许进程以某种方式将中断发送给其他中断,并访问其地址空间并更改记忆。如果我记错了,请纠正我)

1)什么使它安全?是什么使我无法编写程序来更改系统中运行的每个进程的行为?

2)涉及哪些系统调用?操作系统如何使我能够访问其他进程的地址空间,而又不占用我自己的地址空间。 (例如,GDB拥有自己的地址空间,但它也可以读取附加进程的地址空间)

3)在我的用户级程序中,是否可以检测到这种“附加”?就像,如果我的程序附加了另一个进程,我可以打印一条消息并终止吗?

(我将“附加”用作“开始写入/读取地址空间”)

。谢谢。

评论

“ GDB可以在没有su权限的情况下附加到任何进程” –事实并非如此;请参见gdb可以调试suid根程序吗?

#1 楼

2)系统调用是ptrace。该调用具有许多功能,包括“将示踪剂的内存的一部分复制到我的地址空间中的本地缓冲区中”和相反的“将我的缓冲区复制到示踪剂的内存中”。这些与Windows的ReadProcessMemoryWriteProcessMemory非常相似。跟踪程序需要使用它们来访问被跟踪程序中的内存。

1)事实上,除非您具有root访问权限,否则您实际上无法附加到不是您自己的进程上,或(在Linux上)CAP_SYS_PTRACE功能。在某些较新的Linux中,取决于ptrace的设置以及所跟踪的进程是否是跟踪进程的“大子级”,您甚至没有权限使用自己的所有进程。维基百科页面对此进行了更详细的说明。

3)不,您不能。至少不可靠。跟踪器可能会拦截您要使用的任何技巧。同样,您通常也不想这样做,因为您需要yama来调试程序,并且只要拥有ptrace的权利,您都可以通过其他各种方式来解决问题。但是,一个进程一次最多只能连接一个跟踪器,因此您可以拥有一个主进程,该主进程生成并运行该工作程序,因此没有其他人可以附加到该工作程序上以对其进行跟踪。当然,worker仍然需要一种方法来检查其父项是否还活着(例如,将ptrace与1进行比较),并且示踪剂不会拦截您的ptrace调用并将其打补丁以返回旧的父级id。