% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
このスニペットは、通常の非特権ユーザーとしてファイルシステムの実行許可を簡単に回避できることを示しています。これをUbuntu 12.04で実行しました。
Linuxローダーはfile(1)によると共有オブジェクトですが、直接実行できるエントリポイントもあります。この方法で実行されると、LinuxローダーはELFバイナリのインタープリターとして機能します。
ただし、私のOpenBSDマシンでは、ローダーをプログラムとして実行できないため、このエクスプロイトは効果的ではありません。OpenBSDのマニュアルページには、「ld.so自体が、カーネルによって最初にロードされる共有オブジェクトです」と書かれています。
これをSolaris 9で試してみると、セグメンテーション違反が発生します。他の場所で何が起こるかわかりません。
したがって、私の質問は次のとおりです。
- なぜ(直接実行)のLinuxローダはないではない ELFバイナリを解釈する前に、ファイルシステム属性をチェック!
- ファイルの実行を許可しないように設計されたメカニズムを実装するのはなぜですか?私は何かを見逃しましたか?
libc
(Archボックスのアップグレードを一度行ったことがあります)を行ったことがある場合は、この小さな癖に感謝するでしょう。