diff options
author | Xin Ouyang <Xin.Ouyang@windriver.com> | 2013-09-23 21:18:05 +0800 |
---|---|---|
committer | Joe MacDonald <joe@deserted.net> | 2013-10-02 13:24:45 -0400 |
commit | 521ca9c9cf370840e9f8c808a7955aa5da7c356e (patch) | |
tree | d8883798d9ef8e7a0b86ac1958e322053e8f6574 /recipes-core | |
parent | 20153c8810cecc31873fbe14bb1695a85b77cef4 (diff) | |
download | meta-selinux-521ca9c9cf370840e9f8c808a7955aa5da7c356e.tar.gz |
busybox: alternatives link to sh wrappers for commands
While directly using busybox[.[no]suid] as the alternatives'
targets, commands could not get correct security labels.
~# ls -l /sbin/getty
..... /sbin/getty -> /bin/busybox.nosuid
~# ls -Z /bin/busybox.nosuid
system_u:object_r:bin_t:s0 /bin/busybox.nosuid
Add sh wrappers for commands so selinux could work fine.
~# ls -l /sbin/getty
..... /sbin/getty -> /usr/lib/busybox/sbin/getty
~# ls -Z /usr/lib/busybox/sbin/getty
system_u:object_r:getty_exec_t:s0 /usr/lib/busybox/sbin/getty
~# cat /usr/lib/busybox/sbin/getty
#!/bin/busybox.nosuid
Signed-off-by: Xin Ouyang <Xin.Ouyang@windriver.com>
Signed-off-by: Joe MacDonald <joe@deserted.net>
Diffstat (limited to 'recipes-core')
-rw-r--r-- | recipes-core/busybox/busybox_1.21.1.bbappend | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/recipes-core/busybox/busybox_1.21.1.bbappend b/recipes-core/busybox/busybox_1.21.1.bbappend new file mode 100644 index 0000000..b4935b2 --- /dev/null +++ b/recipes-core/busybox/busybox_1.21.1.bbappend | |||
@@ -0,0 +1,87 @@ | |||
1 | PR .= ".1" | ||
2 | |||
3 | FILES_${PN} += "${libdir}/${PN}" | ||
4 | |||
5 | # We should use sh wrappers instead of links so the commands could get correct | ||
6 | # security labels | ||
7 | python create_sh_wrapper_reset_alternative_vars () { | ||
8 | # We need to load the full set of busybox provides from the /etc/busybox.links | ||
9 | # Use this to see the update-alternatives with the right information | ||
10 | |||
11 | dvar = d.getVar('D', True) | ||
12 | pn = d.getVar('PN', True) | ||
13 | |||
14 | def create_sh_alternative_vars(links, target, mode): | ||
15 | import shutil | ||
16 | # Create sh wrapper template | ||
17 | fwp = open("busybox_wrapper", 'w') | ||
18 | fwp.write("#!%s" % (target)) | ||
19 | os.fchmod(fwp.fileno(), mode) | ||
20 | fwp.close() | ||
21 | # Install the sh wrappers and alternatives reset to link to them | ||
22 | wpdir = os.path.join(d.getVar('libdir', True), pn) | ||
23 | wpdir_dest = '%s%s' % (dvar, wpdir) | ||
24 | if not os.path.exists(wpdir_dest): | ||
25 | os.makedirs(wpdir_dest) | ||
26 | f = open('%s%s' % (dvar, links), 'r') | ||
27 | for alt_link_name in f: | ||
28 | alt_link_name = alt_link_name.strip() | ||
29 | alt_name = os.path.basename(alt_link_name) | ||
30 | # Copy script wrapper to wp_path | ||
31 | alt_wppath = '%s%s' % (wpdir, alt_link_name) | ||
32 | alt_wppath_dest = '%s%s' % (wpdir_dest, alt_link_name) | ||
33 | alt_wpdir_dest = os.path.dirname(alt_wppath_dest) | ||
34 | if not os.path.exists(alt_wpdir_dest): | ||
35 | os.makedirs(alt_wpdir_dest) | ||
36 | shutil.copy2("busybox_wrapper", alt_wppath_dest) | ||
37 | # Re-set alternatives | ||
38 | # Match coreutils | ||
39 | if alt_name == '[': | ||
40 | alt_name = 'lbracket' | ||
41 | d.appendVar('ALTERNATIVE_%s' % (pn), ' ' + alt_name) | ||
42 | d.setVarFlag('ALTERNATIVE_LINK_NAME', alt_name, alt_link_name) | ||
43 | if os.path.exists(alt_wppath_dest): | ||
44 | d.setVarFlag('ALTERNATIVE_TARGET', alt_name, alt_wppath) | ||
45 | f.close() | ||
46 | |||
47 | os.remove("busybox_wrapper") | ||
48 | return | ||
49 | |||
50 | if os.path.exists('%s/etc/busybox.links' % (dvar)): | ||
51 | create_sh_alternative_vars("/etc/busybox.links", "/bin/busybox", 0o0755) | ||
52 | else: | ||
53 | create_sh_alternative_vars("/etc/busybox.links.nosuid", "/bin/busybox.nosuid", 0o0755) | ||
54 | create_sh_alternative_vars("/etc/busybox.links.suid", "/bin/busybox.suid", 0o4755) | ||
55 | } | ||
56 | |||
57 | # Add to PACKAGEBUILDPKGD so it could override the alternatives, which are set in | ||
58 | # do_package_prepend() section of busybox_*.bb. | ||
59 | PACKAGEBUILDPKGD_prepend = "create_sh_wrapper_reset_alternative_vars " | ||
60 | |||
61 | # Use sh wrappers instead of links | ||
62 | pkg_postinst_${PN} () { | ||
63 | # This part of code is dedicated to the on target upgrade problem. | ||
64 | # It's known that if we don't make appropriate symlinks before update-alternatives calls, | ||
65 | # there will be errors indicating missing commands such as 'sed'. | ||
66 | # These symlinks will later be updated by update-alternatives calls. | ||
67 | test -n 2 > /dev/null || alias test='busybox test' | ||
68 | if test "x$D" = "x"; then | ||
69 | # Remove busybox.nosuid if it's a symlink, because this situation indicates | ||
70 | # that we're installing or upgrading to a one-binary busybox. | ||
71 | if test -h /bin/busybox.nosuid; then | ||
72 | rm -f /bin/busybox.nosuid | ||
73 | fi | ||
74 | for suffix in "" ".nosuid" ".suid"; do | ||
75 | if test -e /etc/busybox.links$suffix; then | ||
76 | while read link; do | ||
77 | if test ! -e "$link"; then | ||
78 | # we can use busybox here because even if we are using splitted busybox | ||
79 | # we've made a symlink from /bin/busybox to /bin/busybox.nosuid. | ||
80 | busybox echo "#!/bin/busybox$suffix" > $link | ||
81 | fi | ||
82 | done < /etc/busybox.links$suffix | ||
83 | fi | ||
84 | done | ||
85 | fi | ||
86 | } | ||
87 | |||