Docker中/tmp目录执行二进制文件遇Permission denied的安全解决咨询
解决Docker中编译执行C++程序的权限问题
问题根源
出现fork/exec /tmp/a.out: permission denied的原因是默认tmpfs挂载启用了noexec选项,禁止在/tmp目录下执行二进制文件,而你的容器采用只读根文件系统,只能通过/tmp目录操作文件。
安全合规的解决方案
1. 调整tmpfs挂载参数
修改docker-compose.yml中的tmpfs配置,添加exec选项允许/tmp下执行文件,同时保留原有安全限制:
version: "3.9" services: gpp: build: . environment: - token=test_token - code=#include <iostream>\r\n\r\nusing namespace std;\r\n\r\nint main() {\r\n int a = 10;\r\n int b = 20;\r\n cout << a << " " << b << endl;\r\n int temp = a;\r\n a = b;\r\n b = temp;\r\n cout << a << " " << b << endl;\r\n return 0;\r\n} network_mode: bridge privileged: false read_only: true tmpfs: - /tmp:exec,mode=1777 security_opt: - "no-new-privileges" cap_drop: - "all"
exec:开启/tmp目录的执行权限,允许运行编译后的二进制文件mode=1777:保持/tmp目录的默认权限,确保编译程序能正常读写
2. 额外安全加固措施
- 保留
cap_drop: all:移除所有不必要的内核能力,限制程序可执行的系统操作 - 保留
security_opt: no-new-privileges:阻止程序通过setuid/setgid等方式提升权限 - 优化worker程序:严格校验输入的C++代码,限制代码长度、禁用危险系统调用(如
system()、fork()),降低恶意代码风险
验证效果
重新构建并启动容器后,worker即可正常完成C++代码的编译与执行,不会再触发权限拒绝错误。
内容的提问来源于stack exchange,提问作者50_Seconds _Of_Coding
相关产品推荐
相关产品推荐

