summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fs
diff options
context:
space:
mode:
authorAndrei Vagin <avagin@google.com>2019-04-04 17:42:51 -0700
committerShentubot <shentubot@google.com>2019-04-04 17:43:53 -0700
commit88409e983c463b6d9c8085e7fdbe7ff45b3c5184 (patch)
treef5ba3e9b1c67a7641a8d4d7c4106bd5bc5c2dcf1 /pkg/sentry/fs
parent75a5ccf5d98876c26305da0feff20e4a148027ec (diff)
gvisor: Add support for the MS_NOEXEC mount option
https://github.com/google/gvisor/issues/145 PiperOrigin-RevId: 242044115 Change-Id: I8f140fe05e32ecd438b6be218e224e4b7fe05878
Diffstat (limited to 'pkg/sentry/fs')
-rw-r--r--pkg/sentry/fs/context.go5
-rw-r--r--pkg/sentry/fs/filesystems.go4
-rw-r--r--pkg/sentry/fs/proc/mounts.go3
3 files changed, 12 insertions, 0 deletions
diff --git a/pkg/sentry/fs/context.go b/pkg/sentry/fs/context.go
index 1775d3486..c0e6075e4 100644
--- a/pkg/sentry/fs/context.go
+++ b/pkg/sentry/fs/context.go
@@ -46,6 +46,11 @@ func ContextCanAccessFile(ctx context.Context, inode *Inode, reqPerms PermMask)
p = uattr.Perms.Group
}
+ // Do not allow programs to be executed if MS_NOEXEC is set.
+ if IsFile(inode.StableAttr) && reqPerms.Execute && inode.MountSource.Flags.NoExec {
+ return false
+ }
+
// Are permissions satisfied without capability checks?
if p.SupersetOf(reqPerms) {
return true
diff --git a/pkg/sentry/fs/filesystems.go b/pkg/sentry/fs/filesystems.go
index aa664b973..a6b27c402 100644
--- a/pkg/sentry/fs/filesystems.go
+++ b/pkg/sentry/fs/filesystems.go
@@ -140,6 +140,10 @@ type MountSourceFlags struct {
// cache, even when the platform supports direct mapped I/O. This
// doesn't correspond to any Linux mount options.
ForcePageCache bool
+
+ // NoExec corresponds to mount(2)'s "MS_NOEXEC" and indicates that
+ // binaries from this file system can't be executed.
+ NoExec bool
}
// GenericMountSourceOptions splits a string containing comma separated tokens of the
diff --git a/pkg/sentry/fs/proc/mounts.go b/pkg/sentry/fs/proc/mounts.go
index 7111e5c0f..1e62af8c6 100644
--- a/pkg/sentry/fs/proc/mounts.go
+++ b/pkg/sentry/fs/proc/mounts.go
@@ -129,6 +129,9 @@ func (mif *mountInfoFile) ReadSeqFileData(ctx context.Context, handle seqfile.Se
if m.Flags.NoAtime {
opts += ",noatime"
}
+ if m.Flags.NoExec {
+ opts += ",noexec"
+ }
fmt.Fprintf(&buf, "%s ", opts)
// (7) Optional fields: zero or more fields of the form "tag[:value]".