2024-03-21 23:07:41 +01:00
|
|
|
// apparmor.d - Full set of apparmor profiles
|
|
|
|
// Copyright (C) 2021-2024 Alexandre Pujol <alexandre@pujol.io>
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
|
|
|
package directive
|
|
|
|
|
|
|
|
import (
|
2024-04-12 21:07:05 +02:00
|
|
|
"slices"
|
2024-03-21 23:07:41 +01:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/roddhjav/apparmor.d/pkg/aa"
|
2024-03-25 23:40:25 +01:00
|
|
|
"github.com/roddhjav/apparmor.d/pkg/prebuild/cfg"
|
2024-04-02 18:48:03 +02:00
|
|
|
"github.com/roddhjav/apparmor.d/pkg/util"
|
2024-03-21 23:07:41 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type Exec struct {
|
2024-03-25 23:40:25 +01:00
|
|
|
cfg.Base
|
2024-03-21 23:07:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2024-03-25 23:40:25 +01:00
|
|
|
RegisterDirective(&Exec{
|
|
|
|
Base: cfg.Base{
|
|
|
|
Keyword: "exec",
|
|
|
|
Msg: "Exec directive applied",
|
2024-04-02 18:48:03 +02:00
|
|
|
Help: Keyword + `exec [P|U|p|u|PU|pu|] profiles...`,
|
2024-03-21 23:07:41 +01:00
|
|
|
},
|
2024-03-25 23:40:25 +01:00
|
|
|
})
|
2024-03-21 23:07:41 +01:00
|
|
|
}
|
|
|
|
|
2024-04-15 15:09:04 +02:00
|
|
|
func (d Exec) Apply(opt *Option, profileRaw string) string {
|
2024-03-21 23:07:41 +01:00
|
|
|
transition := "Px"
|
2024-03-22 20:47:45 +01:00
|
|
|
transitions := []string{"P", "U", "p", "u", "PU", "pu"}
|
2024-03-23 18:41:10 +01:00
|
|
|
t := opt.ArgList[0]
|
|
|
|
if slices.Contains(transitions, t) {
|
|
|
|
transition = t + "x"
|
|
|
|
delete(opt.ArgMap, t)
|
2024-03-22 20:47:45 +01:00
|
|
|
}
|
|
|
|
|
2024-04-15 15:09:04 +02:00
|
|
|
profile := &aa.AppArmorProfile{}
|
|
|
|
p := profile.GetDefaultProfile()
|
2024-03-23 18:41:10 +01:00
|
|
|
for name := range opt.ArgMap {
|
2024-04-02 18:48:03 +02:00
|
|
|
profiletoTransition := util.MustReadFile(cfg.RootApparmord.Join(name))
|
2024-03-22 20:47:45 +01:00
|
|
|
dstProfile := aa.DefaultTunables()
|
|
|
|
dstProfile.ParseVariables(profiletoTransition)
|
|
|
|
for _, variable := range dstProfile.Variables {
|
2024-03-21 23:07:41 +01:00
|
|
|
if variable.Name == "exec_path" {
|
2024-03-22 20:47:45 +01:00
|
|
|
for _, v := range variable.Values {
|
|
|
|
p.Rules = append(p.Rules, &aa.File{
|
|
|
|
Path: v,
|
|
|
|
Access: transition,
|
|
|
|
})
|
2024-03-21 23:07:41 +01:00
|
|
|
}
|
2024-03-22 20:47:45 +01:00
|
|
|
break
|
2024-03-21 23:07:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-04-15 15:09:04 +02:00
|
|
|
profile.Sort()
|
|
|
|
rules := profile.String()
|
2024-03-22 21:56:04 +01:00
|
|
|
lenRules := len(rules)
|
|
|
|
rules = rules[:lenRules-1]
|
2024-04-15 15:09:04 +02:00
|
|
|
return strings.Replace(profileRaw, opt.Raw, rules, -1)
|
2024-03-21 23:07:41 +01:00
|
|
|
}
|