C 警告:禁用地址空间随机化时出错:不允许操作

C 警告:禁用地址空间随机化时出错:不允许操作,c,docker,gdb,C,Docker,Gdb,我做错了什么(或没有做错什么)导致gdb不能正常工作 root@6be3d60ab7c6:/# cat minimal.c int main() { int i = 1337; return 0; } root@6be3d60ab7c6:/# gcc -g minimal.c -o minimal root@6be3d60ab7c6:/# gdb minimal GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 . . . Reading sy

我做错了什么(或没有做错什么)导致
gdb
不能正常工作

root@6be3d60ab7c6:/# cat minimal.c 
int main()
{
  int i = 1337;
  return 0;
}
root@6be3d60ab7c6:/# gcc -g minimal.c -o minimal
root@6be3d60ab7c6:/# gdb minimal
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
.
.
.
Reading symbols from minimal...done.
(gdb) break main
Breakpoint 1 at 0x4004f1: file minimal.c, line 3.
(gdb) run
Starting program: /minimal 
warning: Error disabling address space randomization: Operation not permitted
During startup program exited normally.
(gdb) 
(gdb) print i   
No symbol "i" in current context.

无论出于何种原因,您的用户帐户都无权为此进程禁用内核的地址空间布局随机化。默认情况下,gdb会关闭此功能,因为它使某些类型的调试更容易(特别是,它意味着每次运行程序时堆栈对象的地址都是相同的)。阅读更多

您可以通过禁用gdb的此功能来解决此问题,方法是使用
set disable randomization off


至于让您的用户获得禁用ASLR所需的权限,这可能归结为拥有对
/proc/sys/kernel/randomize\u va_space
的写入权限。阅读更多信息。

如果您使用Docker,您可能需要
--security opt seccomp=unconfined
选项(以及启用ptrace):

在此基础上(谢谢!),以下是Docker compose的相同设置:

security_opt:
  - seccomp:unconfined
cap_add:
  - SYS_PTRACE
安全选项
seccomp:unconfined
修复了
地址空间随机化
警告


能力SYS_PTRACE似乎没有产生明显的效果,尽管它表示SYS_PTRACE是一种“默认情况下未授予”的能力。也许我不知道该寻找什么。

在docker容器中运行时,我遇到了这个错误,直到我将
--security opt seccomp=unconfined
添加到
docker run
@camerontagart感谢您的提示!你成就了我的一天。@CameronTaggart这对我来说很好,但安全问题却恰恰是这个原因——我不知道我花了多少时间在艰苦的学习中!我认为,
--cap add=SYS\u PTRACE
仅在将
gdb
附加到已运行的进程时才需要。您能否提供使用这些选项可能涉及的安全问题?是否有方法将此命令应用于已运行的实例?因为我不想删除这个实例并开始一个新的实例。如果您有输入错误,它是未确认的
security_opt:
  - seccomp:unconfined
cap_add:
  - SYS_PTRACE