我有一个 zip 文件,其中包含应在 Linux 上运行的某个应用程序的大量文件和目录。有些文件需要设置为可执行文件,但 zip 文件格式显然不保留执行权限。
我需要在提取存档后手动设置文件的执行权,(我正在处理)我的问题是:
如果我不知道哪些文件需要可执行,是否可以递归地将执行权限添加到整个目录?它会带来任何安全风险吗?有人知道它可能导致任何其他问题吗?
答案1
它并不漂亮或优雅,但是将可执行位添加到操作系统知道如何处理的任何类型的可执行文件中并没有害处 - 如果您尝试,您可能会得到cannot execute binary file
一个潜在的风险是文本文件,如果不知何故前几个单词在 shell 中被证明是有效的命令,但这很难预测(如果不太可能的话)。
我个人会谨慎行事,让所有内容都不可执行,然后编写一个快速脚本,使用命令对所有文件进行排序file
,如果它被识别为脚本或 ELF 二进制文件,则翻转可执行位 - 留下确切的代码作为读者的练习。
答案2
简单的答案 - 是的,它可能会带来安全风险 - 但这些完全取决于所涉及的文件和目录的特定访问控制要求。
最好的办法是询问应用程序所有者/开发人员等是否有任何文件或目录需要强制执行权限,以及是否有任何文件或目录需要设置为可执行。这应该是他们的决定,而不是你的决定,所以如果你不知道申请要求,我会避免承担责任!
很可能数量很少,因此它成为一个简单的过程。青年MMV
答案3
使文件可执行不存在任何直接的安全风险,除非它是 setuid 或 setgid。当然,存在间接风险,即您期望惰性的东西(您通常在应用程序中打开的某些数据文件)也可以直接在您的系统上执行,从而产生邪恶的后果。例如,如果您有一个名为 README 的文件,它实际上包含 rootkit 程序,那么在文本编辑器中打开它是安全的,但您最好不要执行它。
识别可执行文件的合理启发法是查看它们的前几个字节并识别可执行签名。这是一个方便性问题,而不是安全性问题,但如果您愿意使所有文件都可执行,则意味着您没有安全性问题,但无论如何都有可用性问题。这是一个可能的启发式:
for x in *; do
case $(file - <"$x") in
*executable*) chmod +x -- "$x";;
esac
done
这是另一个启发式方法,仅在极端情况下有所不同($'\177'
是 ksh/bash/zsh 语法,在其他 shell 中将其替换为文字字符 0177 = 127 = 0x7f)。
for x in *; do
case $(head -c 4 <"$x") in
'#!'*|$'\177'ELF) chmod +x -- "$x";;
esac
done
在这两种情况下,仅仅因为文件被识别为可执行文件并不意味着您可以在系统上执行它;例如,错误处理器架构的二进制文件将很高兴地成为可执行文件。这是一种不同的方法,它使所有脚本都可执行,但只有当它们适用于正确的体系结构并且您拥有所需的库时才动态链接的二进制文件,并且完全忽略静态链接的二进制文件。
for x in *; do
case $(head -c 2 <"$x") in
'#!') chmod +x -- "$x";;
*) if ldd -- "$x" >/dev/null 2>/dev/null; then chmod +x "$x"; fi;;
esac
done