Skip to content

Commit 9e33892

Browse files
Initial commit.
0 parents  commit 9e33892

File tree

3 files changed

+199
-0
lines changed

3 files changed

+199
-0
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*.swp
2+
*.swo
3+
paxrat
4+

paxrat.conf

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"/usr/bin/grub-script-check":"E",
3+
"/usr/bin/grub-bios-setup":"E",
4+
"/usr/sbin/grub-mkdevicemap":"E",
5+
"/usr/sbin/grub-probe":"E",
6+
"/usr/lib/iceweasel/iceweasel":"pm",
7+
"/usr/lib/iceweasel/plugin-container":"m"
8+
}

paxrat.go

+187
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"io/ioutil"
6+
"encoding/json"
7+
"regexp"
8+
"fmt"
9+
"log"
10+
"syscall"
11+
"os"
12+
"os/exec"
13+
)
14+
15+
var configvar string
16+
var daemonvar bool
17+
var flagsvar string
18+
var binaryvar string
19+
type config map[string]string
20+
21+
func init() {
22+
flag.StringVar(&configvar, "c", "/etc/paxrat/paxrat.conf",
23+
"Pax flags configuration file")
24+
flag.BoolVar(&daemonvar, "d", false,
25+
"Run paxrat as a daemon")
26+
flag.StringVar(&flagsvar, "s", "",
27+
"Set PaX flags for a single binary (must also specify binary)")
28+
flag.StringVar(&binaryvar, "b", "",
29+
"Path to a binary for use with set option")
30+
}
31+
32+
func ReadConfig(path string) (data config, err error) {
33+
file, err := ioutil.ReadFile(path)
34+
if err != nil {
35+
log.Fatal(err)
36+
}
37+
err = json.Unmarshal(file, &data)
38+
if err != nil {
39+
log.Fatal(err)
40+
}
41+
return
42+
}
43+
44+
func FileExists(path string) (result bool, err error) {
45+
if _, err := os.Stat(path); err == nil {
46+
result = true
47+
}
48+
return
49+
}
50+
51+
func ValidateFlags(flags string) (err error) {
52+
match, _ := regexp.MatchString("(?i)[^pemrxs]", flags)
53+
if match {
54+
err = fmt.Errorf("Bad characters found in PaX flags: %s",
55+
flags)
56+
}
57+
return
58+
}
59+
60+
func SetWithXattr(path string, flags string) (err error) {
61+
err = syscall.Setxattr(path, "user.pax.flags", []byte(flags), 0)
62+
return
63+
}
64+
65+
func SetWithPaxctl(path string, flags string) (err error) {
66+
exists, err := FileExists("/sbin/paxctl")
67+
if !exists {
68+
fmt.Printf(
69+
"/sbin/paxctl does not exist, cannot set '%s' PaX flags on %s.\n",
70+
flags, path)
71+
return
72+
}
73+
flagsFmt := fmt.Sprintf("-%s", flags)
74+
args := []string{"-c", flagsFmt, path}
75+
fmt.Println(args)
76+
// TODO: Deal with errors from paxctl
77+
if err = exec.Command("/sbin/paxctl", args...).Run(); err != nil {
78+
fmt.Fprintln(os.Stderr, err)
79+
return
80+
}
81+
return
82+
}
83+
84+
func SetFlags(path string, flags string) (err error) {
85+
exists, err := FileExists(path)
86+
if !exists {
87+
fmt.Printf("%s does not exist, cannot set PaX flags: %s\n",
88+
path, flags)
89+
return
90+
}
91+
err = ValidateFlags(flags)
92+
if err != nil {
93+
return
94+
}
95+
supported, err := IsXattrSupported("/bin/ls")
96+
if err != nil {
97+
return
98+
}
99+
fmt.Printf("Setting '%s' PaX flags on %s\n", flags, path)
100+
if supported {
101+
err = SetWithXattr(path, flags)
102+
if err != nil {
103+
return
104+
}
105+
} else {
106+
err = SetWithPaxctl(path, flags)
107+
if err != nil {
108+
ListFlags(path)
109+
return
110+
}
111+
}
112+
return
113+
}
114+
115+
func SetFlagsFromConfig(data config) {
116+
for path, flags := range data {
117+
err := SetFlags(path, flags)
118+
if err != nil {
119+
fmt.Println(err)
120+
}
121+
}
122+
}
123+
124+
func ListFlags(path string) (err error) {
125+
exists, err := FileExists(path)
126+
if !exists {
127+
fmt.Printf("%s does not exist, cannot check PaX flags.\n",
128+
path)
129+
return
130+
}
131+
supported, err := IsXattrSupported("/bin/ls")
132+
if err != nil {
133+
return
134+
}
135+
if supported {
136+
var flags []byte
137+
sz, err := syscall.Getxattr(path, "user.pax.flags", flags)
138+
if err != nil {
139+
fmt.Println(err)
140+
}
141+
fmt.Println(sz)
142+
fmt.Println(flags)
143+
} else {
144+
args := []string{"-v", path}
145+
fmt.Println(args)
146+
exec.Command("/sbin/paxctl").Run()
147+
fmt.Fprintln(os.Stdout)
148+
out, err := exec.Command("/sbin/paxctl", args...).Output()
149+
if err != nil {
150+
fmt.Println(err)
151+
}
152+
fmt.Printf("%s\n", out)
153+
}
154+
return
155+
}
156+
157+
func IsXattrSupported(path string) (result bool, err error) {
158+
result = true
159+
setXattrErr := syscall.Setxattr(path, "user.test xattr", []byte("test xattr data"), 0)
160+
if setXattrErr != nil {
161+
errno := setXattrErr.(syscall.Errno)
162+
if errno == syscall.EOPNOTSUPP {
163+
fmt.Println("xattr not supported in filesystem.")
164+
result = false
165+
} else {
166+
err = setXattrErr
167+
}
168+
} else {
169+
fmt.Println("xattr is supported in filesystem.")
170+
}
171+
return
172+
}
173+
174+
175+
func main() {
176+
flag.Parse()
177+
if binaryvar != "" && flagsvar != "" {
178+
SetFlags(binaryvar, flagsvar)
179+
} else {
180+
fmt.Printf("Reading config from: %s\n", configvar)
181+
data, err := ReadConfig(configvar)
182+
if err != nil {
183+
log.Fatal(err)
184+
}
185+
SetFlagsFromConfig(data)
186+
}
187+
}

0 commit comments

Comments
 (0)