2024-10-13 02:43:00 +09:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
|
|
|
"path"
|
2024-10-15 02:15:55 +09:00
|
|
|
|
2024-12-20 00:20:02 +09:00
|
|
|
"git.gensokyo.uk/security/fortify/acl"
|
|
|
|
"git.gensokyo.uk/security/fortify/internal/linux"
|
|
|
|
"git.gensokyo.uk/security/fortify/internal/system"
|
2024-10-13 02:43:00 +09:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
shell = "SHELL"
|
|
|
|
)
|
|
|
|
|
|
|
|
// shareSystem queues various system-related actions
|
|
|
|
func (seal *appSeal) shareSystem() {
|
2024-10-18 01:21:58 +09:00
|
|
|
// ensure Share (e.g. `/tmp/fortify.%d`)
|
|
|
|
// acl is unnecessary as this directory is world executable
|
2024-11-16 21:19:45 +09:00
|
|
|
seal.sys.Ensure(seal.SharePath, 0711)
|
2024-10-18 01:21:58 +09:00
|
|
|
|
|
|
|
// ensure process-specific share (e.g. `/tmp/fortify.%d/%s`)
|
|
|
|
// acl is unnecessary as this directory is world executable
|
2024-10-20 00:07:48 +09:00
|
|
|
seal.share = path.Join(seal.SharePath, seal.id)
|
2024-11-16 21:19:45 +09:00
|
|
|
seal.sys.Ephemeral(system.Process, seal.share, 0711)
|
2024-10-18 01:21:58 +09:00
|
|
|
|
|
|
|
// ensure child tmpdir parent directory (e.g. `/tmp/fortify.%d/tmpdir`)
|
|
|
|
targetTmpdirParent := path.Join(seal.SharePath, "tmpdir")
|
|
|
|
seal.sys.Ensure(targetTmpdirParent, 0700)
|
|
|
|
seal.sys.UpdatePermType(system.User, targetTmpdirParent, acl.Execute)
|
|
|
|
|
|
|
|
// ensure child tmpdir (e.g. `/tmp/fortify.%d/tmpdir/%d`)
|
2024-11-16 21:19:45 +09:00
|
|
|
targetTmpdir := path.Join(targetTmpdirParent, seal.sys.user.as)
|
2024-10-18 01:21:58 +09:00
|
|
|
seal.sys.Ensure(targetTmpdir, 01700)
|
|
|
|
seal.sys.UpdatePermType(system.User, targetTmpdir, acl.Read, acl.Write, acl.Execute)
|
|
|
|
seal.sys.bwrap.Bind(targetTmpdir, "/tmp", false, true)
|
|
|
|
|
|
|
|
// mount tmpfs on inner shared directory (e.g. `/tmp/fortify.%d`)
|
|
|
|
seal.sys.bwrap.Tmpfs(seal.SharePath, 1*1024*1024)
|
|
|
|
}
|
|
|
|
|
2024-11-02 03:03:44 +09:00
|
|
|
func (seal *appSeal) sharePasswd(os linux.System) {
|
2024-10-13 02:43:00 +09:00
|
|
|
// look up shell
|
|
|
|
sh := "/bin/sh"
|
|
|
|
if s, ok := os.LookupEnv(shell); ok {
|
2024-10-16 01:38:59 +09:00
|
|
|
seal.sys.bwrap.SetEnv[shell] = s
|
2024-10-13 02:43:00 +09:00
|
|
|
sh = s
|
|
|
|
}
|
|
|
|
|
|
|
|
// generate /etc/passwd
|
|
|
|
passwdPath := path.Join(seal.share, "passwd")
|
|
|
|
username := "chronos"
|
2024-11-16 21:19:45 +09:00
|
|
|
if seal.sys.user.username != "" {
|
|
|
|
username = seal.sys.user.username
|
2024-10-13 02:43:00 +09:00
|
|
|
}
|
|
|
|
homeDir := "/var/empty"
|
2024-11-16 21:19:45 +09:00
|
|
|
if seal.sys.user.home != "" {
|
|
|
|
homeDir = seal.sys.user.home
|
2024-10-13 02:43:00 +09:00
|
|
|
}
|
2024-11-16 21:19:45 +09:00
|
|
|
|
|
|
|
// bind home directory
|
2024-11-18 00:18:21 +09:00
|
|
|
seal.sys.bwrap.Bind(seal.sys.user.data, homeDir, false, true)
|
2024-11-16 21:19:45 +09:00
|
|
|
seal.sys.bwrap.Chdir = homeDir
|
|
|
|
|
|
|
|
seal.sys.bwrap.SetEnv["USER"] = username
|
|
|
|
seal.sys.bwrap.SetEnv["HOME"] = homeDir
|
|
|
|
|
2024-11-04 03:15:39 +09:00
|
|
|
passwd := username + ":x:" + seal.sys.mappedIDString + ":" + seal.sys.mappedIDString + ":Fortify:" + homeDir + ":" + sh + "\n"
|
2024-10-16 01:38:59 +09:00
|
|
|
seal.sys.Write(passwdPath, passwd)
|
2024-10-13 02:43:00 +09:00
|
|
|
|
|
|
|
// write /etc/group
|
|
|
|
groupPath := path.Join(seal.share, "group")
|
2024-11-04 03:15:39 +09:00
|
|
|
seal.sys.Write(groupPath, "fortify:x:"+seal.sys.mappedIDString+":\n")
|
2024-10-13 02:43:00 +09:00
|
|
|
|
|
|
|
// bind /etc/passwd and /etc/group
|
2024-10-15 02:15:55 +09:00
|
|
|
seal.sys.bwrap.Bind(passwdPath, "/etc/passwd")
|
|
|
|
seal.sys.bwrap.Bind(groupPath, "/etc/group")
|
|
|
|
}
|