1

私のプログラムは、ユーザーが指定したディレクトリに書き込まれたバイナリに対して exec() を呼び出します。ディレクトリが「noexec」でマウントされたツリーにある場合、exec() は EACCES で失敗します。

exec() に失敗する代わりに、ディレクトリが noexec でマウントされているかどうかを確認できるようにしたいのですが、fcntl()、stat()、または mount() のいずれもこの情報を返しません (マンページの読み取りから)。exec システム コールのカーネル ソースを見ると、この情報は inode のメタデータに格納されているように見えますが、この情報がどのシステム コールからも返されていません。

 673     struct nameidata nd;
 (..)
 677     err = path_lookup_open(AT_FDCWD, name, LOOKUP_FOLLOW, &nd, FMODE_READ|FMODE_EXEC);
 678     file = ERR_PTR(err);
 (..)
 682         file = ERR_PTR(-EACCES);
 683         if (!(nd.mnt->mnt_flags & MNT_NOEXEC) &&
 684             S_ISREG(inode->i_mode)) {

これを行う方法を知っている人はいますか?

ありがとう。

4

2 に答える 2

2

statvfs ()を使用できます

struct statvfs st;
inr rc = statvfs("/mnt/foo", &st);
if (rc == -1)
   error();
if (st.f_flag & ST_NOEXEC) {
 //no exec flags was set
}
于 2013-03-29T21:16:24.410 に答える
0

おそらくstatfs(2)realpath(3)/proc/mountsを使用して、プログラムバイナリが存在するファイルシステムを読んで判断することを検討しましたか?

しかし、さまざまな理由で失敗する可能性があるexecve(2)および関連する関数の失敗に常に注意を払い、処理する必要があります。exec

失敗する可能性のある多くの方法がありexecve、そのうちのいくつかは簡単に再現できません。forkまたはその他のシステムコールの失敗についても同様です。

私はそのままにしてエラーを報告しEACCESSます(のexecve)、または、マウントオプションを確実にキャッチして説明したい場合は、そのような 失敗の後noexecにより複雑なこと(statfsおよび/またはおよびまたはrealpathのスキャン)を行います。/proc/mounts/proc/self/mountsEACCESS

execve-ing する前にバイナリ パスをテストしてもあまり意味がありません。後でエラーを報告してください。

于 2013-03-29T20:51:26.417 に答える