Skip to content

Commit

Permalink
selinux.Chcon should check legal rather then just label.Relabel
Browse files Browse the repository at this point in the history
Since label.Relabel ends up calling into selinux.chcon, we should
do the check for invalid directories under chcon. This will allow
the selinux.Chcon function to also be verified.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
  • Loading branch information
rhatdan committed Sep 26, 2022
1 parent 00d547f commit db3eeba
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 46 deletions.
46 changes: 0 additions & 46 deletions go-selinux/label/label_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package label
import (
"errors"
"fmt"
"os"
"os/user"
"strings"

"github.com/opencontainers/selinux/go-selinux"
Expand Down Expand Up @@ -113,50 +111,6 @@ func Relabel(path string, fileLabel string, shared bool) error {
return nil
}

exclude_paths := map[string]bool{
"/": true,
"/bin": true,
"/boot": true,
"/dev": true,
"/etc": true,
"/etc/passwd": true,
"/etc/pki": true,
"/etc/shadow": true,
"/home": true,
"/lib": true,
"/lib64": true,
"/media": true,
"/opt": true,
"/proc": true,
"/root": true,
"/run": true,
"/sbin": true,
"/srv": true,
"/sys": true,
"/tmp": true,
"/usr": true,
"/var": true,
"/var/lib": true,
"/var/log": true,
}

if home := os.Getenv("HOME"); home != "" {
exclude_paths[home] = true
}

if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" {
if usr, err := user.Lookup(sudoUser); err == nil {
exclude_paths[usr.HomeDir] = true
}
}

if path != "/" {
path = strings.TrimSuffix(path, "/")
}
if exclude_paths[path] {
return fmt.Errorf("SELinux relabeling of %s is not allowed", path)
}

if shared {
c, err := selinux.NewContext(fileLabel)
if err != nil {
Expand Down
45 changes: 45 additions & 0 deletions go-selinux/selinux_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"io/ioutil"
"math/big"
"os"
"os/user"
"path"
"path/filepath"
"strconv"
Expand Down Expand Up @@ -1083,6 +1084,50 @@ func chcon(fpath string, label string, recurse bool) error {
return nil
}

exclude_paths := map[string]bool{
"/": true,
"/bin": true,
"/boot": true,
"/dev": true,
"/etc": true,
"/etc/passwd": true,
"/etc/pki": true,
"/etc/shadow": true,
"/home": true,
"/lib": true,
"/lib64": true,
"/media": true,
"/opt": true,
"/proc": true,
"/root": true,
"/run": true,
"/sbin": true,
"/srv": true,
"/sys": true,
"/tmp": true,
"/usr": true,
"/var": true,
"/var/lib": true,
"/var/log": true,
}

if home := os.Getenv("HOME"); home != "" {
exclude_paths[home] = true
}

if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" {
if usr, err := user.Lookup(sudoUser); err == nil {
exclude_paths[usr.HomeDir] = true
}
}

if fpath != "/" {
fpath = strings.TrimSuffix(fpath, "/")
}
if exclude_paths[fpath] {
return fmt.Errorf("SELinux relabeling of %s is not allowed", fpath)
}

if !recurse {
return setFileLabel(fpath, label)
}
Expand Down

0 comments on commit db3eeba

Please sign in to comment.