cmd/fsu: allow switch from fpkg
Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
56539d8db5
commit
45ad788c6d
@ -13,7 +13,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
compPoison = "INVALIDINVALIDINVALIDINVALIDINVALID"
|
|
||||||
fsuConfFile = "/etc/fsurc"
|
fsuConfFile = "/etc/fsurc"
|
||||||
envShim = "FORTIFY_SHIM"
|
envShim = "FORTIFY_SHIM"
|
||||||
envAID = "FORTIFY_APP_ID"
|
envAID = "FORTIFY_APP_ID"
|
||||||
@ -22,10 +21,6 @@ const (
|
|||||||
PR_SET_NO_NEW_PRIVS = 0x26
|
PR_SET_NO_NEW_PRIVS = 0x26
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
Fmain = compPoison
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(0)
|
log.SetFlags(0)
|
||||||
log.SetPrefix("fsu: ")
|
log.SetPrefix("fsu: ")
|
||||||
@ -40,20 +35,16 @@ func main() {
|
|||||||
log.Fatal("this program must not be started by root")
|
log.Fatal("this program must not be started by root")
|
||||||
}
|
}
|
||||||
|
|
||||||
var fmain string
|
var toolPath string
|
||||||
if p, ok := checkPath(Fmain); !ok {
|
|
||||||
log.Fatal("invalid fortify path, this copy of fsu is not compiled correctly")
|
|
||||||
} else {
|
|
||||||
fmain = p
|
|
||||||
}
|
|
||||||
|
|
||||||
pexe := path.Join("/proc", strconv.Itoa(os.Getppid()), "exe")
|
pexe := path.Join("/proc", strconv.Itoa(os.Getppid()), "exe")
|
||||||
if p, err := os.Readlink(pexe); err != nil {
|
if p, err := os.Readlink(pexe); err != nil {
|
||||||
log.Fatalf("cannot read parent executable path: %v", err)
|
log.Fatalf("cannot read parent executable path: %v", err)
|
||||||
} else if strings.HasSuffix(p, " (deleted)") {
|
} else if strings.HasSuffix(p, " (deleted)") {
|
||||||
log.Fatal("fortify executable has been deleted")
|
log.Fatal("fortify executable has been deleted")
|
||||||
} else if p != fmain {
|
} else if p != mustCheckPath(fmain) && p != mustCheckPath(fpkg) {
|
||||||
log.Fatal("this program must be started by fortify")
|
log.Fatal("this program must be started by fortify")
|
||||||
|
} else {
|
||||||
|
toolPath = p
|
||||||
}
|
}
|
||||||
|
|
||||||
// uid = 1000000 +
|
// uid = 1000000 +
|
||||||
@ -147,13 +138,9 @@ func main() {
|
|||||||
if _, _, errno := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, PR_SET_NO_NEW_PRIVS, 1, 0); errno != 0 {
|
if _, _, errno := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, PR_SET_NO_NEW_PRIVS, 1, 0); errno != 0 {
|
||||||
log.Fatalf("cannot set no_new_privs flag: %s", errno.Error())
|
log.Fatalf("cannot set no_new_privs flag: %s", errno.Error())
|
||||||
}
|
}
|
||||||
if err := syscall.Exec(fmain, []string{"fortify", "shim"}, []string{envShim + "=" + shimSetupFd}); err != nil {
|
if err := syscall.Exec(toolPath, []string{"fortify", "shim"}, []string{envShim + "=" + shimSetupFd}); err != nil {
|
||||||
log.Fatalf("cannot start shim: %v", err)
|
log.Fatalf("cannot start shim: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
panic("unreachable")
|
panic("unreachable")
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkPath(p string) (string, bool) {
|
|
||||||
return p, p != compPoison && p != "" && path.IsAbs(p)
|
|
||||||
}
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
lib,
|
||||||
buildGoModule,
|
buildGoModule,
|
||||||
fortify ? abort "fortify package required",
|
fortify ? abort "fortify package required",
|
||||||
}:
|
}:
|
||||||
@ -15,5 +16,15 @@ buildGoModule {
|
|||||||
go mod init fsu >& /dev/null
|
go mod init fsu >& /dev/null
|
||||||
'';
|
'';
|
||||||
|
|
||||||
ldflags = [ "-X main.Fmain=${fortify}/libexec/fortify" ];
|
ldflags =
|
||||||
|
lib.attrsets.foldlAttrs
|
||||||
|
(
|
||||||
|
ldflags: name: value:
|
||||||
|
ldflags ++ [ "-X main.${name}=${value}" ]
|
||||||
|
)
|
||||||
|
[ "-s -w" ]
|
||||||
|
{
|
||||||
|
fmain = "${fortify}/libexec/fortify";
|
||||||
|
fpkg = "${fortify}/libexec/fpkg";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
21
cmd/fsu/path.go
Normal file
21
cmd/fsu/path.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"path"
|
||||||
|
)
|
||||||
|
|
||||||
|
const compPoison = "INVALIDINVALIDINVALIDINVALIDINVALID"
|
||||||
|
|
||||||
|
var (
|
||||||
|
fmain = compPoison
|
||||||
|
fpkg = compPoison
|
||||||
|
)
|
||||||
|
|
||||||
|
func mustCheckPath(p string) string {
|
||||||
|
if p != compPoison && p != "" && path.IsAbs(p) {
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
log.Fatal("this program is compiled incorrectly")
|
||||||
|
return compPoison
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user