Linuxで実行する必要がある特定のアプリケーション用の複数のファイルとディレクトリを含むzipファイルがあります。一部のファイルは実行可能である必要がありますが、zipファイル形式は明らかに実行権限を保持しません。
アーカイブを抽出した後、ファイルの実行権限を手動で設定する必要があります。 (作業中です。) 気になる点は次のとおりです。
実行可能なファイルが何であるかわからない場合は、ディレクトリ全体に実行権限を繰り返し追加できますか?セキュリティリスクはありますか?これによって発生する可能性がある他の問題を知っている人はいますか?
答え1
きれいでもエレガントでもありませんが、オペレーティングシステムの処理方法を知っているすべての種類の実行可能ファイルに実行ビットを追加しても害はありません。cannot execute binary file
1つの潜在的なリスクは、最初の数語がシェルで有効なコマンドであることが判明した場合、テキストファイルにありますが、これは予測するのが難しい(可能性が低い場合でも)。
私は個人的に間違いを犯してすべてを実行不可能にし、コマンドを使用してすべてのファイルをソートし、スクリプトまたはfile
ELFバイナリとして認識されたら実行可能ビットを反転するクイックスクリプトを作成します。正確なコードは練習問題のままです。読者。
答え2
答えは簡単です。はい、セキュリティリスクを引き起こす可能性があります。ただし、これらはすべて、関連するファイルとディレクトリの特定のアクセス制御要件によって異なります。
最善の方法は、強制権限を必要とするファイルやディレクトリがあるか、実行可能にする必要があるファイルやディレクトリがあるかどうかをアプリケーションの所有者/開発者に問い合わせることです。それはあなたではなく彼らの決定でなければなりません。したがって、あなたがサポート要件を知らなかった場合、私は責任を回避します!
おそらく量が少なく、プロセスは簡単です。青少年MMV
答え3
setuid または setgid 以外のファイルを実行可能にするための直接的なセキュリティリスクはありません。もちろん、非アクティブであると予想されるもの(通常はアプリケーションによって開かれたデータファイルの一部)がシステムで直接実行され、悪意のある結果につながる可能性がある間接的なリスクがあります。たとえば、実際にルートキットプログラムを含むREADMEというファイルがある場合は、テキストエディタで開くのは安全ですが、実行しない方が良いでしょう。
実行可能ファイルを識別するための合理的な経験的方法は、最初の数バイトを見て実行可能ファイル署名を識別することです。これはセキュリティ上の問題ではなく、利便性の問題ですが、すべてのファイルを実行可能にしたい場合は、セキュリティ上の問題はありませんが、とにかくユーザビリティの問題があることを意味します。考えられる経験的な方法は次のとおりです。
for x in *; do
case $(file - <"$x") in
*executable*) chmod +x -- "$x";;
esac
done
これは極端な場合にのみ異なる経験的な方法です($'\177'
ksh / bash / zsh構文であり、他のシェルではこれをリテラル文字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