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


78

我做错了(或没有做过)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.

46
在docker容器中运行时,出现此错误,直到将其添加--security-opt seccomp=unconfined到中docker run
卡梅隆·塔加特

@CameronTaggart感谢您的提示!你让我今天一整天都感觉很好。
gaijin

@CameronTaggart,它对我有用,但是安全问题来了

Answers:


139

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

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined

5
谢谢你-我不知道有多少时间我很难用这种方法学习!
VorpalSword

2
我认为--cap-add=SYS_PTRACE只有在附加gdb到已经运行的进程时才需要。
炎热

您能使用这些选项提供涉及的安全性问题吗?
拉吉斯卡

2
有没有办法将此命令应用于已经运行的实例?因为我不想删除该实例并启动一个新实例
sh.3.ll

18

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

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

为了使用户获得禁用ASLR所需的权限,它可能归结为对拥有写权限/proc/sys/kernel/randomize_va_space在这里阅读更多。


12

基于wisbucky的答案(谢谢!),这里是Docker compose的相同设置:

security_opt:
  - seccomp:unconfined
cap_add:
  - SYS_PTRACE

安全选项seccomp:unconfined修复了address space randomization警告。

即使Docker文档指出SYS_PTRACE是“默认情况下未授予”的功能,但功能SYS_PTRACE似乎并未产生明显的影响。也许我不知道要寻找什么。


1
您有错字,这是不确定的,不是不确定的
Marc43
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.