新しいライブラリをインストールする前にライブラリを使用している場合rm
、システムは i ノードを割り当て、ファイルを開き、プログラムを実行したままにしていると思います。(そして、プログラムが最終的に終了すると、ほとんど隠されているが、まだそこにあるファイル リソースが解放されます。)
更新:わかりました、明確化後。MAP_COPY
動的リンカは、フラグが利用可能な場合は に渡すことで、実際にはこの問題を完全に「解決」しmmap(2)
ます。ただし、MAP_COPY
Linux には存在せず、今後予定されている機能ではありません。2番目に良いのはMAP_DENYWRITE
、ローダーが使用していると私が信じているものであり、Linux APIにあり、Linuxが使用していたものです。領域がマップされている間は、書き込みでエラーが発生します。それでもrmとreplaceを許可する必要があります。ここでの問題は、ファイルへの読み取りアクセス権を持つ人なら誰でもファイルをマップして書き込みをブロックできることです。これにより、ローカルの DoS ホールが開かれます。(考えてみてください/etc/utmp
。実行許可ビットを使用してこれを修正するという提案があります。)
これは気に入らないでしょうが、MAP_DENYWRITE
機能を復元する簡単なカーネル パッチがあります。Linux にはまだ機能がありmmap(2)
ます。アーキテクチャごとに複製されたコードでパッチを適用する必要があります.ia32の場合、ファイルはarch/x86/ia32/sys_ia32.c
.
asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff)
{
struct mm_struct *mm = current->mm;
unsigned long error;
struct file *file = NULL;
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); // fix this line to not clear MAP_DENYWRITE
資格情報を持つ悪意のあるローカル ユーザーがいない限り、これは問題ありません。これはリモート DoS ではなく、単なるローカル DoS です。